ええと、以下な二種類の方法がある模様。
- sysfs を使う
- レジスタを mmap して直接書き込む
とりあえず sysfs について確認してみました。まず抵抗とか LED なんかをブレッドボードに取り付けて #1 な PIN と GND を接続しておきます。
あとは以下で LED が点灯。
$ sudo echo 18 > /sys/class/gpio/export $ ls /sys/class/gpio export gpio18 gpiochip0 unexport $ sudo echo out > /sys/class/gpio/gpio18/direction $ sudo echo 1 > /sys/class/gpio/gpio18/value
消灯は以下。
$ sudo echo 0 > /sys/class/gpio/gpio18/value
これは非常にお手軽ですね。C の実装例が elinux.org に出てます。
ちなみにレジスタ直接、というのは以下。
とりあえず確認
BCM2835 ARM Peripherals な PDF によれば I/O Peripherals な base address は 0x20000000 になっています。また、GPIO は base address に 0x200000 を加えた値になっているのが分かります。
ここまで分かっていれば mmap と /dev/mem を使って map なソレが取得できる模様。
あとは
- GPFSEL? を操作する INP_GPIO とか OUT_GPIO なマクロ
- GPSET0 レジスタなアドレスを提供する GPIO_SET なマクロ
- GPCLR0 レジスタなアドレスを提供する GPIO_CLR なマクロ
を使ってもごもご、という事になるのか。とりあえず両方実装して動作確認してみます。