blog画像が表示されないページは、元画像を間違えて削除してしまっているためです。データが残っていないので、想像力で補ってください。(16)久しぶりすぎて、内容を覚えていない・・・。前回は、GPIOのアドレス定義が自動生成されたxparameters.hに載っていることがわかった、というところまでだった。何をしていたかというと、Linuxのデバイスドライバを作る際、どのアドレスを操作すればよいのかを調べていたのだ。今見ているのは、これ。http://www.cqpub.co.jp/interface/download/2016/4/IF1604Z.zipInterface誌のサンプルをちょっと変更した程度のものだ。GPIOのアドレスは、gpio_table[]を使っている。動かん(14)のときにどれを使っているのか計算しているが、mknodしたのが24なのでgpio_table[3]ということだ。./components/plnx_workspace/fsbl_bsp/ps7_cortexa9_0/include/xparameters.hを見ると、こういう行があった。0まず、MAP_BASE_ADDRの根拠はわかった。zybo_gpio.cでは固定値なので、このアドレスも求める方法があるのだろうが、まあ、よかろう。制御しているのはZYBOのJEコネクタで、0x41210000から1KBをioremap()し、32bitを書込むようにしている。ああ、こういう定義が近くにあった。Designを見ると、GPIO類はこうなっていた。この名前が、そのままマクロ定義になるのか。mknodするminor番号だが、zybo_gpio.cではビットを表していたのか。LEDだから、16~23だとエラーなのか。ビットシフトを3つやってるのも、8bit単位で何番目かを割り出すという意味なのだろう。読み書きの方向についてはminorのb4を使っているが、0~15はINPUTだから使っただけか。LEDでもスイッチでもいけるように、GPIO_BUFFという構造体を用意して、そこに情報を突っ込み、あとはシステムコールで呼び出されたらそれを使うだけ、ということにしたかったのだろう。ioremap()は、物理メモリをアクセスする準備みたいなもののようだ。JapanMMUもあるし、こういうやり方になるのか。戻り値をそのまま使ってよいわけではなく、readb/w/l()、writeb/w/l()を介してアクセスするそうだ。iowrite32()を使っているので、ビット幅で指定するタイプもあるのか。Drivers第3版の元ページ?のようだが、readb()などのタイプはolderと書いてある。ビット幅の方がわかりやすいわね。ioremap()だが、終わったらiounmap()しなくてよいのだろうか?なんとなく、close()時にやった方が良い気がする。Linuxデバイスドライバのお作法がわかっていないので、基本的なところは抑えた方がよさそうだ。件のコメント:コメントを投稿コメントありがとうございます。申し訳ないですが勝手に削除することもあります。コメントを投稿できるのは、このブログのメンバーだけです。