NetBSD/evbarm (APC8750) への道
NetBSD BoF 2014
2014/07/12
Hiroshi 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
色々とご指導いただいた皆様
どうもありがとうございました!

NetBSD/evbarm (APC9750) への道