netbsd/evbarm (apc9750) への道
DESCRIPTION
NetBSD/evbarm (APC8750) port. WonderMedia WM8750TRANSCRIPT
NetBSD/evbarm (APC8750) への道
NetBSD BoF 2014
2014/07/12Hiroshi Tokuda
NetBSD/evbarm の可能性を探るプレゼンです
というのは嘘で、よくある移植の話です。
シリアルから文字が出て喜ぶ人向け。
きっかけ● 自分でも「動いた、わぁい」を味わいたい
– かといって、むつかしいことはできない– パラメータをちょっといじるレベルで何とかそれを味わ
えないものか● ARMの似たような板を買ってみる
– Raspberry PIはARM11らしい– VIAのAPC8750はARM11らしい– しかも4,000円ぐらいで安い– シリアルが生えていて、はんだ付け不要
● これだ
届いた(http://apc.io/)● WonderMedia WM8750 800MHz● DDR3 512MB, 2GB Nand● HDMI, VGA, USB2.0x4, Audio in/out● MicroSD● 10/100 Ethernet● Neo-ITX
● ん? WM8750
ARMというのはだな● なんだか、とても複雑である● 落ち着いてsrc/sys/arch/{evb}armを見てみよう● これはいかん● パラメータをちょろっと直すだけでは済まない● なんとドキュメントが公開されていない● Linuxのソースだけはある
つついさん曰く
NetBSD移植 いまむかし, Tsutsui Izumi, OSC2012愛媛 よりhttp://www.ceres.dti.ne.jp/tsutsui/osc12eh/img33.html
まずはシリアルから文字● u-boot優秀● すばやくリターンキーを押す
– u-bootプロンプトが出る● tftpでカーネルを食わせられる● mm.lで@が出れば勝ち。 @rshさんからの情報
WMT # mm.l d8200000
d8200000: 0000003a ? 40
@d8200004: 0000000d ? .
まずはxxx_start.S● スタートアップルーチン● アセンブラで書かれている● ARMアセンブラの勉強がてら、rpi_start.Sを読
むことにした● コメント含めて328行
rpi_start.Sの流れ
① 割り込みを禁止する
② L1ページ変換テーブルを0に初期化
③ 最低限のマッピングをL1ページ変換に設定
④ 各種キャッシュをOFF
⑤ L1ページテーブルをセット
⑥ コントロールレジスタを調整
⑦ MMUをON
⑧ スタートルーチンへジャンプ
APCむけのカーネルを作る
● rpi_start.Sをぱくる+ほかのデバイス削りまくる● どこまで動いているか知りたい
– netwalker_start.Sにデバッグルーチンがある @bsh_twさん– コピってアドレスを合わせると文字が出るように!
● MMUをonにすると、異世界に旅立ってしまう– デバッグルーチンがレジスタをつぶしていた
● xxx_machdep.cのinitarmに来たらCの世界 *(volatile int *)0xfe200000 = 0x40;
printf
● consinitを実装する● 16650なシリアルドライバをパクる● どれがいいかな
– HDL-Gがシンプルで分かりやすい @nonakap さん作● なんか動いた、けど遅い
– エスパーによる高速化 @rshさん– ビジーループ
● printfが動けば勝ったようなもの、という意味を知る
NetBSDバナーが出た● 適当に作っているところを合わせるとバナーが出た
– 動いたわぁい感– けど、シリアルの入力ができない
● 気分転換にシリアルケーブルを工作して見栄えを改善しよう– シリアルポートが物理的に壊れた– 実質、手も足も出ません
● ここまで来たから、– もういいや– もう少し
● もう一台発注。絶対に負けられない戦い感。
二代目と割り込み● おちついて割り込みコントローラに着手
– 実は、関係ないのだった● 割り込みコントローラ、さっぱりわからん
– Linuxのソースはある– 読み替え作戦
● LinuxとNetBSDの両方にある機種を探し、どう移植すればよいのかを実例から学ぶ– GEMINIが簡単そう– 以後、GEMINIさんに大変お世話になりました
足らぬ足らぬは初期化が足らぬ● 割り込みのざっくりした知識はあるが実際にどう動くの
かは知らなかった● シリアル入力の割り込みが割り込みコントローラで捕捉
できるのを見たかった– 割り込みコントローラの初期化で全部を割り込みONにするが上がってこない
– シリアルデバイス側の割り込みをONにするということを知らなかった
● あれ? u-bootとかなんで動いているんだろう– ポーリング?
シリアル入力に戻る● 割り込みが来たらcomの割り込みルーチンに飛ぶよう
になった● 追っかけると明らかにおかしなところで止まっている
– まさか、16550じゃない?
– そのまさかだ! フハハハ– 独自にシリアルのドライバを作らないとダメ– ちょろっとパラメータを修正するだけだったのに– せめてroot deviceぐらいは入力できるようにしたい– ポーリングだ!
ポーリング入力● 俺よりサイズの小さい奴に会いにゆく
25,419 arm/clps711x/clpscom.c
26,322 arm/ep93xx/epcom.c
18,175 arm/footbridge/footbridge_com.c
26,658 arm/ixp12x0/ixp12x0_com.c
48,257 arm/s3c2xx0/sscom.c
34,717 arm/sa11x0/sa11x0_com.c
58,808 arm/imx/imxuart.c
● ポーリングで動かすだけならcnputcなどcnシリーズだけでよい– 特定のアドレスから読む/書くだけの話– これならできそう
/sbin/initが動かないかなー● メモリが512MBもあるのでmdで動かせば
– テキトーにramdisk.fsをつくってmdsetimage
– うごかねー● /sbin/initはユーザ空間で動いているのでprintfとか使えないよ
– print_consoleとかいうのがありますな(open,write)
– やったpanicした!
– あれ、もしかしてddb使える?
– ぐるぐるまわって結局デバイスのメジャー番号がなかった– 新しいデバイスを作っている感を満喫
ユーザランドからカーネルへ● openを動かす
– ソフトウェア割込み経由でカーネルに入り、vn_open -> spec_open -> cdev_open -> cn_open -> spec_open -> cdev_open -> wmtcomopen
● あとはひとつひとつ元のドライバから写経する– 文字が出るようになった!
● /sbin/initがデバッグできる– おや? forkのようすが– たまにsleepして掴んだCPUを手放せばいいんじゃ
NetBSD/evbarm 6.99.24
This menu-driven tool is designed to help you install NetBSD to a hard disk,
or upgrade an existing NetBSD system, with a minimum of work.
In the following menus type the reference letter (a, b, c, ...) to select an
item, or type CTRL+N/CTRL+P to select the next/previous item.
The arrow keys and Page-up/Page-down may also work.
Activate the current selection from the menu by typing the enter key.
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
xwmtcom: ioctlion messages in English x
x b: Messages d'installation en fran軋is x
x c: Installation auf Deutsch x
x d: Komunikaty instalacyjne w jezyku polskim x
x e: Mensajes de instalacion en castellano x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
割り込みを使った入力● なんか写経で動いた
タイマードライバの呪いを解く● /sbin/initをいじってうんたらかんたら● nanosleepとかdelayをさぼっている
– きっとタイマードライバがダメなんだ● コピペのタイマードライバからの卒業
– 初期化ルーチン● レジスタの仕様にあわせて一つ一つ
– Delay● タイマーレジスタから値を取って、delayさせたいマイクロ秒数経過するまでループするってだけだった
● 手直しなしで動くようになった!
その後● rebootできるようになった● 最近のcurrentで動かせるようになった● USBを動かしたい
– なんかしらんがPCIブリッジドライバ?
– そんなものはない(はず)– メモリ上にPCIのレジスタがあるように見せている– (゚Д゚)ハァ?
● まぁ、動いた、わぁい、が実現したので嬉しい
やっぱり、つついさんは正しかった
NetBSD移植 いまむかし, Tsutsui Izumi, OSC2012愛媛 よりhttp://www.ceres.dti.ne.jp/tsutsui/osc12eh/img33.html
色々とご指導いただいた皆様どうもありがとうございました!