dnackのブログ

コード書く仕事の間にコード書いてる知命目前のおっさんです。

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");

なんもしてないので、説明は省きますねー。

Makefile

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.

めでたしめでたし。 というわけでドライバ書く準備できたので、次から本気出す。 次はいつになるんだろうなぁ。。