u-bootについて


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

解説

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設定アドレスは0xa1ff0000で1レベル方式です。
詳しくはinterface2008年11月号に説明があります。
(サイトで見れる分では不十分で買わないと詳細は分かりませんが...)
または改訂 ARMプロセッサ—32ビットRISCのシステム・アーキテクチャ参照
で、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(シリアルケーブル)必須です。
このu-bootはシリアル経由でu-bootバイナリをメモリに転送後ジャンプすると暴走します。これはangelbootloaderがメモリコントローラや他のデバイスコントローラのレジスタに設定した値をそのまま流用するためCPUリセットを行っていないためです。NANDフラッシュに書き込まずにメモリに転送してu-bootをデバッグするにはCPUリセットを行うようにしてください。

ソース

このソースこのパッチをあてます。
このu-bootはNANDに書き込みができません。原因が分からず放置状態でした。今MMUメモリマップを見て気がつきましたがもしかしたらNAND書き込みアドレスがMMUで割り当てられていないかもしれないです。
添付ファイル