前回までで、ようやくここまで来た。
- 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から見ると数字を変換してポートに書込むだけなので、変換テーブルしかいらなかった。
アノードが共通なやつを使っているから、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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。