[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: L-router / L-board



Takao Shinohara <shin@sm.sony.co.jp> writes:
> # カーネルの作り方や起動方法などの情報は後ほどまとめて報告します。

メモ程度の内容ですが、L-RouterでのNetBSDカーネルの起動方法等の情報です。
カーネルソースの変更点等はまた別途。

篠原

/*	-*- Indented-Text -*-	*/

L-RouterでNetBSDを起動する方法

[用意するもの]

1. シリアルコンソール

PCなどにクロスケーブルで接続する。115200bps。結線によってはハーウェアフ
ロー制御の関係で(?)動作しないため、ハードゥエアフロー制御を禁止するか、
適切な接続のクロスケーブルを用意するかする必要がある。

手持ちのケーブルでは、インターリンク用はだめでLOASのクロスケーブルは大丈
夫だった。

2. ftp/httpサーバ

L-Routerにダウンロードするカーネルバイナリを置くためのサーバ。ftpもし
くはhttpプロトコルが使用できる。

3. ホストマシン

NetBSDのカーネルをクロスコンパイルするホストマシン。2.と兼用の方が簡単。

[L-Routerのファームウェアの更新方法]

L-RouterのファームウェアはFLASH ROMに書き込むバイナリイメージ形式で用意
されており、それを動作中のLinuxでROMに書き込むことで内容を更新している。

(ROMモニタでシリアルポートからダウンロードすることも可能だが、時間がかか
るのでお勧めできない。ただし、FLASH ROMに書き込まずにデバッグすることが
可能なので、安全性は高いと思われる。)

詳細は以下のとおり。

ROMは以下のように分割されている。(実際の物理アドレスは0x1f000000から始ま
る。)

0x00000000-0x00600000 : "factory shipped version kernel"
0x00600000-0x00c00000 : "updated version kernel"
0x00c00000-0x00c40000 : "monitor"
0x00c40000-0x00c80000 : "boot flags"
0x00c80000-0x00d00000 : "user defined configuration"
0x00d00000-0x01000000 : "reserved"

先頭12MBの前半6MBに工場出荷時のカーネルイメージ(RAM Diskで動作する)が書
き込まれている。後半6MBは更新用のカーネルイメージの領域である。

0x1fc00000からの256KBはROMモニタが書き込まれている。

0x1fc40000からの256KBはROMモニタの起動方法を指定するパラメータが書き込ま
れる。実際には先頭の8バイトしか使われていない。

0x1fc80000からの512KBはL-Routerの設定内容が記録される。minix fsフォーマッ
ト。

0x1fd00000からの3MBは未使用。

Linux上では、上記の各領域はブロックデバイスでアクセスできる。デバイス名
は以下のとおり。

brw-r--r--    1 0        0         31,   0 Nov 20 14:36 /dev/mtd_kernel_factory
brw-r--r--    1 0        0         31,   1 Nov 20 14:36 /dev/mtd_kernel_update
brw-r--r--    1 0        0         31,   2 Nov 20 14:36 /dev/mtd_monitor
brw-r--r--    1 0        0         31,   3 Nov 20 14:36 /dev/mtd_config_monitor
brw-r--r--    1 0        0         31,   4 Nov 20 14:36 /dev/mtd_config

カーネルの更新は/sbin/kernel-update(shellスクリプト)によって実行される。
kernel-updateは以下のような処理を行なう。

1) ramdiskを初期化してマウント
2) wgetコマンドでカーネルファイルを取得してramdisk上に置く
3) カーネルを/dev/mtd_kernel_updateに書き込む
4) 更新されたカーネルが起動するように/dev/mtd_config_monitorを書き換える

詳細はkernel-updateを参照。

ROMモニタは0x1fc40000からの4バイトにマジックナンバ(0xde 0xad 0xbe 0xef)
がある場合、続く4バイトに書かれているアドレスにジャンプする。マジックナ
ンバがない場合は工場出荷時のカーネル領域(0x1f000000)にジャンプする。

この仕掛けを利用して、ftp/httpサーバに置いたNetBSDカーネルのバイナリイメー
ジをROMに書き込めば、NetBSDを起動することができる。

# /sbin/kernel-update ftp://user:password@host/.../netbsd.bin
# reboot

[NetBSDカーネルイメージの作り方]

ROMに書き込むバイナリイメージはobjcopyでELFファイルから作れる。

% mipsel-netbsd-objcopy -O binary netbsd netbsd.bin

VR4122用のコードがあるhpcmipsのカーネルは0x80030000からloadされるように
なっているが、これはそのままで良い。カーネルのバイナリイメージの先頭に
ROMからRAMにカーネルをコピーして制御を移す簡単なブートローダを仕込めばよ
い。(Linuxカーネルはそのように起動していた。)

もう少し凝ったブートローダ、たとえば、ROM内のELFイメージ用のローダを作る
こともできるが、手始めは簡単なもので十分である。

[工場出荷状態への戻し方]

マニュアルに書いてあるとおり、スイッチを押しながら電源を入れると工場出荷
状態に戻る。やっていることは、/dev/mtd_config_monitorの領域をクリアして
いるらしい。

工場出荷時のLinuxが起動したら適当にネットワークの設定をして再度カーネル
の更新を行なえばよい。

以上