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