FC2ブログ

[RPi]Linuxデバドラ

使ってるのはたぶんラズパイ2.
# uname -a

Linux rp2 4.4.38-v7+ #938 SMP Thu Dec 15 15:22:21 GMT 2016 armv7l armv7l armv7l GNU/Linux


# cat /etc/issue

Ubuntu 16.04.2 LTS \n \l




参照先の記事作成者に感謝。


組み込みLinuxデバイスドライバの作り方 (1)

https://qiita.com/take-iwiw/items/1fdd2e0faaaa868a2db2

# sudo apt-get install raspberrypi-kernel-headers

# vi MyModule.c

#include

static int test_init(void)
{
printk("Hello my module\n");
return 0;
}

static void test_exit(void)
{
printk("Bye bye my module\n");
}

module_init(test_init);
module_exit(test_exit);



# vi Makefile

CFILES = MyModule.c

obj-m := MyModule.o
MyModule-objs := $(CFILES:.c=.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
# sudo insmod MyModule.ko
# sudo rmmod MyModule.ko
# dmesg


[ 3088.36446 ] Hello my module
[ 3142.463604 ] Bye bye module



確かにモジュールのロード、アンロードのメッセージが出てた。



組み込みLinuxデバイスドライバの作り方 (2)

https://qiita.com/take-iwiw/items/580ec7db2e88beeac3de

# vi Makefile

CFILE =MyDeviceDriver.c
obj-m:=MyDeviceDriver.o
MyDeviceDriver-objs:=$(CFILE:.c=.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


# vi MyDeviceDriver.c
 ※ 記事と同じため省略。

ビルドする。
# make
ロードする。
# sudo insmod MyDeviceModule.ko
# cat /proc/devices

1 mem
4 /dev/vc/0
5 /dev/tty
5 /dev/ptmx
5 ttyprintk
7 vcs
10 misc
13 input
14 sound
29 fb
63 MyDevice_NAME > ★ここに現れた



ユーザがアクセス出来るようにデバイスファイルを作る
# sudo mknod /dev/myDevice c 63 1
# sudo chmod 666 /dev/myDevice
# ls -lsta

0 crw-rw-rw- 1 root root 63, 1 2月 2 14:27 myDevice



シェルからWriteしてみる。
# echo "a" > /dev/myDevice
# dmesg

[ xxxx.xxxx ] myDevice_open
[ xxxx.xxxx ] myDevice_write
[ xxxx.xxxx ] myDevice_write
[ xxxx.xxxx ] myDevice_close



シェルからReadしてみる。
# cat /dev/myDevice
これを実行したら延々とAが出力された。

使い終わったら以下で削除する。
# sudo rmmod MyDeviceModule
# sudo rm /dev/myDevice



組み込みLinuxデバイスドライバの作り方 (3)

https://qiita.com/take-iwiw/items/6b02494a3668f79800e6


# vi Makefile
 ※ 記事の通り。
# vi MyDeviceDriver.c
 ※ 記事の通り。
# make
# sudo insmod MyDeviceModule.ko
実験的に3つ作成。
# sudo mknod --mode=666 /dev/mydevice0 c `grep MyDevice /proc/devices | awk '{print $1;}'` 0
# sudo mknod --mode=666 /dev/mydevice0 c `grep MyDevice /proc/devices | awk '{print $1;}'` 1
# sudo mknod --mode=666 /dev/mydevice0 c `grep MyDevice /proc/devices | awk '{print $1;}'` 2

静的な場合と同じく以下で削除。
# sudo rmmod MyDeviceDriver
# sudo rm /dev/mydevice0
# sudo rm /dev/mydevice1
# sudo rm /dev/mydevice2

ここまでで、メジャー番号の動的割り当てが出来た。
この後は、Linuxのudevの仕組みを使って、ロード(insmod)、及びデバイスファイル作成を自動化する。

# vi MyDeviceDriver.c
 ※ 記事と同じ。

これでudevにより/sys/class/mydevice/mydevice0/dev情報を基に自動的に
デバイスファイル/dev/mydevice0が作られるが、defaultでは一般ユーザのアクセス権が無い。
そこでルールファイルを作り、権限を変更してやる。

sudoでは/etc/udev/rule.d/の中をいじれないらしいのでrootになる。
# sudo -i
.ruleの前の名前は何でも良いらしい。
# echo 'KERNEL=="mydevice[0-9]*", GROUP="root", MODE="0666"' >> /etc/udev/rules.d/81-my.rules
# exit

# make

error implicit declaration of function 'class_create'


って言われた。
原因は以下が無かったから。

#include



ビルドし直してからロード。
# sudo insmod MyDeviceDriver.ko
デバイスファイルが自動で生成されたか確かめる。
# ls -lsta /dev/my*

0 crw-rw-rw- 1 root root 242, 0 2月 2 16:36 /dev/mydevice0
0 crw-rw-rw- 1 root root 242, 1 2月 2 16:36 /dev/mydevice1


メジャー番号242、マイナー番号0/1でmydevice0/1が生成されてる。

さらにデバイス情報のファイルが以下にあった。
# cat /sys/class/mydevice/mydevice0/dev

242:0

# cat /sys/class/mydevice/mydevice0/uevent

MAJOR=242
MINOR=0
DEVNAME=mydevice0





組み込みLinuxデバイスドライバの作り方 (4)

https://qiita.com/take-iwiw/items/26d5f7f4894ccc4ce227

ラズパイのメモリ空間が上記記事に添付されてる。



I2Cデバイスドライバ作成トライ

https://www.kernel.org/doc/Documentation/i2c/dev-interface

それぞれのI2Cアダプタは0から連番の番号を割り振られる。以下いずれかの方法で確認出来る。
# ls -lst /sys/class/i2c-dev/*

0 lrwxrwxrwx 1 root root 0 2月 17 14:18 i2c-1 -> ../../devices/platform/soc/3f804000.i2c/i2c-1/i2c-dev/i2c-1



# i2cdetect -l

i2c-1 i2c 3f804000.i2c I2C adapter




#include
#include

int file;
int adapter_nr = 2; /* probably dynamically determined */
char filename[20];

snprintf(filename, 19, "/dev/i2c-1", adapter_nr);
file = open(filename, O_RDWR);
if (file < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
exit(1);
}

int addr = 0x40; /* The I2C address */

if (ioctl(file, I2C_SLAVE, addr) < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
exit(1);
}

スポンサーサイト



コメントの投稿

非公開コメント

カレンダー
12 | 2020/01 | 02
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード