AZ/05Mとは
ロシアの愛したTOSHIBA製Androidベースのクラウドブック。元々はAndroid 2.1ベースでタッチUIなし、ストアも使えないっていう微妙な立ち位置なんだけど、不思議とみんな大好き。勝手に移植されたKitKatベースのカスタムファーム入れたり、Ubuntu入れたり。これだけ愛されているのに、なぜかNetBSDは未だに動かない。
どんなに失敗しても文鎮化しない良い子。海外での型番はAC100、ボードの愛称はPAZ00(Linux kernel上のconfiguration名も)。
Das U-Boot
元々はU-Boot使ってないんだけど、カスタムROMやUbuntuを入れる事を目的としてU-Bootが移植されている。
U-Boot standalone applications
U-Bootが提供するAPIを使ってU-Bootから起動してU-Bootに返るアプリケーションが書ける。オフィシャルなドキュメントはこちら。
特定のアドレス(ARMなら0x0c100000)に読んで、先頭にジャンプしたら動くようなバイナリイメージを作れば良い。U-BootのAPIはU-Bootをbuildする際に生成されるexamples/standalone/stubs.o経由で呼ぶ。
その他、各種build flagをU-Bootのbuild時に指定した物に揃える必要があるので注意。フラグはわりとversionによって違ったりする。例えば先ほどのAC100向けにforkされたバージョンでは-ffixed-r8が指定されてるけど、trunkでARM versatile向けにbuildすると-ffixed-r9が指定されていたり、などなど。
API
種類
Console I/Oくらいしかないんですが、逆にConsoleを扱う分には(UEFIと比べて)シンプルでわかりやすいAPIが提供されています。Consoleは最低限度の環境だとUARTだけだったりするのですが、ファームが対応していればLCD+Keyboardで動くstandaloneなConsoleが利用可能です(例えばAZ/05M向けのファームは対応済み)。
実例
getc()、putc()、puts()、printf()などは名前から推測される通り。その他、入力バッファにデータがあるかを確認するtstc()という便利な関数があります。
cp-mega88の移植
cp-mega88とは
拙作のCP/M動作環境です。元々はAVRマイコン上で動作していたのですが、デバッグ用のPOSIX buildがあったり、以前のエントリで紹介したUEFIから直接ブートするように作られたUEFIアプリなどがあります。コードはGitHubにてtoyoshim/cp-mega88として管理されています。
コンソールI/O
tstc()のお陰でコンソール周りの実装は各種portの中で一番シンプルになりました。UEFIなんかだとtstc()的な事をするために同期イベント作ってタイマーをセット、コンソールの入力と同期イベントを多重化して待つ……みたいな仰々しいコードが必要になりますし、POSIXで書いてもfcntlやtermiosとお友達になる必要があり結構面倒。そういう意味では個人的には理想的なAPIです。
ファイルアクセス
UEFIみたいなファイルシステムを提供するようなインフラは整備されていないようだったので、Linuxのinitramfs的な事を行いました。つまりU-Boot自体はext2を認識するので、ext2loadコマンドでディスクイメージをメモリ上の固定アドレスに配置し、アプリ側からはRAM fsのように扱います。
# ext2load mmc 0:1 0x0c100000 /boot/cp-mega88.bin
# ext2load mmc 0:1 0x0c200000 /boot/sdcard.img
# go 0x0c100000
具体的にはU-Bootからこのようなコマンドでcp-mega88.binを起動させ、ここで指定した0x0c200000をRAMディスクの先頭だと思ってブロックデバイスをサポートしています。
雑感
繰り返しになりますが、UEFIよりずっとシンプルで、コンソールベースのアプリなら比較的簡単に書けました。ただグラフィックなどを触ろうとするとUEFIやBIOSより遥かに難しく、グラフィックカードやLCD毎にドライバ的な物を自前で書く必要があり現実的ではありません。そういう意味では本来の役割をわきまえているとも言えます。