[Armadillo:06061] Re: Armadillo-300 の拡張バス EXT_INT 信号からの割込み
Masahiro Hanada
email@hidden
2010年 11月 2日 (火) 16:44:03 JST
花田です。
# すみません、さっき間違って途中で送ってしまいました。
> 上記のようにアクセス方法が分かれているのは何故なのでしょうか?
> 例えばIO Control Reg.に関してもLinux上の仮想アドレスが
> HW仕様書に記載されているのに、
> なぜドライバからのアクセスで再マップが必要になるのでしょうか?
なぜそうなっているかという視点からは答えにくいので、
仕組みとしてどうなっているかという点から説明させていただきます。
まず、どちらの方法であっても、機構的に最終的にプロセッサ内蔵のMMUで
仮想アドレスに割り振られて使用される…ということについては変わりありません。
で、MMUテーブルを簡単に割り当てる方法はioremap()なわけですが、
CPUレジスタについてはとにかくカーネルが起動した最初の方
(ioremapなどが使えるようになる前)からいきなり操作できるようにする必要があり、
こちらに関しては(低いレイヤーで)直接的にMMUに割り当てを行っています。
カーネルソースのarch/arm/mach-ns9750/arch.cにあるstandard_io_desc[]が、
その指示テーブルです。
ここに書かれている領域については、(ioremapなどで扱う後付の空間とは別に)
システムの起動から終了まで通して使用される、固定予約領域となっているわけです。
> 例えばIO Control Reg.に関してもLinux上の仮想アドレスが
> HW仕様書に記載されているのに、
ということで、このHW仕様書に記載されているのはこの固定予約領域の部分です。
この領域は、ioremap()は使用せずにアクセスできます。
「readl(NS_SYS_INT_CFG_BASE);」としているのはmappingではなく、
単に上記の固定予約領域がどこにされているかという「アドレス変換」のみです。
> なぜドライバからのアクセスで再マップが必要になるのでしょうか?
HWマニュアルに書かれている「論理メモリマップ」には、Extension Busは
記載されていません。このような領域はioremap()が必要になります。
こんな感じの説明になりますが…わかりにくいですかね(^^;
At 02 Nov 2010 13:36:51 +0900 email@hidden wrote:
> お世話になります、清水です。
>
> 先日花田様よりアドバイス頂いたレジスタアクセスの件について
> ふと疑問に思ったことがありますので、質問させて下さい。
>
> >> このことから、物理アドレスにアクセスする方法には
> >> 以下の二つがあるとの理解でよろしいでしょうか?
> >> ・仮想メモリにアクセスする(花田様提案の方法)
> >> ・物理メモリを再マップしてアクセスする(質問時に示した方法)
> >
> >えぇ、その通りです。
> >システムで使われているCPUレジスタのような既存領域は前者、
> >拡張バスに接続した新たなデバイスにアクセスする際は後者、
> >と考えていただければ良いと思います。
>
> 上記のようにアクセス方法が分かれているのは何故なのでしょうか?
> 例えばIO Control Reg.に関してもLinux上の仮想アドレスが
> HW仕様書に記載されているのに、
> なぜドライバからのアクセスで再マップが必要になるのでしょうか?
>
> 稚拙な質問であれば大変恐縮ですが、
> 後学のため、ご教授願えれば幸いです。
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>
____________________________________________________
花田 政弘 (はなだ まさひろ)
(株)アットマークテクノ 開発部
TEL: 011-207-6550 FAX: 011-207-6570
URL: http://www.atmark-techno.com/
E-mail: email@hidden
____________________________________________________
armadillo メーリングリストの案内