向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的更新失效。不过我使用的是分支代码,基于不会有太大的改对或增加新设备支持,所以这种可能是比较小的。其它几步的操作要分别对下面的文件进行修改:

 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位下进行的。
准备源码过程就不细说了按顺序执行下面命令:

 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
在文件最后添加以下内容:

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))

删除临时目录

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 找到

"430000"*)
 model="TP-Link TL-WDR4300"
 ;;

在其下添加以下三行

"453000"*)
 model="MERCURY MW4530R"
 ;;

再找到

*"TL-WDR3600/4300/4310")
 name="tl-wdr4300"
 ;;

在其下添加

*"MW4530R")
 name="mw4530r"
 ;;

注:这里引号内的mw4530r 和下面其它脚本中要修改的内容一致
target/linux/ar71xx/base-files/lib/upgrade/platform.sh
找到

tl-wdr4300 | \

在其下添加

mw4530r | \

注:不修改这个文件web页面刷机会提示固件不正确。

 

target/linux/ar71xx/base-files/etc/uci-defaults/leds
找到:

 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"
        ;;

在其下添加:

 
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
找到:

tl-wdr4300|\

在其下添加

mw4530r|\

注:不修改此文件无法初始化网络

target/linux/ar71xx/base-files/etc/diag.sh
找到

        tl-wdr4300 | \
        tl-wr703n)
                status_led="tp-link:blue:system"
                ;;

其下添加

         mw4530r)
                status_led="mercury:blue:system"
                ;;

注:不修改此文件设备系统指示灯不能正常工作

4.
target/linux/ar71xx/image/Makefile
找到

 $(eval $(call SingleProfile,TPLINK-LZMA,$(fs_64kraw),TLWDR4300V1,tl-wdr4300-v1,TL-WDR4300,ttyS0,115200,0x43000001,1,8Mlzma))

在其下添加

 $(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
找到

}, {
 .id             = "8Mlzma",
 .fw_max_len     = 0x7c0000,
 .kernel_la      = 0x80060000,
 .kernel_ep      = 0x80060000,
 .rootfs_ofs     = 0x100000,

在其下添加

}, {
 .id             = "16Mlzma",
 .fw_max_len     = 0xfc0000,
 .kernel_la      = 0x80060000,
 .kernel_ep      = 0x80060000,
 .rootfs_ofs     = 0x100000,

 

然后要重编译tools,清空之前编译的内容,重新编译固件生效

 make tools/clean

 

至此添加MW4530R支持的工作基本都就完成,可以编译固件了

 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

向openwrt 源码添加水星MW4530R支持》有30个想法

    1. ring0 文章作者

      openwrt官方的解释是 这个5G 的LED灯是由硬件控制的 不需要用GPIO进行控制。我自己的理解是这个LED灯的硬件设计没有实现GPIO的标准,这个灯是在PCI总线上的 而不是GPIO。没有这个定义很正常。

      回复
  1. pizzamx

    悲了个催,真成砖了,灯全不亮……我刷的是 squashfs-sysupgrade.bin,应该是这个吧?之前刷过别人编译的 openwrt 的

    回复
    1. ring0 文章作者

      买个ttl自己恢复下吧,启动的时候灯都不亮,还是启动了一会之后不亮的,看看能不能搜到路由的无线信号或是有线连上ping下默认ip地址,再用http访问下,看看能不能进failsafe页面,有可能是你脚本改的不对导致脚本没有正确运行,但系统启动起来了。

      回复
      1. pizzamx

        已淘宝 TTL,真是蛋疼啊呵呵……灯亮后全灭,无线肯定是没了,有线能亮灯但 DHCP 不到地址,所以是真砖了大概……主要是我刷了恩山那个 H 大的固件发现 5G 信号为 0,又想着应该刷不出大问题,抱侥幸心理就……唉

        回复
        1. ring0 文章作者

          我觉得应该不会成砖,你把电脑的IP地址改为192.168.1.123,掩码255.255.255.0其它不用管,然后用浏览器访问192.168.1.1,可能就是系统初始化过程中有问题了,如果能打开web页面重新刷下固件就行了。

          回复
          1. pizzamx

            没用,而且拆开以后现在 LAN1 的灯都不亮了(电脑网口还是会亮),我都怀疑 TTL 是否可以救他了……

          2. ring0 文章作者

            ttl 是启动到Uboot里进行恢复,刷机刷的只是系统部分不会刷Uboot,我觉得你的脚本改的有问题,编译没出问题固件一般就不会有问题。我共享出来的固件都是测试过的,完全没问题。

    2. ring0 文章作者

      另外,如果不太了解openwrt的话,编译openwrt 是没必要的,定制模块也是很麻烦的事,如果有failsafe 可以用我编译出来的固件试试

      回复
  2. pizzamx

    经过博主的耐心指点发现问题是我没用 patch 而是自己改源码结果敲错字了,还是最不该错的 profile 名……唉活该啊

    回复
    1. ring0 文章作者

      我觉得官方10分钟就能搞定这个patch,不添加支持肯定有他们的原因,而且我的patch也不一定符合他们的要求,所以……

      回复
      1. adoal

        也许只是因为没人跟他们提过这事呢?毕竟openwrt是个很大的国际化项目,这种本地机型如果没有我们本地的人去提,也许项目的commiter都不知道有这么个机子还需要支持的呢。

        回复
  3. Johnny

    好东西,我也试试看。不过,12.09正式版出来了,应该从正式版拿源码比较稳定吧?

    回复
  4. Johnny

    编译成功了,不过出来好多的文件,麻烦楼主介绍一下,每个文件是做什么用的?openwrt-ar71xx-generic-mw4530r-jffs2-factory.binopenwrt-ar71xx-generic-mw4530r-jffs2-sysupgrade.binopenwrt-ar71xx-generic-mw4530r-squashfs-factory.binopenwrt-ar71xx-generic-mw4530r-squashfs-sysupgrade.bin上面4个基本知道。openwrt-ar71xx-generic-rootfs.tar.gzopenwrt-ar71xx-generic-root.jffs2-128kopenwrt-ar71xx-generic-root.jffs2-256kopenwrt-ar71xx-generic-root.jffs2-64kopenwrt-ar71xx-generic-root.squashfsopenwrt-ar71xx-generic-root.squashfs-64k这上面几个就不清楚了,特别是多少K的openwrt-ar71xx-generic-uImage-gzip.binopenwrt-ar71xx-generic-uImage-lzma.binopenwrt-ar71xx-generic-vmlinux.binopenwrt-ar71xx-generic-vmlinux.elfopenwrt-ar71xx-generic-vmlinux.gzopenwrt-ar71xx-generic-vmlinux.lzmaopenwrt-ar71xx-generic-vmlinux-lzma.elf

    回复
  5. Johnny

    把我编译好的固件给大家分享一下,注意是纯净版的,12.09正式版http://pan.baidu.com/share/link?shareid=988566810&uk=689459529源码地:svn://svn.openwrt.org/openwrt/tags/attitude_adjustment_12.09

    回复
  6. 马圈wz

    大虾。。 这个按按reset键恢复默认配置怎么 弄啊 我这边 添加了复位键支持 Utilities -> <*> restorefactory也没用

    回复

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据