openwrt补丁
http://wiki.openwrt.org/doc/devel/patches
中文文档:http://andelf.diandian.com/post/2013-05-22/40050677370
首先,如果我们的补丁是一个文件的话,可以将它们放置在openwrt/target/下面,这儿的文件一般情况下就是直接拷贝到build_dir中适当地地方去了,如下图。
而使用quilt制作的补丁文件,则是在需要修改一些Makefile或者Kconfig或者不是自己独有的文件情况下才需要的。
aaarticlea/png;base64,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" alt="" />
Working with patches
OpenWrt Buildroot integrates quilt for easy patch management. This document outlines some common patching tasks like adding a new patch or editing existing ones.
Prepare quilt configuration
In order to let quilt create patches in OpenWrts preferred format, a configuration file .quiltrc
containing common diff and patch options must be created in the local home directory.
cat > ~/.quiltrc <<EOF
QUILT_DIFF_ARGS="--no-timestamps --no-index -pab --color=auto"
QUILT_REFRESH_ARGS="--no-timestamps --no-index -pab"
QUILT_PATCH_OPTS="--unified"
QUILT_DIFF_OPTS="-p"
EDITOR="nano"
EOF
EDITOR
specifies the preferred editor for interactive patch editing- The other variables control the patch format property like a/, b/ directory names and no timestamps
- FreeBSD does not support the
--color=auto
option and-pab
must be written as-p ab
Adding a new patch
To add a completely new patch to an existing package example start with preparing the source directory:
make package/example/{clean,prepare} V=s QUILT=1 |
For host-side packages, you may want to detail the make target:
make package/example/host/{clean,prepare} V=s QUILT=1 |
This unpacks the source tarball and prepares existing patches as quilt patch series (if any). The verbose output will show where the source got extracted.
Change to the prepared source directory.
cd build_dir/target-*/example-* |
Note : It can happen that you need to go one level lower as the source is extracted in build_dir/target-*/BUILD_VARIANT/example-* . This happens when multiple build variants of a package are defined in the Makefile.
Apply all existing patches using quilt push.
quilt push -a |
Create a new, empty patch file with the quilt new command:
quilt new 010-main_code_fix.patch |
- The name should start with a number, followed by a hyphen and a very short description of what is changed
- The choosen number should be higher than any existing patch - use quilt series to see the list of patches
- The patch file name should be short but descriptive
After creating the empty patch, files to edit must be associated with it. The quilt add command can be used for that - once the file got added it can be edited as usual.
A shortcut for both adding a file and open it in an editor is the quilt edit command:
quilt edit src/main.c |
src/main.c
gets added to010-main_code_fix.patch
- The file is opened in the editor specified with
EDITOR
in.quiltrc
Repeat that for any file that needs to be edited.
After the changes are finished, they can be reviewed with the quilt diff command.
quilt diff |
If the diff looks okay, proceed with quilt refresh to update the 010-main_code_fix.patch
file with the changes made.
quilt refresh |
Change back to the toplevel directory of the buildroot.
cd ../../../ |
To move the new patch file over to the buildroot, run update on the package:
make package/example/update V=s |
Finally rebuild the package to test the changes:
make package/example/{clean,compile} package/index V=s |
If problems occur, the patch needs to be edited again to solve the issues.
Refer to the section below to learn how to edit existing patches.
Edit an existing patch
Start with preparing the source directory:
make package/example/{clean,prepare} V=s QUILT=1 |
Change to the prepared source directory.
cd build_dir/target-*/example-* |
List the patches available:
quilt series |
Advance to the patch that needs to be edited:
quilt push 010-main_code_fix.patch |
- When passing a valid patch filename to push, quilt will only apply the series until it reaches the specified patch
- If unsure, use quilt series to see existing patches and quilt top to see the current position
- If the current position is beyound the desired patch, use quilt pop to remove patches in the reverse order
Edit the patched files using the quilt edit command, repeat for every file that needs changes.
quilt edit src/main.c |
Check which files are to be included in the patch:
quilt files |
Review the changes with quilt diff.
quilt diff |
If the diff looks okay, proceed with quilt refresh to update the current patch with the changes made.
quilt refresh |
Change back to the toplevel diretory of the buildroot.
cd ../../../ |
To move the updated patch file over to the buildroot, run update on the package:
make package/example/update V=s |
Finally rebuild the package to test the changes:
make package/example/{clean,compile} package/index V=s |
Adding or editing kernel patches
The process for modifying kernel patches is the same as for packages, only the make targets and directories differ.
For the kernel, an additional subdirectory for patches is used, generic/
contains patches common to all architectures and platform/
contains patches specific to the current target.
To prepare the kernel tree, use:
make target/linux/{clean,prepare} V=s QUILT=1 |
For Attitude Adjustment, the source tree is in the linux-architecture subdirectory:
cd build_dir/linux-*/linux-3.* |
For Barrier Breaker (trunk), the source tree is in the target-architecture subdirectory (potentially with a subarch):
cd build_dir/target-*/linux-*/linux-3.* |
Moving the changes back over to the buildroot tree from the build tree is done with:
make target/linux/update package/index V=s |
(
Patches should be named with the correct prefix, platform/000-abc.patch
or generic/000-abc.patch. If not the update may not work correctly.)
Afterwards, if we want to verify whether our patch is applied or not, we can go to the top level directory with
cd ../../../../ |
and preparing again the linux folder for some modification with
make target/linux/{clean,prepare} V=s QUILT=1 |
During this process all the applied patched will be shown, ours being among them, preceeded by generic/ or platform/ depending on what directory we placed the patch. Another way of retrieving the applied patches is through
quilt series |
as explained on the previous sections, after having made make target/linux/{clean,prepare} …
Adding or editing toolchain patches
For example, gcc:
To prepare the tool tree, use:
make toolchain/gcc/{clean,prepare} V=99 QUILT=1 |
The source tree depends on chosen lib and gcc :
cd build_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1/gcc-4.3.3 |
Refreshing the patches is done with:
make toolchain/gcc/update V=99 |
Refreshing patches
When a patched package (or kernel) is updated to a newer version, existing patches might not
apply cleanly anymore and patch will report fuzz when applying them. To rebase the
whole patch series the refresh make target can be used:
make package/example/refresh V=s |
For kernels, use:
make target/linux/refresh V=s |
Iteratively modify patches without cleaning the source tree
When implementing new changes, it is often required to edit patches multiple times.
To speed up the process, it is possible to retain the prepared source tree between
edit operations.
- Initially prepare the source tree as documented above
- Change to the prepared source directory
- Advance to the patch needing changes
- Edit the files and refresh the patch
- Fully apply the remaining patches using quilt push -a (if any)
- From the toplevel directory, run
make package/example/{compile,install}
ormake target/linux/{compile,install}
for kernels - Test the binary
- If further changes are needed, repeat from step 2.
- Finally run
make package/example/update
ormake target/linux/update
for kernels to copy the changes back to buildroot
Further information
- How To Survive With Many Patches - Introduction to Quilt (PDF) (read online here)
doc/devel/patches.txt · Last modified: 2014/06/27 10:59 by jow
http://andelf.diandian.com/post/2013-05-22/40050677370
为 OpenWrt 加入新设备支持 // Add New Profile To OpenWrt
最近折腾 TL-MR10U, 可直接刷 WR703N 固件, 不过 USB 不能供电, 网络, LED 正常. 所以需要修复下. 记录+教程.
假定已经有了完整 OpenWrt 开发环境. 包括编辑器, 配置好的 quilt 工具.
经过本人实践, 当前(20130522)在互联网上能找到的大部分教程都不靠谱, 或多或少有错误或者坑, 有的干脆就是错的.
配置开发环境
请参考其他文献设置开发环境. 前几篇恰好写过.
简单介绍下 quilt 工具, quilt 是用来管理代码树中的 patch 的, 嵌入式内核开发利器!
请通过软件包管理器安装 quilt. 然后写入以下配置文件到 ~/.quiltrc
, 另外需要 export EDITOR="你编辑利器" .
QUILT_DIFF_ARGS="--no-timestamps --no-index -pab --color=auto"
QUILT_REFRESH_ARGS="--no-timestamps --no-index -pab"
QUILT_PATCH_OPTS="--unified"
QUILT_DIFF_OPTS="-p"
EDITOR="emacs --no-init --quick"
准备工作
假定 ~/openwrt 是你的开发目录, 建议直接在 git branch 下开发.
假设之前已经编译过 bin, 有完整的 .config 和 toolchain.
建立开发 branch: (git 教程自行脑补)
~/openwrt$ git checkout -b add-tl-mr10u-support
清理 tmp 目录!!!!!! 这个是大坑. 直接删除.
~/openwrt$ rm -rvf tmp/
修改 OpenWrt 代码
进入设备硬件目录:
~/openwrt$ cd target/linux/ar71xx
修改以下文件, 里面涉及到 TL-MR10U 固件中设备ID的部分, 是 0x00100101, 这个值从 tp-link 官方网站下载的固件中可以获得.
- base-files/etc/diag.sh
- base-files/etc/uci-defaults/02_network
- base-files/lib/ar71xx.sh
- base-files/lib/upgrade/platform.sh
- config-3.8
- generic/profiles/tp-link.mk
- image/Makefile
新建文件: files/arch/mips/ath79/mach-tl-mr10u.c
, 内容参考 TL-WR703N 设备的文件 mach-tl-wr703n.c, 修改所有出现 wr703n, WR703N 等等大小写混合的部分, emacs 无痛苦完成.
添加 Linux patch
这里就完成了 OpenWrt 的设备支持代码. 为了支持我们的设备, Linux 代码树的部分文件也需要做改动, OpenWrt 采用了 patch 的方式实现.
回退到根目录 ~/openwrt .
清理并准备 patch 树:
~/openwrt$ make target/linux/{clean,prepare} # 后面可加 V=s QUILT=1 参数, 表示静默无输出
进入内核代码目录(其中版本号可能与你的不一致):
~/openwrt$ cd build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.8.12/
这里就是内核代码树了, 里面的代码是已经打过所有 patch 的, 可以用 quilt push
检查看是不是这样:
$ quilt push
File series fully applied, ends at patch platform/902-unaligned_access_hacks.patch
这条输入也告诉我们, 当前最顶的 patch 是 platform/902 (这个是坑啊, 官方文档不带 platform 前缀, 是错的).
为我们的 TL-MR10U 新建个 patch:
$ quilt new platform/920-add-tl-mr10u-support.patch
选择的数字需要大于刚才的那个 902, 然后 quilt 会自动把这个 patch 设置为当前 patch, 所有的改动都针对这个 patch.
然后就是增加代码了
$ quilt edit arch/mips/ath79/Kconfig
$ quilt edit arch/mips/ath79/Makefile
$ quilt edit arch/mips/ath79/machtypes.h
至于怎么改, 参考这些文件里其他硬件的配置, 基本上说 copy TL-WR703N 的就可以了. 保证不重不漏.
然后验证下修改的内容:
$ quilt diff # 查看 diff
$ quilt refresh # 保存所有 diff 到 patch 文件
这个时候我们的 patch 文件还在 build_dir 里, 大概位置是 patches/platform/ 下. 需要同步到 OpenWrt 代码树.
# 退回到顶层工作目录, 执行:
~/openwrt$ make target/linux/update V=s
同步完成后, patch 文件会出现在 target/linux/ar71xx/patches-3.8/
下.
固件工具代码修改
OpenWrt 包含一个 TP-LINK 固件小工具, tools/firmware-utils/src/mktplinkfw.c
, 里面包含 TP-LINK 固件 bin 文件的结构和 md5 hash 验证算法.
修改内容参考 WR703N 就好.
查看效果
这里应该已经完成了所有操作. 可以编译了
# 再次记得, 删除 tmp 目录
~/openwrt$ rm -rvf tmp/
~/openwrt$ make menuconfig
.....
自己编译
所有修改文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh index ed269b2..c279cb3 100755 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -134,6 +134,7 @@ get_status_led() { ;; tl-wdr4300 | \ tl-wr703n | \ + tl-mr10u | \ tl-wr720n-v3) status_led="tp-link:blue:system" ;; diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network index a9a3ff2..01733d9 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -200,6 +200,7 @@ tl-mr3040 |\ tl-wa901nd |\ tl-wa901nd-v2 |\ tl-wr703n |\ +tl-mr10u |\ wndap360 |\ wp543) ucidef_set_interface_lan "eth0" diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh index 194a40b..2ba26e5 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -132,6 +132,9 @@ tplink_board_detect() { "254300"*) model="TP-Link TL-WR2543N/ND" ;; + "100101"*) + model="TP-Link TL-MR10U" + ;; "110101"*) model="TP-Link TL-MR11U" ;; @@ -441,6 +444,9 @@ ar71xx_board_detect() { *"TL-WR720N v3") name="tl-wr720n-v3" ;; + *"TL-MR10U") + name="tl-mr10u" + ;; *"TL-MR11U") name="tl-mr11u" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh index 817123b..8838234 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -154,6 +154,7 @@ platform_check_image() { platform_check_image_openmesh "$magic_long" "$1" && return 0 return 1 ;; + tl-mr10u | \ tl-mr11u | \ tl-mr3020 | \ tl-mr3040 | \ diff --git a/target/linux/ar71xx/config-3.8 b/target/linux/ar71xx/config-3.8 index ea2be6b..389799d 100644 --- a/target/linux/ar71xx/config-3.8 +++ b/target/linux/ar71xx/config-3.8 @@ -61,6 +61,7 @@ CONFIG_ATH79_MACH_RW2458N=y CONFIG_ATH79_MACH_TEW_632BRP=y CONFIG_ATH79_MACH_TEW_673GRU=y CONFIG_ATH79_MACH_TEW_712BR=y +CONFIG_ATH79_MACH_TL_MR10U=y CONFIG_ATH79_MACH_TL_MR11U=y CONFIG_ATH79_MACH_TL_MR3020=y CONFIG_ATH79_MACH_TL_MR3X20=y diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-mr10u.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-mr10u.c new file mode 100644 index 0000000..e3906e1 --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-mr10u.c @@ -0,0 +1,89 @@ +/* + * TP-LINK TL-MR10U board support + * + * Copyright (C) 2011 dongyuqi <729650915@qq.com> + * Copyright (C) 2013 andelf <andelf@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include <linux/gpio.h> + +#include <asm/mach-ath79/ath79.h> + +#include "dev-eth.h" +#include "dev-gpio-buttons.h" +#include "dev-leds-gpio.h" +#include "dev-m25p80.h" +#include "dev-usb.h" +#include "dev-wmac.h" +#include "machtypes.h" + +#define TL_MR10U_GPIO_LED_SYSTEM 27 +#define TL_MR10U_GPIO_BTN_RESET 11 + +#define TL_MR10U_GPIO_USB_POWER 8 + +#define TL_MR10U_KEYS_POLL_INTERVAL 20 /* msecs */ +#define TL_MR10U_KEYS_DEBOUNCE_INTERVAL (3 * TL_MR10U_KEYS_POLL_INTERVAL) + +static const char *tl_mr10u_part_probes[] = { + "tp-link", + NULL, +}; + +static struct flash_platform_data tl_mr10u_flash_data = { + .part_probes = tl_mr10u_part_probes, +}; + +static struct gpio_led tl_mr10u_leds_gpio[] __initdata = { + { + .name = "tp-link:blue:system", + .gpio = TL_MR10U_GPIO_LED_SYSTEM, + .active_low = 1, + }, +}; + +static struct gpio_keys_button tl_mr10u_gpio_keys[] __initdata = { + { + .desc = "reset", + .type = EV_KEY, + .code = KEY_RESTART, + .debounce_interval = TL_MR10U_KEYS_DEBOUNCE_INTERVAL, + .gpio = TL_MR10U_GPIO_BTN_RESET, + .active_low = 0, + } +}; + +static void __init tl_mr10u_setup(void) +{ + u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00); + u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); + + /* disable PHY_SWAP and PHY_ADDR_SWAP bits */ + ath79_setup_ar933x_phy4_switch(false, false); + + ath79_register_m25p80(&tl_mr10u_flash_data); + ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_mr10u_leds_gpio), + tl_mr10u_leds_gpio); + ath79_register_gpio_keys_polled(-1, TL_MR10U_KEYS_POLL_INTERVAL, + ARRAY_SIZE(tl_mr10u_gpio_keys), + tl_mr10u_gpio_keys); + + gpio_request_one(TL_MR10U_GPIO_USB_POWER, + GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED, + "USB power"); + ath79_register_usb(); + + ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0); + + ath79_register_mdio(0, 0x0); + ath79_register_eth(0); + + ath79_register_wmac(ee, mac); +} + +MIPS_MACHINE(ATH79_MACH_TL_MR10U, "TL-MR10U", "TP-LINK TL-MR10U", + tl_mr10u_setup); diff --git a/target/linux/ar71xx/generic/profiles/tp-link.mk b/target/linux/ar71xx/generic/profiles/tp-link.mk index 4ac6ba9..3057cfa 100644 --- a/target/linux/ar71xx/generic/profiles/tp-link.mk +++ b/target/linux/ar71xx/generic/profiles/tp-link.mk @@ -5,6 +5,17 @@ # See /LICENSE for more information. # +define Profile/TLMR10U + NAME:=TP-LINK TL-MR10U + PACKAGES:=kmod-usb-core kmod-usb2 +endef + +define Profile/TLMR10U/Description + Package set optimized for the TP-LINK TL-MR10U. +endef +$(eval $(call Profile,TLMR10U)) + + define Profile/TLMR11U NAME:=TP-LINK TL-MR11U PACKAGES:=kmod-usb-core kmod-usb2 kmod-ledtrig-usbdev diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile index c6b4dc4..d0485b0 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -927,6 +927,7 @@ $(eval $(call SingleProfile,TPLINK,$(fs_64kraw),TLWR941NV3,tl-wr941nd-v3,TL-WR94 $(eval $(call SingleProfile,TPLINK,$(fs_64kraw),TLWR941NV4,tl-wr941nd-v4,TL-WR741ND,ttyS0,115200,0x09410004,1,4M)) $(eval $(call SingleProfile,TPLINK,$(fs_64kraw),TLWR1043,tl-wr1043nd-v1,TL-WR1043ND,ttyS0,115200,0x10430001,1,8M)) +$(eval $(call SingleProfile,TPLINK-LZMA,$(fs_64kraw),TLMR10U,tl-mr10u-v1,TL-MR10U,ttyATH0,115200,0x00100101,1,4Mlzma)) $(eval $(call SingleProfile,TPLINK-LZMA,$(fs_64kraw),TLMR11UV1,tl-mr11u-v1,TL-MR11U,ttyATH0,115200,0x00110101,1,4Mlzma)) $(eval $(call SingleProfile,TPLINK-LZMA,$(fs_64kraw),TLMR11UV2,tl-mr11u-v2,TL-MR11U,ttyATH0,115200,0x00110102,1,4Mlzma)) $(eval $(call SingleProfile,TPLINK-LZMA,$(fs_64kraw),TLMR3020,tl-mr3020-v1,TL-MR3020,ttyATH0,115200,0x30200001,1,4Mlzma)) diff --git a/target/linux/ar71xx/patches-3.8/920-add_tl-mr10u_support.patch b/target/linux/ar71xx/patches-3.8/920-add_tl-mr10u_support.patch new file mode 100644 index 0000000..26e8a00 --- /dev/null +++ b/target/linux/ar71xx/patches-3.8/920-add_tl-mr10u_support.patch @@ -0,0 +1,39 @@ +--- a/arch/mips/ath79/Kconfig ++++ b/arch/mips/ath79/Kconfig +@@ -495,6 +495,16 @@ config ATH79_MACH_EAP7660D + select ATH79_DEV_LEDS_GPIO + select ATH79_DEV_M25P80 + ++config ATH79_MACH_TL_MR10U ++ bool "TP-LINK TL-MR10U support" ++ select SOC_AR933X ++ select ATH79_DEV_ETH ++ select ATH79_DEV_GPIO_BUTTONS ++ select ATH79_DEV_LEDS_GPIO ++ select ATH79_DEV_M25P80 ++ select ATH79_DEV_USB ++ select ATH79_DEV_WMAC ++ + config ATH79_MACH_TL_MR11U + bool "TP-LINK TL-MR11U/TL-MR3040 support" + select SOC_AR933X +--- a/arch/mips/ath79/Makefile ++++ b/arch/mips/ath79/Makefile +@@ -77,6 +77,7 @@ obj-$(CONFIG_ATH79_MACH_RW2458N) += mach + obj-$(CONFIG_ATH79_MACH_TEW_632BRP) += mach-tew-632brp.o + obj-$(CONFIG_ATH79_MACH_TEW_673GRU) += mach-tew-673gru.o + obj-$(CONFIG_ATH79_MACH_TEW_712BR) += mach-tew-712br.o ++obj-$(CONFIG_ATH79_MACH_TL_MR10U) += mach-tl-mr10u.o + obj-$(CONFIG_ATH79_MACH_TL_MR11U) += mach-tl-mr11u.o + obj-$(CONFIG_ATH79_MACH_TL_MR3020) += mach-tl-mr3020.o + obj-$(CONFIG_ATH79_MACH_TL_MR3X20) += mach-tl-mr3x20.o +--- a/arch/mips/ath79/machtypes.h ++++ b/arch/mips/ath79/machtypes.h +@@ -78,6 +78,7 @@ enum ath79_mach_type { + ATH79_MACH_TEW_632BRP, /* TRENDnet TEW-632BRP */ + ATH79_MACH_TEW_673GRU, /* TRENDnet TEW-673GRU */ + ATH79_MACH_TEW_712BR, /* TRENDnet TEW-712BR */ ++ ATH79_MACH_TL_MR10U, /* TP-LINK TL-MR10U */ + ATH79_MACH_TL_MR11U, /* TP-LINK TL-MR11U */ + ATH79_MACH_TL_MR3020, /* TP-LINK TL-MR3020 */ + ATH79_MACH_TL_MR3040, /* TP-LINK TL-MR3040 */ diff --git a/tools/firmware-utils/src/mktplinkfw.c b/tools/firmware-utils/src/mktplinkfw.c index 74a55fd..7596e03 100644 --- a/tools/firmware-utils/src/mktplinkfw.c +++ b/tools/firmware-utils/src/mktplinkfw.c @@ -43,6 +43,7 @@ #define HWID_TL_WA901ND_V1 0x09010001 #define HWID_TL_WA901ND_V2 0x09010002 #define HWID_TL_WDR4900_V1 0x49000001 +#define HWID_TL_MR10U_V1 0x00100101 #define HWID_TL_WR703N_V1 0x07030101 #define HWID_TL_WR720N_V3 0x07200103 #define HWID_TL_WR741ND_V1 0x07410001 @@ -338,6 +339,11 @@ static struct board_info boards[] = { .hw_rev = 1, .layout_id = "4Mlzma", }, { + .id = "TL-MR10Uv1", + .hw_id = HWID_TL_MR10U_V1, +--- a/arch/mips/ath79/machtypes.h ++++ b/arch/mips/ath79/machtypes.h +@@ -78,6 +78,7 @@ enum ath79_mach_type { + ATH79_MACH_TEW_632BRP, /* TRENDnet TEW-632BRP */ + ATH79_MACH_TEW_673GRU, /* TRENDnet TEW-673GRU */ + ATH79_MACH_TEW_712BR, /* TRENDnet TEW-712BR */ ++ ATH79_MACH_TL_MR10U, /* TP-LINK TL-MR10U */ + ATH79_MACH_TL_MR11U, /* TP-LINK TL-MR11U */ + ATH79_MACH_TL_MR3020, /* TP-LINK TL-MR3020 */ + ATH79_MACH_TL_MR3040, /* TP-LINK TL-MR3040 */ diff --git a/tools/firmware-utils/src/mktplinkfw.c b/tools/firmware-utils/src/mktplinkfw.c index 74a55fd..7596e03 100644 --- a/tools/firmware-utils/src/mktplinkfw.c +++ b/tools/firmware-utils/src/mktplinkfw.c @@ -43,6 +43,7 @@ #define HWID_TL_WA901ND_V1 0x09010001 #define HWID_TL_WA901ND_V2 0x09010002 #define HWID_TL_WDR4900_V1 0x49000001 +#define HWID_TL_MR10U_V1 0x00100101 #define HWID_TL_WR703N_V1 0x07030101 #define HWID_TL_WR720N_V3 0x07200103 #define HWID_TL_WR741ND_V1 0x07410001 @@ -338,6 +339,11 @@ static struct board_info boards[] = { .hw_rev = 1, .layout_id = "4Mlzma", }, { + .id = "TL-MR10Uv1", + .hw_id = HWID_TL_MR10U_V1, + .hw_rev = 1, + .layout_id = "4Mlzma", + }, { .id = "TL-WR720Nv3", .hw_id = HWID_TL_WR720N_V3, .hw_rev = 1, |
参考文献
- OpenWrt: Working with patches http://wiki.openwrt.org/doc/devel/patches
- Patchwork [OpenWrt-Devel] ar71xx: add TP-LINK TL-MR10U http://patchwork.openwrt.org/patch/3656/
- 恩山无线配件网: 自己动手,为OpenWrt加入720N的支持 http://www.right.com.cn/forum/thread-100342-1-1.html
修改记录
20130523 去掉了 mach-tl-mr10u.c 中的 MISP_MACHINE 定义中的 v1, 保证各个脚本工作正常.
Merlin添加:
我这儿的操作过程
tf@ubuntu:~/projects/openwrt$ make target/linux/clean
make[] target/linux/clean
make[] -C target/linux clean
tf@ubuntu:~/projects/openwrt$ make target/linux/prepare
make[] target/linux/prepare
make[] -C target/linux prepare
tf@ubuntu:~/projects/openwrt$ cd build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10./
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt push
File series fully applied, ends at patch platform/-unaligned_access_hacks.patch
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt new platform/-modify_spi_gpio_merlin.patch
Patch platform/-modify_spi_gpio_merlin.patch is now on top
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt edit arch/mips/ath79/Makefile
File arch/mips/ath79/Makefile added to patch platform/-modify_spi_gpio_merlin.patch Select an editor. To change later, run 'select-editor'.
. /bin/ed
. /bin/nano <---- easiest
. /usr/bin/vim.basic
. /usr/bin/vim.tiny Choose - []:
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt edit arch/mips/ath79/Kconfig
File arch/mips/ath79/Kconfig added to patch platform/-modify_spi_gpio_merlin.patch
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt diff
--- a/arch/mips/ath79/Kconfig
+++ b/arch/mips/ath79/Kconfig
@@ -, +, @@ config ATH79_MACH_DRAGINO2
bool "DRAGINO V2 support"
select SOC_AR933X
select ATH79_DEV_M25P80
+ select ATH79_DEV_SPI_GPIO
select ATH79_DEV_GPIO_BUTTONS
select ATH79_DEV_LEDS_GPIO
select ATH79_DEV_WMAC
@@ -, +, @@ config ATH79_DEV_M25P80
select ATH79_DEV_SPI
def_bool n +config ATH79_DEV_SPI_GPIO
+ def_bool n
+
config ATH79_DEV_AP9X_PCI
select ATH79_PCI_ATH9K_FIXUP
def_bool n
--- a/arch/mips/ath79/Makefile
+++ b/arch/mips/ath79/Makefile
@@ -, +, @@ obj-$(CONFIG_ATH79_DEV_ETH) += dev-eth.
:
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt refresh
Refreshed patch platform/-modify_spi_gpio_merlin.patch
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ cd ../../../../
tf@ubuntu:~/projects/openwrt$ make target/linux/update V=s
...
xx_generic/linux-3.10./patches/platform/-mdio_bitbang_ignore_ta_value.patch' -> './patches-3.10/-mdio_bitbang_ignore_ta_value.patch'
'/home/tf/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.49/patches/platform/902-unaligned_access_hacks.patch' -> './patches-3.10/902-unaligned_access_hacks.patch'
'/home/tf/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.49/patches/platform/903-modify_spi_gpio_merlin.patch' -> './patches-3.10/903-modify_spi_gpio_merlin.patch'
make[]: Leaving directory `/home/tf/projects/openwrt/target/linux/ar71xx'
make[]: Leaving directory `/home/tf/projects/openwrt/target/linux'
make[]: Leaving directory `/home/tf/projects/openwrt'
tf@ubuntu:~/projects/openwrt$ ls
...
-MIPS-ath79-add-om5p-support.patch
-mdio_bitbang_ignore_ta_value.patch
-unaligned_access_hacks.patch
-modify_spi_gpio_merlin.patch
tf@ubuntu:~/projects/openwrt/target/linux/ar71xx/patches-3.10$
Merlin添加:
如何修改刚刚的903补丁?
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt files platform/-modify_spi_gpio_merlin.patch
arch/mips/ath79/Kconfig
arch/mips/ath79/Makefile
platform/-modify_spi_gpio_merlin.patch
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt refresh
Patch platform/-modify_spi_gpio_merlin.patch is unchanged
//由于Kconfig和Makefile已经在903补丁中的记录了,所以直接使用其它编辑器去修改也可以了。如果files命令时没有文件需要更新到补丁中去,那么需要先quilt edit之。
//这儿使用外部编辑器Geany编辑了Kconfig文件的select ATH79_DEV_SPI_GPIO,最末加上了标记 //merlin
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt edit testMelin
File testMelin added to patch platform/-modify_spi_gpio_merlin.patch
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$ quilt refresh
Refreshed patch platform/-modify_spi_gpio_merlin.patch
tf@ubuntu:~/projects/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.$
结果903补丁的内容为:
--- a/arch/mips/ath79/Kconfig
+++ b/arch/mips/ath79/Kconfig
@@ -, +, @@ config ATH79_MACH_DRAGINO2
bool "DRAGINO V2 support"
select SOC_AR933X
select ATH79_DEV_M25P80
+ select ATH79_DEV_SPI_GPIO //merlin
select ATH79_DEV_GPIO_BUTTONS
select ATH79_DEV_LEDS_GPIO
select ATH79_DEV_WMAC
@@ -, +, @@ config ATH79_DEV_M25P80
select ATH79_DEV_SPI
def_bool n +config ATH79_DEV_SPI_GPIO
+ def_bool n
+
config ATH79_DEV_AP9X_PCI
select ATH79_PCI_ATH9K_FIXUP
def_bool n
--- a/arch/mips/ath79/Makefile
+++ b/arch/mips/ath79/Makefile
@@ -, +, @@ obj-$(CONFIG_ATH79_DEV_ETH) += dev-eth.
obj-$(CONFIG_ATH79_DEV_GPIO_BUTTONS) += dev-gpio-buttons.o
obj-$(CONFIG_ATH79_DEV_LEDS_GPIO) += dev-leds-gpio.o
obj-$(CONFIG_ATH79_DEV_M25P80) += dev-m25p80.o
+obj-$(CONFIG_ATH79_DEV_SPI_GPIO) += dev-spi-gpio.o
obj-$(CONFIG_ATH79_DEV_NFC) += dev-nfc.o
obj-$(CONFIG_ATH79_DEV_SPI) += dev-spi.o
obj-$(CONFIG_ATH79_DEV_USB) += dev-usb.o
--- /dev/null
+++ b/testMelin
@@ -, + @@
+dkdi.sls
对应用程序进行制作补丁patch
make package/utils/xxx/clean V=s
make package/utils/xxx/prepare V=s
这样还没有修改的代码就已经解压到build_dir中了,使用cd build_dir/target.../xxx/到达应用程序目录
使用quiltnew命令新建一个补丁
quilt new 101-test_add_comment.patch
使用quilt edit命令修改某个文件如src/main.c
quilt edit src/main.c
修改完成后保存退出
运行quilt diff看变化前后,
最后运行quilt refresh命令会生成101-test_add_comment.patch
将这个patch文件拷贝到package/utils/xxx/patch下面去,这样在下一次
make package/utils/xxx/prepare V=s
时就会将刚刚的修改应用到该应用程序中了!
openwrt补丁的更多相关文章
- 记录openwrt下补丁apply的过程中出错,但是可以单独打上该补丁
背景: 在openwrt的编译框架下无法正确打上补丁,而单独使用git却可以成功 这个补丁到底与其它补丁有何不同? 该补丁的生成的过程解析: 旧文件:vi 打开旧文件会提示no newline at ...
- 如何为openwrt生成补丁
答:使用quilt工具 步骤如下: 1. 配置quilt $cat> ~/.quiltrc <<EOF QUILT_DIFF_ARGS="--no-timestamps - ...
- openwrt为何需要refresh新增的补丁?
答:为了避免应用新补丁时出现无法应用的问题 如普通package的补丁refresh: make package/example/refresh V=s 如kernel的补丁refresh: make ...
- Openwrt 初探
最近想研究一下Openwrt,于是开始搭建openwrt环境,虽然现在没有现成的板子,但是 可以先编译起来. openwrt的特点是基于下载 -> patch -> 编译 的一个工作模式, ...
- 路由器刷机常见第三方固件及管理前端种类(OpenWrt、Tomato、DD-Wrt)
目前路由器折腾刷机,除了采用各品牌的原厂固件外,第三方路由器固件,基本就是:Tomato.DD-WRT.OpenWRT三种. 基本上所有第三方路由器固件的架构上可分为前端(Frontend)和后端(B ...
- openwrt教程 第一章 物联网&openwrt开发概述
1.1 我们的宗旨 互联网.移动互联网的时代已经过去,物联网的时代已经来临!2014年,是物联网元年,2016年,物联网将达到高潮!为了迎接该潮流,我们工作室(F403科技创意室:http://f40 ...
- 编译openwrt时报错:fstools-2018-01-02-11efbf3b/libfstools/overlay.c: At top level: cc1: error: unrecognized command line option '-Wno-format-truncation' [-Werror]
1. 详细错误信息 [ 11%] Building C object CMakeFiles/fstools.dir/libfstools/overlay.c.o/home/jello/openwrt/ ...
- OpenWrt路由器通过LuCI界面实现Guest SSID功能
转自: http://blog.ltns.info/linux/guest_ssid_over_openwrt_router/ 之前尝试过 Tomato路由器设置VLAN实现Guest SSID功能, ...
- Centos6下编译LEDE/OpenWrt
准备工作 1. 安装依赖软件 这是官方文档提供的依赖列表 yum install subversion binutils bzip2 gcc gcc-c++ gawk gettext flex ncu ...
随机推荐
- 读改善c#代码157个建议:建议13~15
目录: 建议13:为类型输出格式化字符串 建议14:正确实现浅拷贝和深拷贝 建议15:使用dynamic来简化反射实现 一.建议13:为类型输出格式化字符串 有些类型需要我们根据业务需求提供字符串的格 ...
- Entity Framework笔记(一)
最近在看MVC方面的资料,看了几个教程都在使用Entity Framework做数据持久化.之前也听说过这个东西,在微软的网站上看过一个演示视频,但都没怎么去仔细研究.MVC的东西太庞大了,先慢慢熟悉 ...
- [SignalR]初步认识以及安装
原文:[SignalR]初步认识以及安装 1.什么是ASP.NET SignalR? ASP .NET SignalR是一个 ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时 ...
- 【CTO辩论】移动创业大军:谁斗争or变更代理
众创时代.英雄辈出. 但千军万马过独木桥,竞争厮杀也异常残酷.有人说,这个时代不宜创业,由于技术门槛高了.推广难度高了.盈利模式没了.创业变重了.玩法变了...... 也有人说,时势造英雄.天时地利人 ...
- apache 提示You don't have permission to access /test.php on this server.怎样解决
原文:apache 提示You don't have permission to access /test.php on this server.怎样解决 关键字: Apache 403 For ...
- 设计模式--模板方法 And State模式
1.模板方法 钩子: 在抽象基类已经有默认的定义,子类选择是否覆盖它 在模板方法模式中, 抽象基类中使用 钩子函数(子类视情况是否覆盖) 来达到控制模板方法中 流程控制的 目的 设计原则: ...
- 编写可维护的Javascript读书笔记
写在前面:之前硬着头皮参加了java方面的编程规范培训,收货良多,工作半年有余的时候,总算感觉到一丝丝Coding之美,以及造轮子的乐趣,以至于后面开发新功能的时候,在Coding style方面花了 ...
- 《Javascript权威指南》学习笔记之十八:BOM新成就(1)--client存储数据(Web SQL DataBase实现)
使用本地存储和会话存储能够实现简单的对象持久化,能够对简单的键值对或对象进行存储.可是,对于比較复杂的关系数据进行处理时,就要用Web SQL Database.浏览器对Web SQL Databas ...
- 金蝶K3无法创建数据库,请查看该文件夹的错误的解决方法。
无法创建数据库! 检查你的文件夹C:\XXX\DATA是否存在.并且该系统是不低,或SQL Server服务的启动用户不具备<K3ERP\DBFILE>文件夹的写权限.请改动Windows ...
- WebAPI 和 WebService的区别
webapi用的是http协议,webservice用的是soap协议 webapi无状态,相对webservice更轻量级.webapi支持如get,post等http操作 http soap关系 ...