解説
u-bootをザウルス向けに変更するにあたりネットで調べたりデバッグ中に分かったことなどを書いておきます。
元のソース
SD対応まではpdaXromのソースコードを使っていてu-bootがSDHCに対応後はpdaXromのu-bootソースをマージして開発しました。
SDコントローラの初期化する部分はlinuxカーネルのソースを流用しています。
ザウルスのブートシーケンス
ザウルスはP2ROMという1度しか書き換えられないROM(工場出荷時書き換えてあるので既に書換不可)よりブートし、NANDのangelbootloaderを実行、その後カーネル実行の手順でブートします。
詳細は
こことか
こことか
ここなど。
u-bootのブートシーケンス
通常u-bootは最初NANDなどのフラッシュデバイスで実行されリンク時決定された先頭アドレス(リンカースクリプトに記述したアドレスでリンクされる)とメモリ上の先頭アドレスを比べて差異があったら自分自身をリンク時決定された先頭アドレスにコピーしそのアドレスにジャンプします。
このようにu-bootは置かれる場所はどこでも構いません。
それなのでカーネルの置かれるNANDのアドレスにu-bootを置いても、
angelbootloaderがカーネル(実際にはu-boot)をカーネルサイズ分メモリにコピー後カーネル(実際にはu-boot)先頭アドレスにジャンプしu-bootはメモリから起動される
となり動作します。
SCOOPデバイス
カーネルソースを読むとSDに電源を入れるためSCOOPデバイスというものにアクセスしています。
ネットで調べてもこれだと言う情報は見つかりませんでしたがどうやら
このASICのようでSHARPスペシャルデバイスみたいです。
カーネルソースを読んだところではこのデバイスの機能はCFバスバッファ、SD、CF電源への接点出力、ザウルスの電源、メールのLED接点出力などがあるようです。
メモリマップ
SDに電源を入れるためSCOOPデバイスにアクセスするとdata abort exceptionが発生、原因分からずNANDのangelbootloaderを逆アセンブルして追っかけてみました。
結局はangelbootloader内でMMU設定していたためSCOOPデバイスのアドレスが不正アドレスとなっていたのが原因でした。
物理アドレス |
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(シリアルケーブル)必須です。
このu-bootはシリアル経由でu-bootバイナリをメモリに転送後ジャンプすると暴走します。これはangelbootloaderがメモリコントローラや他のデバイスコントローラのレジスタに設定した値をそのまま流用するためCPUリセットを行っていないためです。NANDフラッシュに書き込まずにメモリに転送してu-bootをデバッグするにはCPUリセットを行うようにしてください。
ソース
このソースに
このパッチをあてます。
このu-bootはNANDに書き込みができません。原因が分からず放置状態でした。今MMUメモリマップを見て気がつきましたがもしかしたらNAND書き込みアドレスがMMUで割り当てられていないかもしれないです。
最終更新:2010年10月04日 23:52