FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

yuki-sato.comの「LinuxからFPGAを使ってみる」をやってみる (ZedBoard版 #9)

さて、前回までで、devmem2を使って自作IP(LED点灯制御回路)にアクセスできるところまで確認した。

今回は、Linux上で動作するドライバを作成して、devmem2を使わずにアクセス、さらにはユーザアプリケーションからアクセスする方法を試行する。

myLEDを制御するためのドライバ作成

下記のページを参照して、myLEDを制御するためのmyled.cを作成し、コンパイルする。

yuki-sato.com

github.com

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を作成し、今回動作させるLinuxlinux-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

f:id:msyksphinz:20170531002947p:plain

/proc/myledが作成されたので、ledを制御してみよう。

echo 0xf > /proc/myled
echo 0x3 > /proc/myled

これでLEDを制御可能になることを確認した。

f:id:msyksphinz:20170530012742p:plain

次はいよいよユーザアプリケーションの作成だ。

関連記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com