如何在Openwrt上,针对内核创建自定义Patch?
参考资料:
1.http://wiki.openwrt.org/doc/devel/patches?s[]=quilt --- 官方对于如何打Patch的说明
2.http://blog.csdn.net/hbsong75/article/details/8825184 --- 使用quilt的小例子
众所周知,openwrt采用的是:从各个开源站点下载源码,解压缩,然后再打上N多Patch的方式,来搭建自己的编译环境的。其中,针对内核的编译,也是这么操作的。
那么,如何为内核创建自定义的Patch呢?
1. 使用quilt工具
quilt是一个开源的管理Patch的工具,openwrt采用此工具来生成Patch和打上Patch。具体使用方法,见参考资料2
2.从官网下载的openwrt的SDK中,针对内核已经有一些现存的Patch了。他们放在: target/linux/XXX子目录中,其中:
generic/
contains patches common to all architectures and --- generic目录下存放的Patch,适用于所有的设备结构,即通用patch
platform/
contains patches specific to the current target --- platform目录下存放的Patch,则适用于此platform自身。当然,实际就是类似:ar71xx,ramips这类的platform
3. 如何为一个具体的Platform创建自定义的Patch?
举例:由于开发需要,需要针对AR9331的目标设备,在内核增加一些代码,其中需要修改文件:build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620/linux-3.14.18/arch/mips/ath79/Kconfig,增加自定义的几个宏定义。那么,如何为这几个自定义的宏定义,创建Patch?
A.准备一个干净的SDK,即没有编译过的干净的openwrt SDK
B.通过make menuconfig 和 make kernel_menuconfig,设置好目标设备类型:这里就是选择好我们要编译的是 ar71xx目标 --- 否则,openwrt怎么知道是需要打上针对哪个platform的Patch呢?
C. 敲入命令:make target/linux/{clean,prepare} V=s QUILT=1 --- 用于将linux内核压缩包解压并完成openwrt自带的Patch文件的打入工作
实际上,在上一步 make kernel_menuconfig后,就已经完成这一步的操作了
D. 进入内核解压缩后,所在的目录,这里是:build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.14.18 --- 此目录下,有一个patches目录,里面有:
generic platform series 其中,generic和platform是目录,就是针对此目标设备的patches了
由于我们这里要增加的是针对 特定platform的,所以进入platform目录,再看看:里面有N多.patch文件,从102开始,到902 --- 注意:openwrt的patch打上顺序,是从小序号开始的,即从102开始;因此,我们自定义的Patch,需要放到最后。 但是,如果我们选择1001开始,似乎这个就变成第一个被打上的patch了
E. 回到目录:build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.14.18
我们选择 从910开始自定义的Patch创建,则这里设置命令:quilt new platform/910-MIPS-ath79-XXXX.patch (名字要简短但有意义)
F. 进入实际要修改文件所在目录:build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.14.18/arch/mips/ath79 ,采用 quilt edit Kconfig,从而打开nano编辑工具,加入自定义内容,并保存退出
G. 敲入 quilt diff,可以看到我们修改的内容;
敲入 quilt refresh,就可以将我们修改的内容,写入到对应的patch文件中了: 910-MIPS-ath79-XXXX.patch
H. 将build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.14.18/patches/platform/910-MIPS-ath79-XXXX.patch
拷贝到target/linux/ar71xx/patches-3.14 --- 这样,就真正将这个Patch 收编到SDK中了
I.将之前解压缩的linux内核目录全部删除: make target/linux/clean
然后,再利用 make kernel_menuconfig 或者 make target/linux/prepare V=s QUILT=1 就看到我们自定义的Patch已经生效了
***************注意:上述方式仅仅用于对原有内核文件修改的处理方式,如果是新增一个文件,则需要*******************
比如:若需要在build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.14.18/include/linux中加入文件:xxxx.h,则需要将此文件放到:
target/linux/ar71xx/files/include/linux 目录中