netbsd/evbarm (apc9750) への道

25
NetBSD/evbarm (APC8750) への道 NetBSD BoF 2014 2014/07/12 Hiroshi Tokuda

Upload: tokudahiroshi

Post on 07-Jul-2015

765 views

Category:

Software


2 download

DESCRIPTION

NetBSD/evbarm (APC8750) port. WonderMedia WM8750

TRANSCRIPT

Page 1: NetBSD/evbarm (APC9750) への道

NetBSD/evbarm (APC8750) への道

NetBSD BoF 2014

2014/07/12Hiroshi Tokuda

Page 2: NetBSD/evbarm (APC9750) への道

NetBSD/evbarm の可能性を探るプレゼンです

Page 3: NetBSD/evbarm (APC9750) への道

というのは嘘で、よくある移植の話です。

シリアルから文字が出て喜ぶ人向け。

Page 4: NetBSD/evbarm (APC9750) への道

きっかけ● 自分でも「動いた、わぁい」を味わいたい

– かといって、むつかしいことはできない– パラメータをちょっといじるレベルで何とかそれを味わ

えないものか● ARMの似たような板を買ってみる

– Raspberry PIはARM11らしい– VIAのAPC8750はARM11らしい– しかも4,000円ぐらいで安い– シリアルが生えていて、はんだ付け不要

● これだ

Page 5: NetBSD/evbarm (APC9750) への道

届いた(http://apc.io/)● WonderMedia WM8750 800MHz● DDR3 512MB, 2GB Nand● HDMI, VGA, USB2.0x4, Audio in/out● MicroSD● 10/100 Ethernet● Neo-ITX

● ん? WM8750

Page 6: NetBSD/evbarm (APC9750) への道

ARMというのはだな● なんだか、とても複雑である● 落ち着いてsrc/sys/arch/{evb}armを見てみよう● これはいかん● パラメータをちょろっと直すだけでは済まない● なんとドキュメントが公開されていない● Linuxのソースだけはある

Page 7: NetBSD/evbarm (APC9750) への道

つついさん曰く

NetBSD移植 いまむかし, Tsutsui Izumi, OSC2012愛媛 よりhttp://www.ceres.dti.ne.jp/tsutsui/osc12eh/img33.html

Page 8: NetBSD/evbarm (APC9750) への道

まずはシリアルから文字● u-boot優秀● すばやくリターンキーを押す

– u-bootプロンプトが出る● tftpでカーネルを食わせられる● mm.lで@が出れば勝ち。 @rshさんからの情報

WMT # mm.l d8200000

d8200000: 0000003a ? 40

@d8200004: 0000000d ? .

Page 9: NetBSD/evbarm (APC9750) への道

まずはxxx_start.S● スタートアップルーチン● アセンブラで書かれている● ARMアセンブラの勉強がてら、rpi_start.Sを読

むことにした● コメント含めて328行

Page 10: NetBSD/evbarm (APC9750) への道

rpi_start.Sの流れ

① 割り込みを禁止する

② L1ページ変換テーブルを0に初期化

③ 最低限のマッピングをL1ページ変換に設定

④ 各種キャッシュをOFF

⑤ L1ページテーブルをセット

⑥ コントロールレジスタを調整

⑦ MMUをON

⑧ スタートルーチンへジャンプ

Page 11: NetBSD/evbarm (APC9750) への道

APCむけのカーネルを作る

● rpi_start.Sをぱくる+ほかのデバイス削りまくる● どこまで動いているか知りたい

– netwalker_start.Sにデバッグルーチンがある @bsh_twさん– コピってアドレスを合わせると文字が出るように!

● MMUをonにすると、異世界に旅立ってしまう– デバッグルーチンがレジスタをつぶしていた

● xxx_machdep.cのinitarmに来たらCの世界       *(volatile int *)0xfe200000 = 0x40;

Page 12: NetBSD/evbarm (APC9750) への道

printf

● consinitを実装する● 16650なシリアルドライバをパクる● どれがいいかな

– HDL-Gがシンプルで分かりやすい @nonakap さん作● なんか動いた、けど遅い

– エスパーによる高速化 @rshさん– ビジーループ

● printfが動けば勝ったようなもの、という意味を知る

Page 13: NetBSD/evbarm (APC9750) への道

NetBSDバナーが出た● 適当に作っているところを合わせるとバナーが出た

– 動いたわぁい感– けど、シリアルの入力ができない

● 気分転換にシリアルケーブルを工作して見栄えを改善しよう– シリアルポートが物理的に壊れた– 実質、手も足も出ません

● ここまで来たから、– もういいや– もう少し

● もう一台発注。絶対に負けられない戦い感。

Page 14: NetBSD/evbarm (APC9750) への道

二代目と割り込み● おちついて割り込みコントローラに着手

– 実は、関係ないのだった● 割り込みコントローラ、さっぱりわからん

– Linuxのソースはある– 読み替え作戦

● LinuxとNetBSDの両方にある機種を探し、どう移植すればよいのかを実例から学ぶ– GEMINIが簡単そう– 以後、GEMINIさんに大変お世話になりました

Page 15: NetBSD/evbarm (APC9750) への道

足らぬ足らぬは初期化が足らぬ● 割り込みのざっくりした知識はあるが実際にどう動くの

かは知らなかった● シリアル入力の割り込みが割り込みコントローラで捕捉

できるのを見たかった– 割り込みコントローラの初期化で全部を割り込みONにするが上がってこない

– シリアルデバイス側の割り込みをONにするということを知らなかった

● あれ? u-bootとかなんで動いているんだろう– ポーリング?

Page 16: NetBSD/evbarm (APC9750) への道

シリアル入力に戻る● 割り込みが来たらcomの割り込みルーチンに飛ぶよう

になった● 追っかけると明らかにおかしなところで止まっている

– まさか、16550じゃない?

– そのまさかだ! フハハハ– 独自にシリアルのドライバを作らないとダメ– ちょろっとパラメータを修正するだけだったのに– せめてroot deviceぐらいは入力できるようにしたい– ポーリングだ!

Page 17: NetBSD/evbarm (APC9750) への道

ポーリング入力● 俺よりサイズの小さい奴に会いにゆく

  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シリーズだけでよい– 特定のアドレスから読む/書くだけの話– これならできそう

Page 18: NetBSD/evbarm (APC9750) への道

/sbin/initが動かないかなー● メモリが512MBもあるのでmdで動かせば

– テキトーにramdisk.fsをつくってmdsetimage

– うごかねー● /sbin/initはユーザ空間で動いているのでprintfとか使えないよ

– print_consoleとかいうのがありますな(open,write)

– やったpanicした!

– あれ、もしかしてddb使える?

– ぐるぐるまわって結局デバイスのメジャー番号がなかった– 新しいデバイスを作っている感を満喫

Page 19: NetBSD/evbarm (APC9750) への道

ユーザランドからカーネルへ● openを動かす

– ソフトウェア割込み経由でカーネルに入り、vn_open -> spec_open -> cdev_open -> cn_open -> spec_open -> cdev_open -> wmtcomopen

● あとはひとつひとつ元のドライバから写経する– 文字が出るようになった!

● /sbin/initがデバッグできる– おや? forkのようすが– たまにsleepして掴んだCPUを手放せばいいんじゃ

Page 20: NetBSD/evbarm (APC9750) への道

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

Page 21: NetBSD/evbarm (APC9750) への道

割り込みを使った入力● なんか写経で動いた

Page 22: NetBSD/evbarm (APC9750) への道

タイマードライバの呪いを解く● /sbin/initをいじってうんたらかんたら● nanosleepとかdelayをさぼっている

– きっとタイマードライバがダメなんだ● コピペのタイマードライバからの卒業

– 初期化ルーチン● レジスタの仕様にあわせて一つ一つ

– Delay● タイマーレジスタから値を取って、delayさせたいマイクロ秒数経過するまでループするってだけだった

● 手直しなしで動くようになった!

Page 23: NetBSD/evbarm (APC9750) への道

その後● rebootできるようになった● 最近のcurrentで動かせるようになった● USBを動かしたい

– なんかしらんがPCIブリッジドライバ?

– そんなものはない(はず)– メモリ上にPCIのレジスタがあるように見せている– (゚Д゚)ハァ?

● まぁ、動いた、わぁい、が実現したので嬉しい

Page 24: NetBSD/evbarm (APC9750) への道

やっぱり、つついさんは正しかった

NetBSD移植 いまむかし, Tsutsui Izumi, OSC2012愛媛 よりhttp://www.ceres.dti.ne.jp/tsutsui/osc12eh/img33.html

Page 25: NetBSD/evbarm (APC9750) への道

色々とご指導いただいた皆様どうもありがとうございました!