2009年1月14日水曜日

[arm]Inferno on Armadillo

Armadilloの上でInfernoを動かす試みをしているところです。
まだなんとなくシェルが動いたところまでしか実現できていませんが、やったことをメモしていきたいと思います。

・環境

Armadillo
http://armadillo.atmark-techno.com/armadillo
ARM720Tの開発ボード
CF, Ethernet、AD、IO等がある。

クロス開発用のPCはLinux(Fedoracore3(あれ?6だったか?))
WindowsではいまいちビルドがうまくいかないのでLinuxで行った。

※一番良いのはPlan9かも知れないが、まだネイティブなPlan9環境は構築できていない。

・開発概要

ブートローダーはもともとArmadilloに入っているものを使用する。
本来はLinux用だが、gzipを展開してジャンプするだけなので、そのまま利用できる。

開発のベースはEvaluator7tという評価基板用のものを利用する。
これは、Infernoのツリーの、
os/ks32
にある。

※Evaluator7tというのが何者なのか、調べてもいまいち良くわからない。
 どうやらそれほど多機能なボードではなさそう・・・

・ファームウェアダウンロード方法

Armadilloの取り扱い説明書を参照。
ジャンパJP1をONにしてやるとシリアルからプログラムをダウンロードできる。
専用のダウンローダー(hermit)があるので、それを利用。
0x00010000に書き込む。
正確なコマンドラインは後ほど。

ジャンパJP1をOFFにして再起動すると、Flashの0x00010000にあるgzipファイルを
SDRAMの0xc0028000に展開する。
0xc0028000がリセットベクタにあたるので、そこに書かれているアドレスにジャンプする。

・ファームウェア作成のポイント

ファームウェアの改変ポイントは
  • uartドライバ作成
  • mkfileを編集し、ヘッダなしのgzipファイルとしてファームウェアが生成するようにする
  • MMUの設定
  • 割り込みベクタの書き方を変更
  • ルートファイルシステムを修正
  • プログラムをロードするアドレスの変更
作業詳細は次回以降。なぜなら、ブログを書いているPCと開発PCが別なので参照しづらいため。

・現状
シェルが起動する。
自分で作ったhelloworld が起動することを確認。
システムクロックが働いていないようで、sleep等時間関係の関数は動かないっぽい。
割り込みは入っているんだけどな。

※Hello WorldはLimbo言語で記述したもの。PCで動いていたバイナリがそのままArmadilloでも動くと、当たり前と思いつつも感動がある。

・今後の目標

Infernoをまともに動かす。
ネットワークを使えるようにする。
CFも可能であれば(優先度低)。
そしてゆくゆくはSH環境で動かす。
そうなると、SH用のコンパイラから作らなければならないかも。それはそれで楽しそうだ。

・所感

動いたときの感動は大きい。
開発の基にした基板とコアが同じなので簡単にいくかと思ったら甘かった。
ペリフェラルがぜんぜん違う。
割り込みコントローラーもタイマーもuartも全部書き直し。

※MMUはARMのアーキテクチャで決まっているので、使い方はほぼどれも同じと思われる。

Infernoを有用に使うにはネットワークは必須であろう。
EthernetコントローラーはCS8900A互換ということで、そのドライバはInfernoにすでに含まれている。
簡単に移植できるといいなぁ。

・参考文献

MMUに関してはInterface 2008 11月が参考になった。
Armadilloに関しては、ハードウェアマニュアル、ソフトウェアマニュアル、ブートローダーのソースコードが参考になる。
Infernoのカーネルビルドに関しては
https://umdrive.memphis.edu/blstuart/htdocs/inf_native.html
を取っ掛かりとした。
コンパイラ、アセンブラに関しては、manとかRob先生の説明を参照した。
コンパイラはGCC等とは若干異なるようで、違いはおさえておいたほうがよさそう。
http://www.cs.bell-labs.com/sys/doc/comp.html
もちろん、CPUのデータシートも必須。

0 件のコメント:

コメントを投稿