LoginSignup
5
6

More than 5 years have passed since last update.

Raspberrypi3でデバイスドライバを作る

Last updated at Posted at 2018-02-18

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 

おしまい

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6