« ネットワークネームスペース機能使用時の Trema 停止エラー軽減方法 | トップページ | MZK-WNH/MZK-W300NH2 用 OpenWrt を OpenFlow 1.0 スイッチにカスタマイズする »

2013年3月17日 (日)

OpenWrt (trunk 版 r36041)を MZK-W300NH2 用にビルドしてみました

 [2013/6/8 追記: trunk 版のコードに大幅な変更が入っており本記事の方法は使えなくなっています。本記事のコメント欄、および新しい記事「◆ OpenWrt の trunk 版(r36853) を Planex MZK-W300NH2 用にビルドしてみました」を参照ください]

OpenWrt の trunk 版だと PLANEX MZK-W300NH2 対応がすでにされているというコメントをいただいたのでビルドに挑戦してみました。しかし、そのままだとファームウェアイメージのファイルができず少し修正が必要でした。

開発中ブランチである trunk 版なので今後どういう修正が入ってくるか分かりませんが、現時点についての参考として書いておきます。

■使用したソース

ソースの入手方法の本家情報はココ:
https://dev.openwrt.org/wiki/GetSource
このページにて「Development branch」の箇所が最新の開発ブランチ(trunk)です。

以下の手順でソースを入手しました:

$ mkdir -p ~/openwrt
$ cd ~/openwrt
$ svn co svn://svn.openwrt.org/openwrt/trunk/

確認に用いたソースのバージョンですが、svn info で確認すると以下のものです。
Revision: 36041

■ビルド結果

ほとんど Attitude Adjustment のビルド方法と変わらないのでビルドの仕方の詳細ははぶきます。

make menuconfig にて、MZK-W300NH2 が含まれるはずの rt305x を指定してビルドすればよいはずですが、make の完了後にファームウェアのファイルを確認してみると作成されていません。

$ ls ~/openwrt/trunk/bin/ramips/*mzk*
ls: /home/lubun/openwrt/trunk/bin/ramips/*mzk* にアクセスできません: そのようなファイルやディレクトリはありません

■ファームウェアのイメージファイルが作成されない原因

ビルドするときの make コマンドの引数に V=99 をつけて出力させたログを確認すると、カーネルのファイルサイズの上限チェックでひっかかっていました。
以下、ビルド時のログから MZK-W300NH2 のファームウェアイメージを作ろうとしている箇所の抜粋です。
赤字のところが上限チェックで出たメッセージ:

cp /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2
/home/lubun/openwrt/trunk/staging_dir/host/bin/patch-cmdline /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2 'board=MZK-W300NH2 console=ttyS1,57600 mtdparts=physmap-flash.0:192k(u-boot)ro,64k(u-boot-env)ro,64k(factory)ro,832k(kernel),2816k(rootfs),128k@0x3e0000(cimage)ro,3648k@0x50000(firmware)'
/home/lubun/openwrt/trunk/staging_dir/host/bin/lzma e /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2 -lc1 -lp2 -pb2 /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.bin.lzma

LZMA 4.65 : Igor Pavlov : Public domain : 2009-02-03
mkimage -A mips -O linux -T kernel -C lzma -a 0x80000000 -e 0x80000000 -n "MIPS OpenWrt Linux-3.7.10" -d /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.bin.lzma /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage
Image Name:   MIPS OpenWrt Linux-3.7.10
Created:      Fri Mar 15 10:25:17 2013
Image Type:   MIPS Linux Kernel Image (lzma compressed)
Data Size:    915975 Bytes = 894.51 kB = 0.87 MB
Load Address: 80000000
Entry Point:  80000000
if [ `stat -c%s "/home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage"` -gt 851968 ]; then echo "Warning: /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage is too big" >&2; else if [ `stat -c%s /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/root.squashfs` -gt 2883584 ]; then echo "Warning: /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/root.squashfs is too big" >&2; else ( dd if=/home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage bs=851968 conv=sync; dd if=/home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/root.squashfs ) > /home/lubun/openwrt/trunk/bin/ramips/openwrt-ramips-rt305x-mzk-w300nh2-squashfs-sysupgrade.bin; fi; fi
Warning: /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage is too big
if [ `stat -c%s "/home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage"` -gt `expr 851968 - 20` ]; then echo "Warning: /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage is too big" >&2; else if [ `stat -c%s /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/root.squashfs` -gt 2883584 ]; then echo "Warning: /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/root.squashfs is too big" >&2; else ( dd if=/home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage bs=`expr 851968 - 20` conv=sync; dd if=/home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/root.squashfs ) > /home/lubun/openwrt/trunk/bin/ramips/openwrt-ramips-rt305x-mzk-w300nh2-squashfs-factory.bin; fi; fi
Warning: /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage is too big
mkedimaximg -i /home/lubun/openwrt/trunk/bin/ramips/openwrt-ramips-rt305x-mzk-w300nh2-squashfs-factory.bin -o /home/lubun/openwrt/trunk/bin/ramips/openwrt-ramips-rt305x-mzk-w300nh2-squashfs-factory.bin -s CSYS -m RN52 -f 0x50000 -S 0xc0000;
stat failed on /home/lubun/openwrt/trunk/bin/ramips/openwrt-ramips-rt305x-mzk-w300nh2-squashfs-factory.bin
Usage: mkedimaximg [OPTIONS...]

Options:
  -s <sig>        set image signature to <sig>
  -m <model>      set model to <model>
  -i <file>       read input from file <file>
  -o <file>       write output to file <file>
  -f <flash>      set flash address to <flash>
  -S <start>      set start address to <start> make[5]: [install] Error 1 (ignored)

ファイルサイズを確認してみると

$ ls -l /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage
-rw-r--r-- 1 lubun lubun 916039  3月 15 10:25 /home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage

■対策

前回作成した Attitude Adjustment 用のパッチを元にイメージファイルの作成方法を変更しました。以下にパッチを置いておきます:
http://ranosgrant.cocolog-nifty.com/openwrt-BB-r36032/mzkw300nh2.patch

パッチの当て方はこんな感じです。

cd ~/openwrt/trunk
wget http://ranosgrant.cocolog-nifty.com/openwrt-BB-r36032/mzkw300nh2.patch
patch -p0 < mzkw300nh2.path

以下、パッチの内容です。

Index: target/linux/ramips/image/Makefile
===================================================================
--- target/linux/ramips/image/Makefile	(revision 36032)
+++ target/linux/ramips/image/Makefile	(working copy)
@@ -407,15 +407,10 @@
 	$(call BuildFirmware/Buffalo2,$(1),wli-tx4-ag300n,WLI-TX4-AG300N,$(call mkmtd/phys,$(mtdlayout_wlitx4ag300n)),917504,2883584)
 endef
 
-mtdlayout_mzkw300nh2=192k(u-boot)ro,64k(u-boot-env)ro,64k(factory)ro,832k(kernel),2816k(rootfs),128k@0x3e0000(cimage)ro,3648k@0x50000(firmware)
-kernel_size_mzkw300nh2=851968
-rootfs_size_mzkw300nh2=2883584
+mtdlayout_mzkw300nh2=192k(u-boot)ro,64k(u-boot-env)ro,64k(factory)ro,896k(kernel),2752k(rootfs),128k(cimage)ro,3648k@0x50000(firmware)
 define BuildFirmware/MZKW300NH2
-	$(call BuildFirmware/Generic,$(1),$(2),$(call mkcmdline,$(3),$(4),$(5)) $(call mkmtd/$(6),$(mtdlayout_mzkw300nh2)),$(kernel_size_mzkw300nh2),$(rootfs_size_mzkw300nh2))
-	$(call CatFiles,$(KDIR)/vmlinux-$(2).uImage,`expr $(kernel_size_mzkw300nh2) - 20`,$(KDIR)/root.$(1),$(rootfs_size_mzkw300nh2),$(call imgname,$(1),$(2))-factory.bin)
-	-mkedimaximg -i $(call imgname,$(1),$(2))-factory.bin \
-		-o $(call imgname,$(1),$(2))-factory.bin \
-		-s CSYS -m RN52 -f 0x50000 -S 0xc0000;
+	$(call BuildFirmware/Generic,$(1),$(2),$(call mkcmdline,$(3),$(4),$(5)) $(call mkmtd/$(6),$(mtdlayout_mzkw300nh2)),917484,2818048)
+	$(call BuildFirmware/Edimax,$(1),mzk-w300nh2,CSYS,RN52,0x50000,0xc0000)
 endef
 
 define BuildFirmware/MZKW300NH2/initramfs

■対策後

修正をして再度ビルドすると trunk/bin/ramips ディレクトリの下に以下のファイルができました。
openwrt-ramips-rt305x-mzk-w300nh2-squashfs-factory.bin
openwrt-ramips-rt305x-mzk-w300nh2-squashfs-sysupgrade.bin

openwrt-ramips-rt305x-mzk-w300nh2-squashfs-factory.bin を用いて MZK-W300NH2 のファームを入れ替えたところ正常に起動できました。

以下の画像は、Windows 7 のコマンドプロンプトから telnet でログインした画面です:

Loginbannar_3

Attitude Adjustment の次にあたる BARRIER BREAKER の文字が見えます。

« ネットワークネームスペース機能使用時の Trema 停止エラー軽減方法 | トップページ | MZK-WNH/MZK-W300NH2 用 OpenWrt を OpenFlow 1.0 スイッチにカスタマイズする »

openwrt」カテゴリの記事

PLANEX MZK-W300NH2」カテゴリの記事

PLANEX MZK-WNH」カテゴリの記事

コメント

OpenWRTにコミットされたのは4月にメンテナンスされた時に
kernelとrootfsが無い変なmtdparts作る仕様になってしまわれたかな…
Makefile見るとカーネルのサイズ計算して作ってそうなのになー…

もしかして: mzkw300nh2_mtd_sizeが未定義?

http://wiki.openwrt.org/doc/techref/flash.layout
firmwareって名前でパーティション作るとそれが勝手に展開されるっぽい
最初のコミットの時点でmtdlayoutが正しくなかったのを修正してくれたときに
もともとのfirmwareとopenwrtに必要なfirmwareをごっちゃにしてdtsを書いた可能性が高い
firmwareを適切な位置に移動して本来のfirmwareをfirmware2とかで定義すれば動くかもしれない

最新のコードはおっかけていないので記事を書いた当時のことでコメントの返信します。

一番の問題は、カーネルサイズが大きくなることを考慮して余裕を持たせ上限値にしていないこと。

Makefile には、
kernel_size_mzkw300nh2=851968
とカーネルサイズが定義されていて、ビルドログには以下のようにこのサイズを上限とするチェックのコードが展開され実行されたことが記録されています:

if [ `stat -c%s "/home/lubun/openwrt/trunk/build_dir/target-mipsel_uClibc-0.9.33.2/linux-ramips_rt305x/vmlinux-mzk-w300nh2.uImage"` -gt 851968 ];

記事中にも書いてあるように vmlinux-mzk-w300nh2.uImage のサイズを確認すると、 kernel_size_mzkw300nh2=851968 を超えてしまっています。このため、Warning が出力されてファームウェアのファイルを生成するための処理がスキップされています。

管理人様ご連絡ありがとうございます。
昨日の朝、投稿を見つけまして、SVNを見たところカーネル載せ替えっぽい
タイミングで色々変わっていたので、実機がない中でコメントしておりました

当該のコードは管理人様のコミットした内容でも無いので
場違いと思いますが、実機がある中でシリアルを接続して
確認いたしました所、上記で指摘したパーティショニングの問題ではなく
trunk/target/linux/ramips/patches-3.8/0208-owrt-mtd-split.patch
のfind_uimage_sizeの応答がなぜか負になっているようでした。
バイナリエディタで覗くと確かに先頭にUBOOT_MAGICが入っており、
そこから12バイト進んだ所にカーネルのサイズが見えるので、
pr_errを仕込んで少し見ていこうと思います。

れ@さん、情報ありがとうございます。trunk ブランチの以下の変更の一覧を見ると r36160 から ramips への変更が大量に入っていて私が書いた記事は完全に古くなってますね。
https://dev.openwrt.org/log/trunk?action=stop_on_copy&mode=stop_on_copy&rev=36200&stop_rev=&limit=100

r36169 の修正で trunk/target/linux/ramips/image/Makefile はごそっと手が入っていて r36041 とはすっかり別物。差分は以下の URLで確認できます:

r36169 [ramips] add new image/Makefile
https://dev.openwrt.org/changeset?old_path=%2Ftrunk&old=36169&new_path=%2Ftrunk&new=36169&sfp_email=&sfph_mail=

もう少しおってみると、各機種の違いを定義ファイルで記述する方式に変更していますね。
C言語のソースだったり、Makefile に書いていたりとバラバラに書いていたのが、1ファイルにまとめられるので保守性が良くなっています(と、思います)。

r36168 [ramips] add the dts files that describe the boards in future
https://dev.openwrt.org/changeset?old_path=%2Ftrunk&old=36168&new_path=%2Ftrunk&new=36168&sfp_email=&sfph_mail=

MZK-W300NH2 の定義情報のソース:
https://dev.openwrt.org/browser/trunk/target/linux/ramips/dts/MZK-W300NH2.dts?rev=36168

管理人様、ご丁寧にsvnlogまで辿って頂いてありがとうございます。
以下、長文失礼いたします。

まだ追っている最中ではありますが、概ね問題が見えてまいりました。
以前、投稿されているイメージからブートし、mtd7をddで取得した所、
U-bootのMAGICが0x14バイトずれており、これはmkedimaximgで
ヘッダを付与している為だと考えられます。その結果、ヘッダを認識できず
64KB毎にhsqsのヘッダを検索する処理に流れ、そこでも発見できないので
カーネルパニックになっていると思われます。
Makefileを読んだ感じ、CSYS、もしくはRSDKで始まる場合をedimaxの
イメージとして0x14バイト更に進めてカーネルのサイズを取得するか、
lzma圧縮済みのカーネルに正しいパディングをし、rootfsを検出できる
ようにするかの2択ではないかと感じました。

れ@さん、解析お疲れさまです。

他のプラットフォームだとどうなのか少し調べてみました。
以下の lantiq の場合の mtdpart.c への修正だと、先頭が UBOOT_MAGIC でない場合の処理が入っていました。

https://dev.openwrt.org/browser/trunk/target/linux/lantiq/patches-3.8/0041-owrt-mtd-split.patch?rev=36014

ramips では 0x14 ずらしたところから読む処理があってよいと思います。

管理人様
とりあえずmake後、mtdpart.cの関数を置き換えてmtdpart.oを削除して
もう一度makeを行う方法で、起動するROMができることを確認いたしました。
make cleanすると戻ってしまう上行数も変わらないのでpatch側を書き換えた
方が楽かもしれません。
http://pastebin.com/STVUa484
/etc/system/wirelessが作られていないのでwifiが生きているかは
未確認ですが、有線は正しくルーティングしている模様です。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1776113/50809001

この記事へのトラックバック一覧です: OpenWrt (trunk 版 r36041)を MZK-W300NH2 用にビルドしてみました:

« ネットワークネームスペース機能使用時の Trema 停止エラー軽減方法 | トップページ | MZK-WNH/MZK-W300NH2 用 OpenWrt を OpenFlow 1.0 スイッチにカスタマイズする »

最近のトラックバック

無料ブログはココログ