Raspberry Pi:GPIOをたたこう(準備編)
Raspberry Pi買ったからにはGPIO叩きたいよね。 PythonだとRPi.GPIOがいい感じなんだけど、C言語だとWiringPiが開発中止になってC言語で使えるいい感じのがみつからない。 WiringPiの開発者がフリーライドとサポートの教養で嫌気がさしたんだとか。 まあ、あれだ。オープンソースの貢献者への感謝と敬意は忘れちゃいけない。 そういう人々の無償の貢献あってこそのソフトウェア技術なわけで。
まあそれはさておき、なくなったものは仕方ないわけで、 まあ、どっかから探してくることもできるだろうし、代替のものもいくつかあるんだけど、 そもそもGPIO制御レジスタの仕様はSoCのデータシート見れば書いてあるんだからレジスタ叩けばいいよね。 でもユーザ空間からレジスタ叩くのもなんかだってだってなんだもんって感じなので勉強がてらドライバ書きますかね。 となってこのエントリができる運びとなる。
もっと手っ取り早く、RPi.GPIOのソースとってきて"c_gpio.h"をincludeしちゃえば、C版のRPi.GPIOみたいに使えそうな気はして、それはそれで試したい気もするのだけど。それはまた今度気が向いたら。
kernel-header のインストール
$sudo apt-get install raspberrypi-kernel-headers
の後再起動。
再起動後にカーネルバージョンもヘッダのバージョンに変わる。
再起動しないで作業すると、カーネルのバージョンとヘッダのバージョンが合わなくて、 作ったモジュールがロードできなくて困る。
ビルド
ホームの下にsourceとでもディレクトリを掘って、その下で次の2つのファイルを作る。
test.c
#include <linux/module.h> static int load_module(void) { printk("load test module.\n"); return 0; } static void unload_module(void) { printk("unload test module.\n"); } module_init(load_module); module_exit(unload_module); MODULE_LICENSE("Dual MIT/GPL");
なんもしてないので、説明は省きますねー。
obj-m += test.o all: make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
これを書いたら、makeしちゃおう。
dnack@raspberrypi:~/source $ make make -C /lib/modules/5.10.60-v7l+/build M=/home/dnack/source modules make[1]: ディレクトリ '/usr/src/linux-headers-5.10.60-v7l+' に入ります CC [M] /home/dnack/source/test.o MODPOST /home/dnack/source/Module.symvers CC [M] /home/dnack/source/test.mod.o LD [M] /home/dnack/source/test.ko make[1]: ディレクトリ '/usr/src/linux-headers-5.10.60-v7l+' から出ます
ロード
無事makeできてtest.koもできたようなので、ロードしてみる。
dnack@raspberrypi:~/source $ sudo insmod test.ko dnack@raspberrypi:~/source $ sudo rmmod test.ko
何もしていないドライバなので何も起きないが、 dmesgでちゃんとprintkで書いた内容が書かれているのでちゃんと動いていそうなことがわかる。
dnack@raspberrypi:~/source $ dmesg [ 4006.636317] load test module. [ 4009.320525] unload test module.
めでたしめでたし。 というわけでドライバ書く準備できたので、次から本気出す。 次はいつになるんだろうなぁ。。