[Armadillo:03172] Re: linux からレジスタ(GPIO PORTC等)にアクセスするには?

Shin-ya Koga email@hidden
2008年 7月 21日 (月) 14:29:44 JST


サムシングプレシャスの古賀です。

fjsrさん([Armadillo:03171]):
>>>アドレスは、一つはGPIO PORTCにアクセスしたいので、ハードマニュアルの
>>>   表 9-2  GPIO レジスタマップ のData Register とData Direction Register 
>>>の0xFF840008と0xFF840018を試しました。
>>
>>このアドレスを直接指定しても駄目です。ユーザランドからの
>
>Linux使用時の論理レジスタマップとあったので、使えるのか?と思ったのですが..

このアドレス範囲は、ユーザランド(ユーザプロセス)からは
アクセスできないのです。当該マップのアドレス範囲は、
0xC0000000 以降の領域、つまり 4GByte のアドレス空間中の
上位 1GByte ですが、ここは Linux のカーネル空間であり、
ユーザプロセスからアクセスすると、例外が発生します。

このあたりについては、たとえば
 http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93
 http://www-online.kek.jp/~yasu/Kenshu/linux-virtual-address.html
 http://www.nabe.bne.jp/linux/kernel-space.html
あたりが参考になるんじゃないかと思います。

>>アクセスでは、/dev/mem デバイスをオープンして、アクセス
>>したいアドレス範囲を mmap() する必要があります。これにより、
>>ユーザランド側の仮想アドレスからカーネル側のアドレスへの
>>変換が行われます。
…
>参考にして、試したら、それらしい値を読み込めました。
>ただ、上記の方法で使用したアドレスは物理レジスタマップで80で始まるアド
>レスです。

/dev/mem & mmap() で得られたアドレスは、ユーザアドレス空間
に所属していますので、それと「物理レジスタマップ」の値を
比較することには、意味がありません。所属している空間が異な
るからです。

言い換えると、/dev/mem & mmap() の働きにより、カーネル側の
アドレス範囲が、ユーザプロセスからアクセス可能なアドレス
範囲に対応づけられる、ということなのです。

>「Linux使用時の論理レジスタマップ」はどう使うのでしょうかね?
>マニュアルに載っているので、ちょっと気になります。^^;;

このアドレスは、カーネル側で動くモジュール、つまりデバイス
ドライバからアクセスする場合に使います。

--
古賀信哉 (株)サムシングプレシャス



armadillo メーリングリストの案内