[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 メーリングリストの案内