Raspberrypi3で簡単なデバイスドライバを作ってみる
以下は全てRaspberrypi上で行う
ソースコードを作る
kernel_module.c
#include <linux/module.h>
#include <linux/init.h>
static int device_init(void)
{
printk(KERN_ALERT "Hello Linux kernel ^o^/ \n");
return 0;
}
static void device_exit(void)
{
printk(KERN_ALERT "GoodBye Linux kernel \n");
}
module_init(device_init);
module_exit(device_exit);
MODULE_DESCRIPTION("Tutolial kernel module"); //デバイスドライバの簡単な説明を入れる。入れなくてもソースとして問題なし
MODULE_AUTHOR("your name");
MODULE_LICENSE("GPL v2");
makefileを作る
KERNEL_HEADERS=/lib/modules/$(shell uname -r)/build
obj-m := kernel_module.o
all:
$(MAKE) -C $(KERNEL_HEADERS) M=$(shell pwd) modules
clean:
$(MAKE) -C $(KERNEL_HEADERS) M=$(shell pwd) clean
linuxのカーネルソースをダウンロードする
Raspbian用のLinxuカーネルソースをダウンロードするための「rpi-source」コマンドのソースをダウンロードしインストールする。「rpi-source」を実行すると自動でカーネルソースがダウンロードされる。以下が手順である
pi@raspberrypi:~/kernel-module $ sudo apt-get install bc
pi@raspberrypi:~/kernel-module $ sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source
pi@raspberrypi:~/kernel-module $ sudo chmod +x /usr/bin/rpi-source
pi@raspberrypi:~/kernel-module $ sudo /usr/bin/rpi-source -q --tag-update
pi@raspberrypi:~/kernel-module $ sudo rpi-source
コンパイルする
pi@raspberrypi:~/kernel-module $ sudo make
make -C /lib/modules/4.9.35-v7+/build M=/home/pi/ko modules
make[1]: Entering directory '/root/linux-be2540e540f5442d7b372208787fb64100af0c54'
CC [M] /home/pi/kernel-module/device_drv.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/pi/kernel-module/device_drv.mod.o
LD [M] /home/pi/kernel-module/device_drv.ko
make[1]: Leaving directory '/root/linux-be2540e540f5442d7b372208787fb64100af0c54'
出来ているか確認する。デバイスドライバの拡張子はkoである
pi@raspberrypi:~/kernel-module $ ls
Makefile kernel_module.ko kernel_module.o
Module.symvers kernel_module.mod.c make.log
kernel_module.c kernel_module.mod.o modules.order
カーネルに組み込む
pi@raspberrypi:~/kernel-module $ sudo insmod kernel_module.ko
問題なければ何も表示されない
カーネルにロードされたか確認する
pi@raspberrypi:~/ko $ lsmod
Module Size Used by
kernel_module 1086 0
・
・
・
表示されたので確認できた
pi@raspberrypi:~/ko $ dmesg | tail -2
[ 3106.470423] End.. Test Device
[ 3108.859836] Hello linux kernel ^o^
削除する
pi@raspberrypi:~/ko $ sudo rmmod kernel_module
pi@raspberrypi:~/ko $ dmesg | tail -2
[ 3108.859836] Hello linux kernel ^o^
[ 3194.654974] Goodbye Linux kernel
おしまい