u-bootについて

「u-bootについて」の編集履歴(バックアップ)一覧に戻る
u-bootについて」を以下のとおり復元します。
**解説
u-bootをザウルス向けに変更するにあたりネットで調べたりデバッグ中に分かったことなどを書いておきます。

***元のソース
SD対応まではpdaXromのソースコードを使っていてu-bootがSDHCに対応後はpdaXromのu-bootソースをマージして開発しました。
SDコントローラの初期化する部分はlinuxカーネルのソースを流用しています。

***ザウルスのブートシーケンス
ザウルスはP2ROMという1度しか書き換えられないROM(工場出荷時書き換えてあるので既に書換不可)よりブートし、NANDのangelbootloaderを実行、その後カーネル実行の手順でブートします。
詳細は[[ここ>>http://piro.sytes.net/~piro/pukiwiki/pukiwiki.php?C3000%A4%CEP2ROM%A4%C8DIAG_MENU%A4%F2%C4%B4%A4%D9%A4%EB]]とか[[ここ>>http://piro.sytes.net/~piro/pukiwiki/pukiwiki.php?P2ROM]]とか[[ここ>>http://www.h5.dion.ne.jp/~rimemoon/zaurus/memo_006.htm]]など。

***u-bootのブートシーケンス
通常u-bootは最初NANDなどのフラッシュデバイスで実行されリンク時決定された先頭アドレス(リンカースクリプトに記述したアドレスでリンクされる)とメモリ上の先頭アドレスを比べて差異があったら自分自身をリンク時決定された先頭アドレスにコピーしそのアドレスにジャンプします。
このようにu-bootは置かれる場所はどこでも構いません。
それなのでカーネルの置かれるNANDのアドレスにu-bootを置いても、
angelbootloaderがカーネル(実際にはu-boot)をカーネルサイズ分メモリにコピー後カーネル(実際にはu-boot)先頭アドレスにジャンプしu-bootはメモリから起動される
となり動作します。

***SCOOPデバイス
カーネルソースを読むとSDに電源を入れるためSCOOPデバイスというものにアクセスしています。
ネットで調べてもこれだと言う情報は見つかりませんでしたがどうやら[[このASIC>>http://www.penguin.cz/~utx/zaurus/datasheets/ASIC_S1L50752B26B200/	ASIC_S1L5xxxx.pdf]]のようでSHARPスペシャルデバイスみたいです。
カーネルソースを読んだところではこのデバイスの機能はCFバスバッファ、SD、CF電源への接点出力、ザウルスの電源、メールのLED接点出力などがあるようです。

***メモリマップ
SDに電源を入れるためSCOOPデバイスにアクセスするとdata abort exceptionが発生、原因分からずNANDのangelbootloaderを逆アセンブルして追っかけてみました。
結局はangelbootloader内でMMU設定していたためSCOOPデバイスのアドレスが不正アドレスとなっていたのが原因でした。

MMU設定アドレスは0xa1ff0000で1レベル方式です。
詳しくは[[interface2008年11月号>>http://www.cqpub.co.jp/interface/sample/200811/if11_105.pdf]]に説明があります。
(サイトで見れる分では不十分で買わないと詳細は分かりませんが...)
または[[改訂 ARMプロセッサ—32ビットRISCのシステム・アーキテクチャ>>http://www.amazon.co.jp/%E6%94%B9%E8%A8%82-ARM%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E2%80%9532%E3%83%93%E3%83%83%E3%83%88RISC%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%BB%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-Design-Wave-BOOKS/dp/4789833577]]参照
で、u-bootが動いている間のメモリマップは以下の様になります。
(カーネルが動き出すとまた新たにMMUを設定しなおすのでこれとは違ったものになります。)

|物理アドレス|MMU後アドレス|内容|サイズ|
|0xA0000000|0x00000000|メモリ|64MB|
|0x00000000|0x04000000|P2ROM|8MB|
|0x40000000|0x40000000|ペリフェラルレジスタ|64MB|
|0x44000000|0x44000000|LCDレジスタ|64MB|
|0x48000000|0x48000000|メモリコントローラレジスタ|1MB|
|0x4C000000|0x4C000000|USBホストレジスタ|1MB|
|0x5C000000|0x5C000000|SRAM|1MB|
|0xA0000000|0xA0000000|メモリ|64MB|
|0x20000000|0xB0000000|PC Card/CompactFlash Slot 0|256MB|
|0x30000000|0xC0000000|PC Card/CompactFlash Slot 1|256MB|
|0x00000000|0xD0000000|P2ROM|32MB|
|0x10800000|0xD2000000|SCOOPデバイス|1MB|
|0x0C000000|0xD4000000|NAND|1MB|
|0x10000000|0xD6000000|SCOOPデバイス|1MB|
|0x08800000|0xD8000000|不明|1MB|
(メモリとP2ROMは2箇所割り当てられていますが、どちらでもアクセスできます。この表はあくまでMMUでアクセスできる範囲を表しているので実際のサイズとは異なるものもあります)

***u-bootデバッグ方法
[[CE-170TS(シリアルケーブル)>>http://www.sharp.co.jp/sc/eihon/mic1/text/p6.html]]必須です。
このu-bootはシリアル経由でu-bootバイナリをメモリに転送後ジャンプすると暴走します。これはangelbootloaderがメモリコントローラや他のデバイスコントローラのレジスタに設定した値をそのまま流用するためCPUリセットを行っていないためです。NANDフラッシュに書き込まずにメモリに転送してu-bootをデバッグするにはCPUリセットを行うようにしてください。

**ソース
現在整理中

復元してよろしいですか?