2017/07/27

[zybo]PetaLinuxでDigilentのチュートリアルが動かん (10)

前回までで、ようやくここまで来た。

  • Vivado v2017.2でGPIOを7本有効にする
  • XSDK v2017.2で何かする(この工程はいるのか?)
  • hdfファイル一式をPetaLinux v2017.2に持っていって、user moduleを追加してビルドし、mknod, insmodして動かす


user moduleがビルドできずに悩んでいたのは、petalinuxで追加したmoduleのテンプレートにあったREADMEを読んだからだということに気付いた。

To compile and install your module to the target file system copy on the host,
simply run the
     "petlainux-build -c kernel" to build kernel first, and then run
     "petalinux-build -c rootfs/led8drv" to build the module
command.

-cで、rootfsとled8drvをそれぞれやりなさい、ということかもしれんが、わからんよ。。。


あとは、ドライバをいじるところをやれば、多少は理解できるんじゃなかろうか。


Linuxのドライバは、

  • open
  • close
  • read
  • write
  • ioctl

でできているはずだ。
ioctl()って逃げよねぇ、と思いつつも、他に手段が思いつかないので、便利に使っている。


Interface誌のダウンロードから持ってきたファイルを見ておこう。
closeではなくreleaseという名前になっているし、ioctlはないが、基本的にはこういう構成になるだろう。
プレフィクスが"char_"なのは、キャラクタ型ドライバだからか。
確か、ブロック型とキャラクタ型があって、ASCII社の本で簡単な区別方法を読んだ気がするが、探し出せなかった。
ブロック転送しないものはすべてキャラクタ型だ、とか、そんなだったような。


私だとioctl()でやってしまいそうだけど、ここはchar_write()で書込処理を行っている。
利点は、Linuxコマンドと組み合わせやすい、というところか。
ioctl()だと、ソース書かないと動かせない気がする。

今は、書き込んだデータがASCIIコードでそのまま吐き出されているのだが、条件は簡単で、

    • 1byte目が'0'
    • 2byte目が'x'
    • データ数は3より大きい

だった場合、3byte目をiowrite32()で書込んでいるだけのようだ。


では、簡単に書き換えて、ビルドし直してみよう。
やはり、echoした数字をそのまま表示させたい。

なんとなくカルノ図を描いたりする気がしたのだが、Linuxから見ると数字を変換してポートに書込むだけなので、変換テーブルしかいらなかった。

image

アノードが共通なやつを使っているから、0で点灯するのだ。
大ざっぱだが、こういう感じの修正になった。

    unsigned int val;
    const unsigned int VAL[] = {
        0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10
    };

    if (('0' <= k_buf[2]) && (k_buf[2] <= '9')) {
        printk("WRITE %02x\n", (unsigned char)VAL[k_buf[2] - '0']);
        iowrite32( VAL[k_buf[2] - '0'], cookie);
    }


ドライバの差し替えは、これでよいのかな?

$ petalinux-build -c led8drv
$ petalinux-build -x package

やるのは、ドライバのコンパイル・リンクと、rootfsへのコピーおよびUboot形式への変更だけなんだけど、あれこれやってるから時間がかかるな。。。

# mknod -m 666 /dev/zybo_led c 244 24
# insmod /lib/modules/4.9.0-xilinx-v2017.2/extra/zybo_gpio.ko
# echo 0x1 > /dev/zybo_led

うん、期待通りに点灯した。


mknodを毎回やるのはめんどうなので、何とかしたいところだ。
Raspberry Piでは、Device Treeに書いておけばudevか何かが自動的にmknodしていたように思うが、PetaLinuxはどうやるんだろう?

そういうのは、次回だ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。