Ubuntu下编译TL-WR743N V2的Openwrt固件-Openwrt新增设备方法
Openwrt中只有TPLINK TL-WR743N/ND的固件,与TL-WR743N V2的硬件差别较大,固件不兼容,因此如果想要支持新版本的固件,需要自己新增设备,进行编译,如下是详细的操作过程。
TL-WR743N V2的硬件与TL-WR703N的硬件比较类似,因此源码参照703源码进行拷贝修改。
环境要求
编译一个可以安装的OpenWrt固件镜像文件(大约8MB大小的),你需要:
- 一个纯净的OpenWrt编译系统大约需要200MB的空间。
- 一个包含feeds的OpenWrt编译系统大约需要300MB的空间。
- 编译feeds中的软件包大约需要2.1GB的空间用于存放下载来的源代码。
- 构建OpenWrt并生成固件文件需要大约3-4 GB的空间。
- 编译OpenWrt需要大约1-4 GB的内存。
以非root用户来进行工作
1、下载源码
git clone git://git.openwrt.org/15.05/openwrt.git
取得最新分支代码,如果要回到15.05主干,则继续执行
git checkout 483dac821788b457d349233e770329186a0aa860
2、配置
cd openwrt
下载并安装所有可用的"feeds",这是为了下载和安装让luci之类的第三方包的源码,如果不进行这步的话配置菜单是没有非openwrt的包给你选的
./scripts/feeds update -a
./scripts/feeds install -a
运行下面的命令让OpenWrt编译系统检查你的编译环境中缺失的软件包:
make defconfig
make prereq
修改openwrt\target\linux\ar71xx\generic\profiles\tp-link.mk
增加743nv2的profile:
define Profile/TLWR743NV2
NAME:=TP-LINK TL-WR743NV2
PACKAGES:=kmod-usb-core kmod-usb2 kmod-ledtrig-usbdev
endef
define Profile/TLWR743NV2/Description
Package set optimized for the TP-LINK TL-WR743NV2.
endef
$(eval $(call Profile,TLWR743NV2))
然后
make menuconfig
选编译的目标系统(Atheros AR7XXX架构,profile为743NV2):
选缺省组件:
编辑完成后点击“save”保存配置文件:
3、修改源文件
make前修改如下文件:
1)修改openwrt\target\linux\ar71xx\image\Makefile,新增及修改部分以粗体表示,下同:
TARGET_DEVICES += tl-mr3020-v1 tl-mr3040-v1 tl-mr3040-v2 tl-mr3220-v2 tl-mr3420-v2
define Device/tl-wr703n-v1
$(Device/tplink-4mlzma)
BOARDNAME := TL-WR703N
DEVICE_PROFILE := TLWR703
TPLINK_HWID := 0x07030101
CONSOLE := ttyATH0,115200
endef
define Device/tl-wr743n-v2
$(Device/tplink-8mlzma)
BOARDNAME := TL-WR743N
DEVICE_PROFILE := TLWR743NV2
TPLINK_HWID := 0x07430102
CONSOLE := ttyATH0,115200
endef
...
TARGET_DEVICES += tl-wr703n-v1 tl-wr743n-v2 tl-wr710n-v1 tl-wr710n-v2 tl-wr720n-v3 tl-wr720n-v4
2)修改openwrt\tools\firmware-utils\src\mktplinkfw.c,增加
#define HWID_TL_WR743N_V2 0x07430102
...
}, {
.id = "TL-WR703Nv1",
.hw_id = HWID_TL_WR703N_V1,
.hw_rev = 1,
.layout_id = "4Mlzma",
}, {
.id = "TL-WR743Nv2",
.hw_id = HWID_TL_WR743N_V2,
.hw_rev = 1,
.layout_id = "8Mlzma",
}, {
.id = "TL-WR720Nv3",
3)修改openwrt\target\linux\ar71xx\base-files\lib\ar71xx.sh
"070301"*)
model="TP-Link TL-WR703N"
;;
"074301"*)
model="TP-Link TL-WR743N"
;;
"071000"*)
...
*"TL-WR703N v1")
name="tl-wr703n"
;;
*"TL-WR743N v2")
name="tl-wr743n"
;;
*"TL-WR710N v1")
4)修改openwrt\target\linux\ar71xx\base-files\lib\upgrade\platform.sh,注意“| \”后不能有空格
tl-wr703n | \
tl-wr743n | \
tl-wr710n | \
5)修改openwrt\target\linux\ar71xx\base-files\etc\diag.sh
tl-wr703n | \
tl-wr743n | \
tl-wr710n | \
6)修改openwrt\target\linux\ar71xx\base-files\etc\uci-defaults\01_leds
增加
tl-wr743n)
ucidef_set_led_netdev "wan" "WAN" "tp-link:green:wan" "eth1"
ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x02"
ucidef_set_led_switch "lan2" "LAN2" "tp-link:green:lan2" "switch0" "0x04"
ucidef_set_led_switch "lan3" "LAN3" "tp-link:green:lan3" "switch0" "0x08"
ucidef_set_led_switch "lan4" "LAN4" "tp-link:green:lan4" "switch0" "0x10"
ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt"
ucidef_set_led_usbdev "usb" "USB" "tp-link:green:3g" "1-1"
;;
7)修改openwrt\target\linux\ar71xx\base-files\etc\uci-defaults\02_network
tl-wdr3500 |\
tl-wr743n |\
tl-wr741nd |\
tl-wr741nd-v4 |\
8)修改openwrt\target\linux\ar71xx\config-3.18
CONFIG_ATH79_MACH_TL_WR703N=y
CONFIG_ATH79_MACH_TL_WR743N=y
CONFIG_ATH79_MACH_TL_WR720N_V3=y
9)拷贝openwrt\target\linux\ar71xx\files\arch\mips\ath79\mach-tl-wr703n.c为mach-tl-wr743n.c进行修改,如下为修改后文件:
10)添加pathch
为了支持我们的设备, Linux 代码树的部分文件也需要做改动, OpenWrt 采用了 patch 的方式实现.
# 清理并准备 patch 树,后面可加 V=s QUILT=1 参数, 表示静默无输出
make target/linux/{clean,prepare}
进入内核代码目录(其中版本号可能与你的不一致):
cd build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.18.36/
这里就是内核代码树了, 里面的代码是已经打过所有 patch 的, 可以用 quilt push 检查看是不是这样:
$ quilt push
File series fully applied, ends at patch patches/platform/907-MIPS-ath79-add-tl-wa901nd-v4-support.patch
新建个 patch,选择的数字需要大于刚才的那个 907,:
$quilt new platform/920-add-tl-wr743-support.patch
修改如下文件,参照其中703的配置拷贝修改:
$ quilt edit arch/mips/ath79/Kconfig
$ quilt edit arch/mips/ath79/Makefile
$ quilt edit arch/mips/ath79/machtypes.h
#验证下修改的内容:
$ quilt diff
# 保存所有修改到 patch 文件
$ quilt refresh
这个时候我们的 patch 文件还在 build_dir 里, 大概位置是 patches/platform/ 下. 需要同步到 OpenWrt 代码树.
# 退回到顶层工作目录, 执行:
~/openwrt$ make target/linux/update V=s
同步完成后, patch 文件会出现在 target/linux/ar71xx/patches-3.18/ 下.
4、执行编译
删除 tmp 目录
$ rm -rvf tmp/
对于第一次编译,请不要开多线程。。。。因为不好排错
make V=99
如果第一次编译成功的话,之后的编译可以充分发挥多核心的优势了
首先执行:
ulimit -s 10240
这个命令是防止爆栈
对make加入多线程编译支持
make V=99 -j线程数
速度比单线程快N倍
第二次编译命令示例:
rm .config
rm -rf tmp
make clean
make defconfig
make menuconfig
ulimit -s 10240
make V=99 -j8
5、编译后的固件
8M固件,15.05正式版,内嵌pptp、luci、DDNS、网络共享:
编译时还碰到一个问题,opkg版本和luci版本不兼容,opkg是随openwrt发行的版本,luci则是通过feed下载的最新版本,新luci调用了最新版本opkg中增加的命令参数“--size”,而旧版本opkg不支持
解决方法:
1)从新openwrt中提取新的补丁:/openwrt/package/system/opkg/patches中拷贝260-add-print-package-size.patch文件到主干版本的对应目录
2)参照新版本修改/openwrt/package/system/opkg/makefile
或者直接把/openwrt/package/system/opkg目录从新版本拷贝到主干版本目录。
如需使固件缺省为中文WEB,修改openwrt/feeds/luci/modules/luci-base/root/etc/config/luci文件:
config core main
option lang zh_cn
固件下载:
openwrt-ar71xx-generic-tl-wr743n-v2