BBR-4MG::Linuxを動かす

簡単な自作のプログラムも動かせたことだし,LinuxかNetBSDが動かないかな~っとしばらく考えていたのですが,同じCPUをつんだ製品でLinuxが動いているものがあるようです.ファームウェアのソースも公開されていました.

殆どの情報は,Adm5120 - LinuxMIPSから辿れば手に入ります.リンクからソースとコンパイラを含むツール類をダウンロードしてください.BBR-4MGが私のサイトへのリンクになっているのは,しばらくしてから気づきました(^^;

今回は,EdimaxのBR-6104シリーズのソースを使いました.

そんなわけで,いつかやろうと思っていたのですが,しばらく放置してましたが,夏休みでまとまった時間が取れたので実行に移しました.

おことわり

下準備

まず,シリアルポート経由での作業が必用なので,bbr-4mg01を読んで,シリアル接続が出来る環境を整えてください.要は,レベル変換回路を用意して,説明の通りにピンヘッダに繋ぐだけです.

起動したときにフラッシュの型番が表示されるので確認してください.もし,AM29LV160DB以外だったなら,mx29lv320b.cを書き換える時に気をつけてください.AMDじゃない場合もあるので,そのときはもうちょっと変更が必要になると思います.

Linuxのソースのうち修正した箇所

本当はかなり書き換えたのですが,整理してみると,最低限以下の変更をすれば動くことが分かりました.

arch/mips/am5120/prom.c

RAMが16MBになっているので,8MBにします.am5120_envpのmemsizeの次が"0x001000000"となっているので,"0x000800000"に変更.

drivers/net/am5120sw/swdrv.c

スイッチの設定.そのままだと,WANとLANのポートが同じグループに属していてルーティングも何もできませんでした.

static long vlan[~] = { 0x5E, 0x41, 0,~ となっているのを

static long vlan[~] = { 0x4f, 0x50, 0,~ と修正.demo boardと同じですね.

あと,MACアドレスを変えたければ,if5120.hを編集.

drivers/mtd/maps/mx29lv320b.c

フラッシュメモリを使うために.

pnc2000.cあたりをコピーして変えたほうが楽.本来ならbbr-4mg用のソースを作るべきだけど,Makefile書き換えたり色々めんどいので,見送り.というか,ソースファイルがチップ名なのはおかしい気が….

CFIは消したいので,cfi_probeじゃなくてamd_flashを直接呼ぶ.

drivers/mtd/chips/amd_flash.c

サイズ削減のため使ってないチップのデータを配列からごっそり消します.AM29LV160DBさえ残してあればOKです.(個体によって乗ってるメモリが違う可能性があるかも…)

修正しなくても動くはずですが,カーネルサイズがギリギリなので….

net/ipv4/devinit.c

CONFIG_SYSCTLが有効ならば起動後にも変更できますが,カーネルのサイズがかなり大きくなるのでハードコーディングします.ip_forwardingをデフォルトでONに.

ipv4_devconf_dflt={.... , .forwarding=1};

真っ当な方法があるかもしれないので,情報求む.

.config

出来る限り無くても良いものを消します.圧縮されたカーネルにファームウェアのチェック用のデータをつけた状態で,512KBに収まらないとフラッシュメモリには入れられません.RAMディスクに割り当てるメモリのサイズも設定.

前もってarch/mips/config.inのADM5120のところからPCI関係を消しておかないとPCIが無効にならないかも?

編集し終わったら,make configを実行して,質問には全部エンターのみで.本当はmake menuconfigでやるべきなのでしょうが動かなかったので.

アプリケーション

busybox

最新版を入れます.新しいやつの方がサイズを小さくできます.

AP/mkimg/app_6104ipc_script

ファイルシステムに書き込む内容を,top.6104ipc以下に作るスクリプト.いらないものを消します.

AP/mkimg/mk6104k

top.6104ipc以下のファイルを書き込んだファイルシステムのイメージを作って,bzip2で圧縮するスクリプト.

RAMディスクのサイズが5Mになっているので3MBくらいにする.

RAMDISKSIZE=3072

FreeBSDな人はext2fsをnewfsできないので,何処かのLinuxマシンで空のイメージを作ってきて持ってくる(^^;.そのままだとイメージがマウントできないので,mdconfigしてマウントするように.もちろん,linuxの開発環境をports等から入れておく.

make

MIPS用のgccがあるところにパスを通しておく.あと,target.defを編集./export/tools/binの中を参照している箇所(arch/mips/Makefile)もあるので書き換えるかリンクを張りましょう….

あとは,6104IPC-BUILDを実行.アプリケーションのmakeに時間がかかったりエラーが出るかもしれないので,APディレクトリ以下のいらないものを削除したほうが良いかもしれません.

rootでやらないと途中で"Make appimg FAIL"と出て止まるので,rootで作業するか,止まったらrootでAP/mkimg/mk6104kのスクリプトだけ実行して,一般ユーザに戻ってから,linux-2.4.18-admディレクトリでmake.

imageディレクトリに知らないルータ用のファームウェアが出力されますが,見なかったことにして,Linuxのディレクトリのvmlinux.binを使います.

転送

フラッシュメモリには書き込まず,直接メモリ上にvmlinux.binを配置して,カーネル内にジャンプさせます.フラッシュメモリは変更されないので,一度電源を切ったり再起動すると,元のファームウェアが起動します.

とりあえず,コンパイル済みのbbr-4mg/vmlinux.binを置いておきます.iptablesとかも入っているので最低限の機能を持ったルータくらいには使えるでしょうか.

フラッシュメモリへのインストールはまた今度.

起動したときのメッセージを書いておきます.



LINUX started...
ADM5120 Demo board
CPU revision is: 0001800b
Primary instruction cache 8kb, linesize 16 bytes (2 ways)
Primary data cache 8kb, linesize 16 bytes (2 ways)
Linux version 2.4.18-MIPS-01.00 (root@vaio) #1111 イミ 9キ 20 01:58:40 珵ST 2005
am5120_setup() starts.
System no PCI BIOS
Determined physical RAM map:
 memory: 00e0f000 @ 001f1000 (usable)
Initial ramdisk at: 0x80154000 (493858 bytes)
On node 0 totalpages: 4096
zone(0): 4096 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/ram0 console=ttyS0
CPU clock: 175MHz
Calibrating delay loop... 174.48 BogoMIPS
Memory: 14128k/14396k available (1193k kernel code, 268k reserved, 568k data, 56
k init, 0k highmem)
Dentry-cache hash table entries: 2048 (order: 2, 16384 bytes)
Inode-cache hash table entries: 1024 (order: 1, 8192 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 4096 (order: 2, 16384 bytes)
Checking for 'wait' instruction...  available.
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
pty: 256 Unix98 ptys configured
HDLC line discipline: version $Revision: 1.1.1.1 $, maxframe=4096
N_HDLC line discipline registered.
block: 64 slots per queue, batch=16
RAMDISK driver initialized: 16 RAM disks of 5120K size 1024 blocksize
loop: loaded (max 8 devices)
ADM5120 Switch Module Init
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 1024 bind 1024)
ip_conntrack version 2.1 (128 buckets, 1024 max) - 360 bytes per conntrack
ip_tables: (C) 2000-2002 Netfilter core team
ipt_recent v0.2.3: Stephen Frost <sfrost@snowman.net>.  http://snowman.net/proje
cts/ipt_recent/
ipt_time loading
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
LED & GPIO Driver v1.0
RAMDISK: bzip2 compressed image found at block 0
bz2_load()...OK.
Freeing initrd memory: 482k freed
VFS: Mounted root (ext2 filesystem).
Freeing prom memory: 0kb freed
Freeing unused kernel memory: 56k freed

BusyBox v1.00-pre2 (2004.03.07-08:52+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

#

最後に

最初はBBR-4MGのファームウェアを解析して遊んでたのですが,最近,ファームウェアのダウンロードページに「解析するな」というライセンス条項が表示されるようになったので,解析は止めてLinuxを入れました.

ついでに,BAFFALOが公開している標準のファームウェア,どうも中身が怪しいです.ちょっと見ただけで,バッファオーバーフローするバグがあったので,BAFFALOにメールを送って報告しておきました.その問題は修正されたんでしょうが,上記の「解析するな」のラインセンスが表示されるようになったので,実際どうなったのかは見てません.他のバグが無いことを祈るばかりです.

……他にもこのファームウェアは色々気になったところはあったけど,見なかったことにします.

この文書の履歴

Copyright © 瓶詰堂 all rights reserved.