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