さて、前回までで、devmem2を使って自作IP(LED点灯制御回路)にアクセスできるところまで確認した。
今回は、Linux上で動作するドライバを作成して、devmem2を使わずにアクセス、さらにはユーザアプリケーションからアクセスする方法を試行する。
myLEDを制御するためのドライバ作成
下記のページを参照して、myLEDを制御するためのmyled.c
を作成し、コンパイルする。
200行程度の小さなドライバだ。ここで重要なのは、前回作成したデバイスツリーに記述されているmyledのデバイス情報と、myled.c
のデバイスドライバ情報を一致させておくことだ。
これが間違っていると、ドライバをロードしてもLinuxからデバイスが見えるようにならない。
- myled.cの記述
/* device match table to match with device node in device tree */ static const struct of_device_id myled_of_match[] = { {.compatible = "xlnx,myLED-1.0"}, {}, };
- pl.dtsiの記述
myLED_0: myLED@43c00000 { compatible = "xlnx,myLED-1.0"; reg = <0x43c00000 0x10000>; xlnx,s0-axi-addr-width = <0x4>; xlnx,s0-axi-data-width = <0x20>; };
Makefileを作成し、今回動作させるLinuxのlinux-xlnxのリポジトリを参照するようにパスを調整しておく。
BUILD_DIR := $(shell pwd) obj-m := myled.o all: make -C ../../linux-xlnx/ M=$(BUILD_DIR) modules clean: make -C ../../linux-xlnx M=$(BUILD_DIR) clean
make
を実行すると、myled.ko
が作成される。これをSDカードのLinuxファイルシステムを格納しているパーティションにコピーし、再びLinuxを立ち上げる。
sudo mount /dev/sdb2/ /mnt/ZED_ROOTFS sudo cp myled.ko /mnt/ZED_ROOTFS/home/linaro sudo umount /mnt/ZED_ROOTFS
Linuxでのドライバロードと動作確認
SDカードをZedBoardに挿入してLinuxを立ち上げると、次にmyled.koをロードする。
cd /home/linaro
insmod myled.ko
myled.koの素性は以下で参照できる。起動しているカーネルと一致していることを確かめること。一致してない場合、あるいはエラーが出力された場合、/proc/myled
が作成されない。
root@linaro-developer:/home/linaro# modinfo myled.ko filename: /home/linaro/myled.ko alias: myled description: myled: MYLED driver (Simple Version) license: GPL author: Digilent, Inc. alias: of:N*T*Cxlnx,myLED-1.0C* alias: of:N*T*Cxlnx,myLED-1.0 depends: vermagic: 4.9.0-xilinx SMP preempt mod_unload modversions ARMv7 p2v8
/proc/myled
が作成されたので、ledを制御してみよう。
echo 0xf > /proc/myled echo 0x3 > /proc/myled
これでLEDを制御可能になることを確認した。
次はいよいよユーザアプリケーションの作成だ。