[Suzaku:00325] Re: io_block_mapping と ioremap について
Yasushi SHOJI
email@hidden
2005年 6月 17日 (金) 13:25:13 JST
At Fri, 17 Jun 2005 00:54:55 +0900,
Masaki Minobe wrote:
> > outl(writelの方が良いかも; outは x86系の instructionから取られた名前な
> > ので; まぁ同じなんですけどね)は32bit用なので、coreが 32bitに対応してい
> > れば動くかと思います。
> >
> > access errorってことは、メモリー保護違反ですか?
> はい,メモリー保護違反です.コア自体は32bit対応しています.
> outlではioremapした後する前,両方とも引っかかります.
丁度 svで ioremap()を使って driverを書いている人がいたので聞いてみたの
ですが、ここではちゃんと動いているようです。
失敗する sample codeを貰うことはできますか?
> > > モジュール作成する時はioremapを使ってwritelなどで出力するのでしょうか?
> >
> > そうですね。ioremapで mapしてから readlや writelなどを使います。
> ドライバでコアにアクセスするにはioremapが基本という事ですか.
ioremap[_nocache]が基本ということで良いのではないでしょうか?
> > 2.6系では readw_be()など big-endian用の access methodも用意されたので
> > すが、2.4系ではまだ混乱状態のままです。2.4系では raw_readw()など raw_
> > 系のものを使ってください。
> あー<asm/io.h>にある,out_le32とかのleはLittleEndianを表していたのですか.
> 全く気づきませんでしたw.
> つまり2.4系ではraw_系のものを使えばBigEndianとしてSwapせずに入出力できる
> ということでよいでしょうか?
よいと思います。raw_系のものは include/asm-ppc/io.hで
#define __raw_readb(addr) (*(volatile unsigned char *)(addr))
#define __raw_readw(addr) (*(volatile unsigned short *)(addr))
#define __raw_readl(addr) (*(volatile unsigned int *)(addr))
#define __raw_writeb(v, addr) (*(volatile unsigned char *)(addr) = (v))
#define __raw_writew(v, addr) (*(volatile unsigned short *)(addr) = (v))
#define __raw_writel(v, addr) (*(volatile unsigned int *)(addr) = (v))
と、definされているので compileされると load/store instructionに置き換
えられると思います。sample programを作って disassembleしてみるとわかる
と思います。
--
yashi
suzaku メーリングリストの案内