OpenWrt内核打补丁方法
最近在OpenWrt上配置支持IOS的USB tethering,发现开启kmod-usb-net-ipheth后,内核不识别手里的iphone5,经过多方调查,一个偶然机会发现iphone4是识别的,因此推测客户提供的,基于OpenWrt attitude adjustment分支的SDK,其3.3.8的内核比较老了。
于是看了下drivers/net/usb/ipheth.c,果然,没有iphone5的支持
#define USB_VENDOR_APPLE 0x05ac
#define USB_PRODUCT_IPHONE 0x1290
#define USB_PRODUCT_IPHONE_3G 0x1292
#define USB_PRODUCT_IPHONE_3GS 0x1294
#define USB_PRODUCT_IPHONE_4 0x1297
#define USB_PRODUCT_IPHONE_4_VZW 0x129c
#define USB_PRODUCT_IPHONE_4S 0x12a0
此时的思路首先是升级内核,但工作量巨大,与其如此,不如四两拨千斤,直接修改内核,添加上iphone5系的支持就可以了,于是内核补丁工作开始:
一、OpenWrt目录简介
都知道OpenWrt是Linux的发行版,查看其源码的根目录,也是似曾相识。
这里说几个与本案相关的目录:
dl/
即download,这个目录在编译时会创建,并存放从Internet下载下来的各个package的源码压缩包。package/
存放各个package基于OpenWrt平台编译所需要的makefile、patch、附加脚本、files等。feeds/
package扩展包。package目录集成的软件包是一些基本包,可以cover大部分应用场景,feeds下提供更强大软件包,对某一场景有更多要求时,可以采用扩展包内容进行增强。target/
目标平台的源码。内核的clean代码也在此目录中,但没有加载补丁。build_dir/
编译时,根据package中提供的makefile内容,将源码解压缩到此目录,并加载已有补丁,copy相关依赖文件等,加载补丁后的内核代码也在此目录中。
由以上看出,build_dir/目录在完成一次OpenWrt整体编译后,存放了当前的最新Source Code,因此我们再新增加patch,都应基于这个目录的源码来做。
二、使用quilt内核打补丁步骤
1、quilt简介
quilt是一个轻量级的版本控制工具,
root@PC:/home/test# quilt -h
用法:quilt [--trace[=verbose]] [--quiltrc=XX] command [-h] ...
quilt --version
命令是:
add fold new remove top
annotate fork next rename unapplied
applied graph patches revert upgrade
delete grep pop series
diff header previous setup
edit import push shell
files mail refresh snapshot
Global options:
--trace
Runs the command in bash trace mode (-x). For internal debugging.
--quiltrc file
Use the specified configuration file instead of ~/.quiltrc (or
/etc/quilt.quiltrc if ~/.quiltrc does not exist). See the pdf
documentation for details about its possible contents. The
special value "-" causes quilt not to read any configuration
file.
--version
Print the version number and exit immediately.
常用的命令如下
quilt series
查看所有patch。
quilt top
查看栈顶patch(即,最后应用的patch)。
quilt applied
查看已应用的patch。
quilt unapplied
查看未应用的patch。
quilt files
查看patch关联的文件。
quilt diff
对比修改的文件。
quilt new
新建patch文件。
quilt delete
删除patch文件。
quilt add
将文件的当前状态与Patch联系起来。操作后,对文件的修改,diff内容会增加到patch中。
quilt remove
解除文件与Patch的关联。操作后,patch中针对此文件的diff内容会从patch中删除。
quilt push
patch入栈。即选择patch并应用。或者说导入patch。
quilt pop
patch出栈。撤销,导出patch,patch文件并不删除。
quilt import
从他处导入patch。
quilt edit
编辑当前文件,包含了quilt add操作,并针对top patch。首次使用会提示选择编辑器。
quilt refresh
保存当前patch。
2、打补丁步骤
以上是前戏,现在进入正题
直接举例子说明:
对内核3.3.8增加iphone5、6的支持。
首选明确,iphone5、6的product id为0x12a8
, ipad的product id为0x129a
。
make target/linux/clean V=99
进入Openwrt目录, make target/linux/clean V=99,将内核清理干净。make target/linux/prepare V=99
make target/linux/prepare V=99,将内核应用所有patch并生成最新代码到build_dir目录下。cd build_dir/linux-ar71xx_generic/linux-3.3.8
进入最新kernel的source code目录。quilt new platform/965-ipheth-iphone5-6-support.patch
新建965-ipheth-iphone5-6-support.patch,并指定保存目录到patches/platform/下。quilt edit drivers/net/usb/ipheth.c
编辑ipheth.c,增加对iphone5、6及ipad的支持。quilt refresh
保存patch。make target/linux/update V=99
进入Openwrt目录, make target/linux/update V=99,将patch应用,此时会生成新patch,到target/linux/ar71xx/patches-3.3/下查看。
至此,执行单编译kernel或全编译,此patch都将会被应用。
附patch内容:
Index: linux-3.3.8/drivers/net/usb/ipheth.c
===================================================================
--- linux-3.3.8.orig/drivers/net/usb/ipheth.c 2012-06-01 15:16:13.000000000 +0800
+++ linux-3.3.8/drivers/net/usb/ipheth.c 2016-07-08 13:47:28.709742927 +0800
@@ -61,6 +61,8 @@
#define USB_PRODUCT_IPHONE_4 0x1297
#define USB_PRODUCT_IPHONE_4_VZW 0x129c
#define USB_PRODUCT_IPHONE_4S 0x12a0
+#define USB_PRODUCT_IPAD 0x129a
+#define USB_PRODUCT_IPHONE_5 0x12a8
#define IPHETH_USBINTF_CLASS 255
#define IPHETH_USBINTF_SUBCLASS 253
@@ -108,6 +110,14 @@
USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_4S,
IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
IPHETH_USBINTF_PROTO) },
+ { USB_DEVICE_AND_INTERFACE_INFO(
+ USB_VENDOR_APPLE, USB_PRODUCT_IPAD,
+ IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
+ IPHETH_USBINTF_PROTO) },
+ { USB_DEVICE_AND_INTERFACE_INFO(
+ USB_VENDOR_APPLE, USB_PRODUCT_IPHONE_5,
+ IPHETH_USBINTF_CLASS, IPHETH_USBINTF_SUBCLASS,
+ IPHETH_USBINTF_PROTO) },
{ }
};
MODULE_DEVICE_TABLE(usb, ipheth_table);