OpenWrt patch方法

1、前言
    配置完Openwrt后,首次编译时会在编译过程中下载各种源码包,而且解压这些源码包并打上patch。
需要对源码进行修改时,可直接修改源码并重新编译,但clean后再次编译时会再次解压源码包,以至所做
的修改全部丢失。本文参考Openwrt官网提供的patch管理方法,实践操作并记录linux kernel及package源
码修改并生成patch的方法。
2、环境及准备工作
2.1 开发环境
    linux发行版:ubuntu12.04LTS
    OpenWrt版本:trunk-DESIGNATED DRIVER (Bleeding Edge, r49274)(linux kernel 4.4.7)
    硬件:mt7620a openwrt开发板
2.2 准备工作
    patch的管理工具使用quilt,在ubuntu下使用apt-get intallquilt安装quilt工具。
    为了让quilt创建适合OpenWrt格式的patch,需要在本地home目录下创建quilt的配置文件.quiltrc,该配
    置文件包含diff和patch的选项。使用如下命令可创建quilt的配置文件:
    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="vim"
    EOF
    EDITOR指定编辑时所用的编辑器,该处使用vim。

3、package的patch方法
3.1 修改内容
    package的patch生成方法以修改atftp为例进行介绍,修改内容为在atftp的main函数开始处加入一条打印
信息。(进行该操作之前,需要在make menuconfig时选择atftp包),没有则执行下面命令:
    ./scripts/feeds update -a
    ./scripts/feeds install -a
3.2 pactch生成步骤
    1. 准备atftp源码
        make package/feeds/packages/atftp/{clean,prepare} V=s QUILT=1
        此命令会解压atftp的源码包并准备patch文件(如果有),通过打印信息可获取解压到的目录路径。
    2.进入atftp源码目录
        cd build_dir/target-mipsel_24kec+dsp_musl-1.1.14/atftp-0.7.1
    3.安装所有已有patch
        quilt push -a
    4.创建新patch
        quilt new 04-test-patch-tftp-main.patch
        patch文件名以数字开头,“-”后为patch的描述信息
        开头的数字必须比已有patch的数字都大,使用命令quilt series查看已有patch的列表
        01-missing-u_char-type-patch.patch
        02-fix-invalid-read-in-tftp_send_request.patch
        03-Fix-undefined-reference-linker-errors.patch
        04-test-patch-tftp-main.patch -- 我们新添加的patch文件
    5.修改源码文件
        quilt edit tftp.c
        该命令将使用在.quiltrc中定义的编辑器打开main.c文件,在main函数中增加一条打印信息。
        printf("atftp patch test!\n");
        如果还有其他文件需要修改,可继续用此命令进行修改
    6.查看修改内容
        quilt diff


    7.更新修改到patch文件
        quilt refresh
        此命令会将更新的修改保存到当前目录的patches/04-test-patch-tftp-main.patch(如果
        没有patches目录会自动创建)。
    8.返回到buildroot目录
        cd ../../../
    9.保存patch文件到buildroot
        make package/feeds/packages/atftp/update V=s
    10. 重新编译tftp-hpa包以测试修改
        make package/feeds/packages/atftp/{clean,compile} package/index V=s
    11.如果有问题,需要编辑patch文件
    12.进入目标板,执行命令atftp:

3.3 编辑已有patch文件
    当需要对patch进行修改时,可使用以下步骤:
    1.准备atftp源码
        make package/feeds/packages/atftp/{clean,prepare} V=s QUILT=1
    2. 进入atftp源码目录
        cd build_dir/target-mipsel_24kec+dsp_musl-1.1.14/atftp-0.7.1
    3.列出可用的patch
        quilt series
    4.准备要修改的patch
        quilt push 04-test-patch-tftp-main.patch -- 我们要修改的patch文件
        此命令会按patch编号顺序打补丁,直到指定的patch(包含)
        如果当前应用的patch编号已经超过了指定的patch编号,将会按相反顺序移除patch直到指定的patch
    5.编辑源码文件
        quilt edit tftp.c
    6.检查patch中包含的所修改的文件
        quilt files
    7.查看修改内容
        quilt diff

    8.保存修改到patch
        quilt refresh
    9.返回buildroot目录
        cd ../../../
    10.保存patch文件到buildroot
        make package/feeds/packages/atftp/update V=s
    11.重新编译tftp-hpa包以测试修改
        make package/feeds/packages/atftp/{clean,compile} package/index V=s

3.3 编辑已有patch文件
    当需要对patch进行修改时,可使用以下步骤:
    1.准备atftp源码
        make package/feeds/packages/atftp/{clean,prepare} V=s QUILT=1
    2. 进入atftp源码目录
        cd build_dir/target-mipsel_24kec+dsp_musl-1.1.14/atftp-0.7.1
    3.列出可用的patch
        quilt series
    4.准备要修改的patch
        quilt push 04-test-patch-tftp-main.patch -- 我们要修改的patch文件
        此命令会按patch编号顺序打补丁,直到指定的patch(包含)
        如果当前应用的patch编号已经超过了指定的patch编号,将会按相反顺序移除patch直到指定的patch
    5.编辑源码文件
        quilt edit tftp.c
    6.检查patch中包含的所修改的文件
        quilt files
    7.查看修改内容
        quilt diff
    8.保存修改到patch
        quilt refresh
    9.返回buildroot目录
        cd ../../../
    10.保存patch文件到buildroot
        make package/feeds/packages/atftp/update V=s
    11.重新编译tftp-hpa包以测试修改
        make package/feeds/packages/atftp/{clean,compile} package/index V=s
4、linux内核patch方法
4.1 修改内容
    使用的模块为基于ar9331的ap121兼容板,根据该模块的硬件需要在ap121的基础上
    做两处修改:
    1.硬件复位的GPIO变更(arch/mips/ath79/mach-ap121.c)
    2.增加新flash s25fl164k1的支持(driver/mtd/devices/m25p80.c)
    内核的patch分两种,一种是基于platform的,另一种是generic的,修改1属于platform,修改2属于generic。
4.2 platform patch生成步骤
    platform形式的patch生成步骤如下(源码修改mach-ap121.c):
    1.准备内核源码树,使用如下命令
        make target/linux/{clean,prepare} V=s QUILT=1
    2.进入kernel源码树目录
        对attitudeadjustment版本,kernel源码树所在目录为build_dir/linux-*/linux-3.*
        对本文使用的trunk版本,使用如下命令进入kernel源码树
            cd build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.10
    3.安装所有已有patch
        quilt push -a
    4.创建新patch
        quilt new platform/910-MIPS-ath79-ap121-reset-gpio-change.patch
        patch文件名以数字开头,“-”后为patch的描述信息
        开头的数字必须比已有patch的数字都大,使用命令quilt series查看已有patch的列表
        新建platform的patch时需要在patch名前添加“platform/”前缀
    5.修改源码文件
        quilt edit arch/mips/ath79/mach-ap121.c
        该命令将使用在.quiltrc中定义的编辑器打开mach-ap121.c文件,修改对复位GPIO的定义。
        如果还有其他文件需要修改,可继续用此命令进行修改
    6.查看修改内容
        quilt diff
    7.更新修改到patch文件
        quilt refresh
        此命令会将更新的修改保存到当前目录的patches/platform/910-MIPS-ath79-ap121-reset-gpio-change.patch
    8.返回到buildroot目录
        cd ../../../../
    9.保存patch文件到buildroot
        make target/linux/update V=s
        此命令会将910-MIPS-ath79-ap121-reset-gpio-change.patch保存到target/linux/ar71xx/patches-3.10/
4.3 generic patch生成步骤
    generic形式的patch生成步骤如下(源码修改m25p80.c):
    1.准备内核源码树,使用如下命令
        make target/linux/{clean,prepare} V=s QUILT=1
    2.进入kernel源码树目录
        对attitude adjustment版本,kernel源码树所在目录为build_dir/linux-*/linux-3.*
        对本文使用的trunk版本,使用如下命令进入kernel源码树
            cd build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.10
    3.安装所有已有patch
        quilt push -a
    4.创建新patch
        quilt new 998-mtd-m25p80-add-support-for-spansion-s25fl164k1-flash.patch
        patch文件名以数字开头,“-”后为patch的描述信息
        开头的数字必须比已有patch的数字都大,使用命令quilt series查看已有patch的列表
        新建generic的patch时需要在patch名前添加“generic/”前缀
    5.修改源码文件
        quilt edit driver/mtd/devices/m25p80.c
        该命令将使用在.quiltrc中定义的编辑器打开m25p80.c文件,增加对s25fl164k1的声明。
        如果还有其他文件需要修改,可继续用此命令进行修改
    6.查看修改内容
        quilt diff
    7.更新修改到patch文件
        quilt refresh
        此命令会将更新的修改保存到当前目录的patches/generic/998-mtd-m25p80-add-support-for-spansion-s25fl164k1-flash.patch。
    8.返回到buildroot目录
        cd ../../../../
    9.保存patch文件到buildroot
        make target/linux/update V=s
        此命令会将998-mtd-m25p80-add-support-for-spansion-s25fl164k1-flash.patch保存到target/linux/generic/patches-3.10/
5、更新patches
    当已打补丁的package(或者kernel)更新到新版本时,patch现有补丁时可能不会顺利,出现一些不确定性。
    可以通过make的refresh target重建整个patch。
    对package,使用类似如下的命令:
        make package/feeds/packages/tftp-hpa/refresh V=s
    对kernel,使用如下命令:
        make target/linux/refresh V=s
6、迭代修改patch
    进行新的修改时,可能会对patch进行多次修改。为了加快开发速度,可以在保持源码树的情况下进行修改操作。
    1.准备源码树
    2.进入源码目录
    3. 应用所要打的patch
    4.编辑源码文件,更新patch
    5.应用所有patch(quilt push -a)
    6.返回buildroot目录,运行命令make package/feeds/packages/tftp-hpa/{compile,install}或make target/linux/{compile,install}(对kernel)
    7.测试固件
    8.如果需要进一步修改,返回第二步
    9,使用命令make package/feeds/packages/tftp-hpa/update或make target/linux/update(对kernel)将patches拷贝到buildroot
7、参考
    主要参考OpenWrt的官网对patch的相关开发说明openwrt.org(Documentation->Developing->patches)。
————————————————
版权声明:本文为CSDN博主「tupelo-shen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shenwanjiang111/article/details/52252249

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值