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

Shin-ya Koga email@hidden
2008年 7月 21日 (月) 11:15:36 JST


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

email@hiddenユーザさん([Armadillo:03169]):
>  Armadillo:03111関連で、LinuxのCプログラムから直接レジスタをアクセス
>  してみたいと思い、試しているのですが...、ことごとくSegmentation faultします。
>  
>  単純に、	
>    unsigned int i ;
>    i = (*(unsigned int *)アドレス ;
>  でリードすることは出来ないのでしょうか?
>  色々と見ていると出来そうな雰囲気が在ったのですが。
>  一応、プログラムの実行は一般ユーザとrootの両方で試しています。
>  なにか、お作法があるのでしょうか?
> 
>  アドレスは、一つはGPIO PORTCにアクセスしたいので、ハードマニュアルの
>    表 9-2  GPIO レジスタマップ のData Register とData Direction Register 
>  の0xFF840008と0xFF840018を試しました。

このアドレスを直接指定しても駄目です。ユーザランドからの
アクセスでは、/dev/mem デバイスをオープンして、アクセス
したいアドレス範囲を mmap() する必要があります。これにより、
ユーザランド側の仮想アドレスからカーネル側のアドレスへの
変換が行われます。
/dev/mem & mmap() を使って I/O アクセスする例は、たとえば
 http://www.si-linux.co.jp/wiki/cat/index.php?UserLandIO
が参考になるんじゃないかと思います。
 http://www.mech.tohoku-gakuin.ac.jp/rde/contents/linux/drivers/nodriver.html
の後半(「メモリの読み書き」)も同様ですね。

# 上記ページのコード例では、/dev/mem を open() する際、
# O_RDWR や O_RDONLY しか指定していませんが、マップする範囲
# のキャッシュを無効にするために、O_SYNC も指定するのがより
# 確実ではないかと思います。

なお、Armadillo-2x0 であれば、GPIO アクセスに特化した /dev/gpio
デバイスを使えます。こいつをオープンして、ep93xx_gpio.h で定義
されている ep93xx_gpio_ioctl_data 構造体のメンバに適切な値を
セットしたものをパラメータとして ioctl() してやると、GPIO ポート
にアクセスできます・・・もしかすると、現状の最新版では、少し
インタフェースが変わっているかも知れませんので、ディストリ
ビューションの内容を確認してみて下さい。

>  ところで、Data Register とData Direction Register の違いはなんでしょうか??

Data Register は、データの入出力用、Data Directio Register
は、データ入出力の *方向* を指定するレジスタですね(※名前の
通りです)。

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



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