向openwrt 源碼添加水星MW4530R支持

最近又從淘寶入手了一臺改過機的水星 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章