您的位置:首页 > 运维架构

OpenWrt内核打补丁方法

2016-07-15 13:32 519 查看

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: