最近又從淘寶入手了一臺改過機的水星 MW4530R 雙頻無線路由器,原廠、Openwrt雙Flash,雙系統。原廠固件Flash 8M,Openwrt固件Flash 16M。Openwrt官方並沒有提供對MW4530R的支持,但它比TPLink WDR4300 硬件只少了一個usb口,所以4530的固件都是從4300固件修改來的。我買的這臺機子裏刷的是思山論壇某個同學自己編譯的固件,裏邊集成了一堆我從來不用的包和功能,我怎麼能忍得了呢,於是決定自己動手定製自己的固件。好在之前有折騰WR703N的經驗,只把需的軟件包和做好的配置文件(ADSL,無線AP 等)集成到固件裏,刷好機直接用,不用再折騰。既然要動手就想徹底點,向openwrt官方源碼里加入對MW4530R支持,直接編譯出MW4530R的可用的固件。經過這兩天的研究搞定了,現把方法共享一下。菜鳥一個有錯誤歡迎批評指正。
先簡單說明一下思路,方便您理解後邊的操作。MW4530R本身就是水星出的WDR4300的馬甲,那就在Openwrt源碼中給WDR4300套上個馬甲就是MW4530R了。我是基於官方branches/attitude_adjustment源碼做的,大概需要以下幾步:
1.新增MW4530R Profile,在make menuconfig時選擇
2.內核中添加MW4530R設備的識別(只是識別,代碼還用WDR4300,馬甲嗎)
3.修改固件內的腳本,加入MW4530R支持,以便正確配置固件
4.編譯完成後生成MW4530R的固件
上述操作的第2步我已經做成了patch,這個patch可能會隨着openwrt的更新失效。不過我使用的是分支代碼,基於不會有太大的改對或增加新設備支持,所以這種可能是比較小的。其它幾步的操作要分別對下面的文件進行修改:
1
2
3
4
5
6
7
|
target /linux/ar71xx/generic/profiles/tp-link .mk target /linux/ar71xx/base-files/lib/ar71xx .sh target /linux/ar71xx/base-files/lib/upgrade/platform .sh target /linux/ar71xx/base-files/etc/uci-defaults/leds target /linux/ar71xx/base-files/etc/uci-defaults/network target /linux/ar71xx/base-files/etc/diag .sh target /linux/ar71xx/image/Makefile |
在開始之前提些建議給您。先準備好svn代碼,然後選擇一個設備進行一次完整的編譯,這個過程中會下載編譯內核、包的源碼,這樣可以保證製作MW4530固件的過程比較順利節省時間。另外openwrt源碼結構很模塊化,所以不用每次修改之後都 make clean然後再make 太耗時,假如你只修改了target文件夾裏的內容,只需要make target/linux/clean,然後再make 就可以生效;如果修改了tools的源碼只需要 make tools/clean;如果修改了某個package,執行 make package/<包名>/clean 即可。
平時工作娛樂都是用linux,整個過程是在Linuxmint14 64位下進行的。
準備源碼過程就不細說了按順序執行下面命令:
1
2
3
|
svn
export
svn: //svn .openwrt.org /openwrt/branches/attitude_adjustment/ . /scripts/feeds
update -a . /scripts/feeds
install
-a |
下面所有的命令都以attitude_adjustment爲當前目錄,下面正式開始。
1.
target/linux/ar71xx/generic/profiles/tp-link.mk
在文件最後添加以下內容:
1
2
3
4
5
6
7
8
9
|
define
Profile /MW4530R NAME:=MERCURY
MW4530R PACKAGES:=kmod-usb-core
kmod-usb2 kmod-ledtrig-usbdev endef define
Profile /MW4530R/Description Package
set
optimized for
the MERCURY MW4530R. endef $( eval
$(call Profile,MW4530R)) |
刪除臨時目錄
1
|
rm
. /tmp
-rf |
執行make menuconfig 在Target profile 中就可以找到MERCURY MW4530R了
注:如果您修改了Profile的名字MW4530R,要刪除 tmp 才能生效
2.
這步我提供了patch,下載後放入 target/linux/ar71xx/patches-3.3/ 下即可。
下載:999-MIPS-ath79-MW4530R-support.patch
手動修改比較麻煩,於是做了patch自動完成,只修改了兩個文件,./target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wdr4300.c 和內核源碼目錄中的arch/mips/ath79/machtypes.h,具體修改的內容打開patch一看便知。
3.
這一步要修改的這些腳本都是在刷機後,固件啓動過程中用到的,也要添加對MW4530R的識別。
打開 target/linux/ar71xx/base-files/lib/ar71xx.sh 找到
1
2
3
|
"430000" *) model= "TP-Link
TL-WDR4300" ;; |
在其下添加以下三行
1
2
3
|
"453000" *) model= "MERCURY
MW4530R" ;; |
再找到
1
2
3
|
* "TL-WDR3600/4300/4310" ) name= "tl-wdr4300" ;; |
在其下添加
1
2
3
|
* "MW4530R" ) name= "mw4530r" ;; |
注:這裏引號內的mw4530r 和下面其它腳本中要修改的內容一致
target/linux/ar71xx/base-files/lib/upgrade/platform.sh
找到
1
|
tl-wdr4300
| \ |
在其下添加
1
|
mw4530r
| \ |
注:不修改這個文件web頁面刷機會提示固件不正確。
target/linux/ar71xx/base-files/etc/uci-defaults/leds
找到:
1
2
3
4
5
|
tl-wdr4300) ucidef_set_led_usbdev
"usb1"
"USB1"
"tp-link:green:usb1"
"1-1.1" ucidef_set_led_usbdev
"usb2"
"USB2"
"tp-link:green:usb2"
"1-1.2" ucidef_set_led_wlan
"wlan2g"
"WLAN2G"
"tp-link:blue:wlan2g"
"phy0tpt" ;; |
在其下添加:
1
2
3
4
|
mw4530r) ucidef_set_led_usbdev
"usb"
"USB"
"mercury:green:usb"
"1-1" ucidef_set_led_wlan
"wlan2g"
"WLAN2G"
"tp-link:blue:wlan2g"
"phy0tpt" ;; |
注:mw4530r就一個usb口,所以設置一個就可以了。設備指定爲1-1,即使這一個usb口上只接usb hub,usb燈也會亮,否則只有在hub一口上接usb設備時才亮。另make menuconfig -> Kernel modules->LED modules 下 kmod-ledtrig-usbdev 要選中。
target/linux/ar71xx/base-files/etc/uci-defaults/network
找到:
1
|
tl-wdr4300|\ |
在其下添加
1
|
mw4530r|\ |
注:不修改此文件無法初始化網絡
target/linux/ar71xx/base-files/etc/diag.sh
找到
1
2
3
4
|
tl-wdr4300
| \ tl-wr703n) status_led= "tp-link:blue:system" ;; |
其下添加
1
2
3
|
mw4530r) status_led= "mercury:blue:system" ;; |
注:不修改此文件設備系統指示燈不能正常工作
4.
target/linux/ar71xx/image/Makefile
找到
1
|
$( eval
$(call SingleProfile,TPLINK-LZMA,$(fs_64kraw),TLWDR4300V1,tl-wdr4300-v1,TL-WDR4300,ttyS0,115200,0x43000001,1,8Mlzma)) |
在其下添加
1
|
$( eval
$(call SingleProfile,TPLINK-LZMA,$(fs_64kraw),MW4530R,mw4530r,MW4530R,ttyS0,115200,0x45300001,1,8Mlzma)) |
解釋下這裏邊的部分參數。第一個MW4530R是Profile標識,要和第一步中的Profile名字一樣;第二個mw4530r是生成固件的名字;第三個MW4530R是固件啓動時傳給內核的board參數的值,要和第2步Patch文件中MIPS_MACHINE(ATH79_MACH_MW4530R, “MW4530R” 裏一致。
如果你的設備Flash升級到了16M,就將上面的8Mlzma改爲16Mlzma,同時修改mktplinkfw工具添加16M Layout支持。
./tools/firmware-utils/src/mktplinkfw.c
找到
1
2
3
4
5
6
|
},
{ .id
= "8Mlzma" , .fw_max_len
= 0x7c0000, .kernel_la
= 0x80060000, .kernel_ep
= 0x80060000, .rootfs_ofs
= 0x100000, |
在其下添加
1
2
3
4
5
6
|
},
{ .id
= "16Mlzma" , .fw_max_len
= 0xfc0000, .kernel_la
= 0x80060000, .kernel_ep
= 0x80060000, .rootfs_ofs
= 0x100000, |
然後要重編譯tools,清空之前編譯的內容,重新編譯固件生效
1
|
make
tools /clean |
至此添加MW4530R支持的工作基本都就完成,可以編譯固件了
1
2
|
make
menuconfig #選擇
MERCURY MW4530R make
-j4 V=99 |
注:j 後是執行編譯的任務數,指定爲cpu核數。如果make執行失敗,就再執行一次如果多次都失敗那就是源碼改的有問題了
編譯完成後會在 attitude_adjustment/bin/ar71xx 目錄下生成 openwrt-ar71xx-generic-mw4530r-squashfs-sysupgrade.bin openwrt-ar71xx-generic-mw4530r-squashfs-factory.bin 兩個固件文件。
如果要給固件添加配置文件,把編輯好的配置文件放到 ./files/ 目錄,此目錄相當於固件內的/目錄。
比如想修改固件的主機名,進入openwrt系統編輯好/etc/config/system 文件,放到files/etc/config/ 下即可,其它同理。
把我編譯的固件也共享出來吧,分別用16Mlzma和8Mlzma編譯出來的兩個固件,僅僅供測試學習,個人用戶不建議用。
主要改動:
1.主機名改爲MW4530R,集成並默認bootstrap界面,時區改爲上海
2.啓用無線,SSID 改爲MW4530R 和MW4530R 5G
3.集成minidlna aria2(1.17.0) samba 和 web配置
4.busybox支持中文,命令歷史,ctrl-r 命令歷史反查
5.按reset鍵恢復默認配置,wps鍵未定義
openwrt-ar71xx-generic-mw4530r-16m-squashfs-sysupgrade
openwrt-ar71xx-generic-mw4530r-8m-squashfs-sysupgrade