2017/07/29

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

動かんシリーズの1~10で、PetaLinux v2017.2を載せたZyboのJEコネクタに接続した7セグLEDを制御できるようになった。

PetaLinuxがよいのか、というのは難しいところだ。
できれば、Ubuntuみたいにセキュリティアップデートを動的に行いやすいディストリビューションの方がよいのかもしれない。
メーカーが、売った人を追跡できるような規模であれば、営業さんにアップデートしてもらうという作戦もあるのかもしれんが、そうもいかんだろうしねぇ。
みんなどうしてるんだろう?


さて、まずはデバイスファイルから解決しよう。

以前、NXPのOM5578をRaspberry Piで動かそうとしたときに、ドライバのエラーが出て/devにファイルが作られないということがあった。
だから、自分でmknodしたり、あらかじめrootfsに仕込んだりせず、ドライバが自分でデイバスファイルを作ることができるのだと思う。


あー、udevというものがあったな・・・。
PetaLinuxでもudevを使っているのだろうか?

Starting udev
udevd[725]: starting version 3.2

あるのね。

私が持っている『Linuxデバイスドライバプログラミング』では、ドライバのクラス登録と、/sys/class配下にドライバ情報を作る作業を行うらしい。


もしかしたら、テンプレートで作ったソースファイルだとやってくれているかもしれない、と思ってディレクトリを見ていると、<project_name>/project-spec/meta-user/recipes-apps/gpio-demoというフォルダがあることに気付いた。
こんなアプリ追加してないんですけど。。。

ネットで検索すると、echoで書込むことによってLEDが光るらしい。
えんべでっどログ: ZYNQのMIO GPIOをLinuxから使う

# echo 913 > /sys/class/gpio/export
# echo out > gpio913/direction
# echo 1 > gpio913/value

お、MIO7のLED(LD4)が点灯した。
0を書込むと消灯する。

デバイスファイルを使わずにアクセスすることもできる、ということか。
そういえば、Raspberry Piも同じようなものがあったな。


このドライバは、./build/tmp/work-shared/plnx_arm/kernel-source/drivers/gpio/gpio-zynq.cのようだ。

本によると、class_create()やclass_device_create()を使うようなのだが・・・このソースには使われていなかった。
もう9年くらい前の本だから、時代が変わったのだろうか?
あるいは、kernelの組込みドライバだから、別のしくみがあるのだろうか。
なんとなく、後者である気がするのだが、深入りはやめておこう。


ただ、デバイスツリーも気になっているのだ。
あれは、デバイスの情報を取ってくることができないので、代わりに別バイナリにしたとか、そんな話だったと思う。
Raspberry Piで見たとき、デバイスツリーの情報からmknodしている箇所があったような気がするのだが、他のと記憶が混ざっている気もする。
この本では、まだデバイスツリーが登場する前なので、関連があるともないともわからない。
うーむ。


まあ、本の通りやってみよう。

やってみたのだが、class_device_create()が未定義と言われる。
includeが足りないのかと思ったら、廃止になったのか・・・。
driver - Linux function class_device_create changed to? - Stack Overflow

device_create()になったらしいが、なかなかつらいな。
サイトにはサンプルも更新されているようなので、そちらを見た方が良いのかも。
SBクリエイティブ:Linuxデバイスドライバプログラミング


とりあえずdevice_create()にするとビルドできた。
insmodすると、/devにファイルができてる。
おお!

・・・しかし、リダイレクトで書込むとエラーになった。

-sh: /dev/zybo_gpio32: No such device or address

lsで見ると、majorは244でいいんだけど、前回mknodしたときのminorは24だったのだ。

# ls -l /dev/zybo_gpio32
crw-------    1 root     root      244,  32 Jul 29 08:58 /dev/zybo_gpio32

まあ、これは元のソースが32になっていたから、仕方ないのかな?

24に変更して、ビルドし直す。
insmodして、echoして・・・ダメだ、同じエラーだ。

# ls -l /dev/zybo_gpio24
crw-------    1 root     root      244,  24 Jul 29 09:09 /dev/zybo_gpio24

/sys/class/zybo_gpio/zybo_gpio24はできているんだけどねぇ。

# cat /sys/class/zybo_gpio/zybo_gpio24/uevent
MAJOR=244
MINOR=24
DEVNAME=zybo_gpio24

続きは、また明日だ。

0 件のコメント:

コメントを投稿

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

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