contents
    1. 2015年03月07日(土) 関西*BSDユーザ会 第1回研究会
  1. GPIO
  2. 何故FreeBSD? NetBSDは?
  3. 最近のNetBSD(7.99.4)だと…
  4. FreeBSDでGPIO (デバイス)
    1. dmesg
  5. FreeBSDでGPIO (ユーザランド)
    1. ピン状態一覧
  6. FreeBSDでGPIO (ユーザランド): モード設定
    1. 入出力モードの設定
  7. FreeBSDでGPIO (ユーザランド): I/O
    1. 出力
    2. 入力
  8. デモ: やっぱりLチカ
  9. で、本題: MZTX-PI-EXT
  10. MZTX-PI-EXT用Linuxアプリケーション
    1. LCD表示
    2. タッチパネル
  11. FreeBSDのGPIOで簡単な描画ができるところまで実装
    1. bcm2835_new.cとして実装した関数: 6つだけ 70行ぐらい
    2. デモプログラムmztx06a.cへの変更
    3. bcm2835_new.cのソース
  12. デモ: FreeBSDでMZTX-PI-EXTを使う
  13. Future Works
    1. もう少し高速化できんのか?
    2. やっぱりXとか表示したいですよね?
    3. タッチパネルも使えるといいんですけども…

FreeBSDでRaspberry PiのGPIOを使ってみた

2015年03月07日(土) 関西*BSDユーザ会 第1回研究会

Raspberry_Pi_Logo.pngkbug-sacra-mini.png

むとうたけし@K*BUG <mutoh@610t.org>

GPIO

  • http://ja.wikipedia.org/wiki/GPIO
  • GPIO: General Purpose Input/Output (汎用入出力)
  • デジタル入出力で、入力や出力, PU,PDなどを切り替えて使うことができる

何故FreeBSD? NetBSDは?

  • /dev/memはReadonlyでしか使えない?
  • GPIOの使い方がわからない
    • dmesgには出てきていないいる
    • gpioctlはある
    • /dev/gpio* はある

最近のNetBSD(7.99.4)だと…

$ dmesg |grep gpio     
bcmgpio0 at obio0: GPIO [0...31]
gpio0 at bcmgpio0: 32 pins
bcmgpio1 at obio0: GPIO [32...53]
gpio1 at bcmgpio1: 22 pins

Why?

$ sudo /usr/sbin/gpioctl /dev/gpio0
/dev/gpio0: 0 pins
$ sudo /usr/sbin/gpioctl /dev/gpio1 
/dev/gpio1: 0 pins

FreeBSDでGPIO (デバイス)

  • 制御用デバイスは/dev/gpioc0

dmesg

mutoh@raspberry-pi:~ % dmesg
  (snip)
gpio0: <BCM2708/2835 GPIO controller> mem 0x200000-0x2000af irq 57,59,58,60 on simplebus0
gpio0: read-only pins: 46,47,48,49,50,51,52,53.
gpio0: reserved pins: 48,49,50,51,52,53.
gpioc0: <GPIO controller> on gpio0
gpiobus0: <OFW GPIO bus> on gpio0
gpioled0: <GPIO led> at pin(s) 16 on gpiobus0
iichb0: <BCM2708/2835 BSC controller> mem 0x205000-0x20501f irq 61 on simplebus0
iicbus0: <OFW I2C bus> on iichb0
iic0: <I2C generic I/O> on iicbus0
iichb1: <BCM2708/2835 BSC controller> mem 0x804000-0x80401f irq 61 on simplebus0
iicbus1: <OFW I2C bus> on iichb1
iic1: <I2C generic I/O> on iicbus1
spi0: <BCM2708/2835 SPI controller> mem 0x204000-0x20401f irq 62 on simplebus0
spibus0: <OFW SPI bus> on spi0
  (snip)

FreeBSDでGPIO (ユーザランド)

  • コマンドラインからは、gpioctlが使える
    • もちろん、C言語からioctl経由で利用できる

ピン状態一覧

mutoh@raspberry-pi:~ % sudo gpioctl -lv
  (snip)
pin 23:	0	pin 23<IN>, caps:<IN,OUT,PU,PD>
pin 24:	0	pin 24<IN>, caps:<IN,OUT,PU,PD>
pin 25:	0	pin 25<IN>, caps:<IN,OUT,PU,PD>
  (snip)
pin 45:	0	pin 45<>, caps:<IN,OUT,PU,PD>

FreeBSDでGPIO (ユーザランド): モード設定

入出力モードの設定

mutoh@raspberry-pi:~ %	sudo gpioctl -c 25 OUT
0/OUT
mutoh@raspberry-pi:~ % sudo gpioctl -lv | egrep 25
pin 25:	0	pin 25<OUT>, caps:<IN,OUT,PU,PD>
mutoh@raspberry-pi:~ % sudo gpioctl -c 23 IN
0/IN
mutoh@raspberry-pi:~ % sudo gpioctl -lv | egrep 23
pin 23:	0	pin 23<IN>, caps:<IN,OUT,PU,PD>

FreeBSDでGPIO (ユーザランド): I/O

出力

mutoh@raspberry-pi:~ % sudo gpioctl 25 0
0/25
1/0
mutoh@raspberry-pi:~ % sudo gpioctl 25 1
0/25
1/1

入力

mutoh@raspberry-pi:~ % sudo gpioctl 23
0/23
0
mutoh@raspberry-pi:~ % sudo gpioctl 23
0/23
1

デモ: やっぱりLチカ

で、本題: MZTX-PI-EXT

http://elinux.org/images/thumb/f/f5/Tontec-MZTX-PI-EXT.jpg/300px-Tontec-MZTX-PI-EXT.jpg

  • http://elinux.org/MZTX-PI-EXT
  • 2000円ぐらいで買える320x240液晶+タッチパネル
  • Raspberry Pi Type Bに just fit!!
    • B+には刺さりませんorz

MZTX-PI-EXT用Linuxアプリケーション

LCD表示

  • https://s3.amazonaws.com/tontec/24usingmanual.zip
  • /dev/memを使って、GPIOにアクセスする
  • デモプログラム: フレームバッファを読み込んで、液晶に表示する
    • bcm2835.c: BCM2708/2835 GPIO controller用ライブラリ
    • mztx06a.c: アプリケーション本体

タッチパネル

  • Xから使えるLinux用kernelモジュールがあるらしい

FreeBSDのGPIOで簡単な描画ができるところまで実装

bcm2835_new.cとして実装した関数: 6つだけ 70行ぐらい

  • int bcm2835_init()
  • void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode)
  • void bcm2835_gpio_write(uint8_t pin,uint8_t val)
    • void bcm2835_gpio_clr(uint8_t pin)
    • void bcm2835_gpio_set(uint8_t pin)
  • void bcm2835_delay(unsigned int millis)

デモプログラムmztx06a.cへの変更

  • SPIを使わないようにする(#undef BCM2708SPI)
  • LCD_WR_Data()のinlineを消す (LLVMのみ?)

bcm2835_new.cのソース

 #include "bcm2835.h"

 

int pin, val, fd;
char ctrlfile[]="/dev/gpioc0";

int bcm2835_init()
{
  if ( (fd = open(ctrlfile, O_RDONLY)) < 0 )  {
    perror("open");
    exit(1);
  }
  
  return 1;
}

void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode)
{
  struct gpio_pin gpiopin;
  
  gpiopin.gp_pin = pin;
  if(mode==BCM2835_GPIO_FSEL_OUTP)
    {
      gpiopin.gp_flags = GPIO_PIN_OUTPUT;
    } 
  if ( ioctl(fd, GPIOSETCONFIG, &gpiopin) < 0 )  {
    perror("ioctl(GPIOSETCONFIG)");
    exit(1);
  }  
}

void bcm2835_gpio_write(uint8_t pin,uint8_t val)
{
  struct gpio_req gpioreq;

  gpioreq.gp_pin = pin;
  gpioreq.gp_value = val;
  if ( ioctl(fd, GPIOSET, &gpioreq) < 0 )  {
    perror("ioctl(GPIOWRITE)");
    exit(1);
  }  
}

void bcm2835_gpio_clr(uint8_t pin)
{
  bcm2835_gpio_write(pin,0);
}

void bcm2835_gpio_set(uint8_t pin)
{
  bcm2835_gpio_write(pin,1);
}

void bcm2835_delay(unsigned int millis)
{
  struct timespec sleeper;

  sleeper.tv_sec  = (time_t)(millis / 1000);
  sleeper.tv_nsec = (long)(millis % 1000) * 1000000;
  nanosleep(&sleeper, NULL);
}

デモ: FreeBSDでMZTX-PI-EXTを使う

Future Works

もう少し高速化できんのか?

  • SPI使った方が少し高速な様子
    • しかし、SPIってなんですか?
  • やっぱり、/dev/mem経由で使う?
    • FreeBSDだと/dev/memがRead Writeで使えるみたい

やっぱりXとか表示したいですよね?

  • BSDでフレームバッファはどう使う?

タッチパネルも使えるといいんですけども…

Last modified: 2018-02-14
Post-it: New Post-it (help)

Text color: [_][_][_][_]

Background: [_][_][_][_][_][_]

Draw Line:

x: y: