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

email@hidden
2008年 7月 21日 (月) 13:20:37 JST


サムシングプレシャス 古賀様

  fjsrです。
  ありがとうございます。参考になりました。
  
Shin-ya Koga <email@hidden> wrote:
> サムシングプレシャスの古賀です。
> 
> 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を試しました。
> 
> このアドレスを直接指定しても駄目です。ユーザランドからの

Linux使用時の論理レジスタマップとあったので、使えるのか?と思ったのですが..

> アクセスでは、/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 も指定するのがより
> # 確実ではないかと思います。

参考にして、試したら、それらしい値を読み込めました。
ただ、上記の方法で使用したアドレスは物理レジスタマップで80で始まるアド
レスです。

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

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

最初はledctlを参考にしようと思ったのですが、上記と同じ様にに、デバイス
を使っていてチョッと面倒そうだったのと、クロック関連のClkSet1レジスタ
にアクセスしたかったので、止めて、安易?なダイレクトアクセスな方向とな
りました。^^;;;

> >  ところで、Data Register とData Direction Register の違いはなんでしょうか??
> 
> Data Register は、データの入出力用、Data Directio Register
> は、データ入出力の *方向* を指定するレジスタですね(※名前の
> 通りです)。

ふむ、勉強になりました。

#ふ、しかし先は長そうだ、クロック変更とVGAの停止。




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