补丁

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都将会被应用。

来源:https://blog.csdn.net/walker0411/article/details/51916959

附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);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值