如何向linux社区提交一个新的驱动或patch

2024-08-26 05:44
文章标签 linux 驱动 提交 社区 patch

本文主要是介绍如何向linux社区提交一个新的驱动或patch,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近给linux社区提交了一个新驱动,反复修改了快两个月,发了9个版本。。。终于被社区接受了。做个笔记总结一下。

下载最新的linux内核代码:
下载最新的内核代码用于新驱动的编译验证,因为最新的内核中可能有一些新的特性,比如新的接口什么的,这些你可能并不知道,而维护者会要求你的新驱动中务必要使用新的接口或实现新的功能,所以你必须基于最新的内核代码进行编译验证和代码提交:
最新版本linux下载:git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
个别情况下,维护者可能会要求你使用即将在下一版中才会使用的功能,也就是比最新的kernel还要新,这种情况下你需要下载linux-next版本进行编译验证和提交。
linux-next版本下载:git clone https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git

添加你的驱动到上述内核代码中,在本地commit代码:
git commit -s
加上-s参数可以在commit的下端生成Signed-off-by: My Name <my_email@gmail.com> 这些都是必要的。
关于commit信息,务必要参考同类驱动的历史提交中的commit信息的格式,否则会被要求重新提交;
新加的驱动会有dt-binding和vendor信息的相关修改,这两个会被要求各自是独立的commit,不能和驱动代码放在同一次提交中。

所有工作之前,如果你的代码是windows下创建的,你需要用dos2unix drivers/iio/proximity/hx9023s.c转换成linux文件格式。
如果你的代码并没有遵循linux的格式要求的话,可以先用astyle格式化代码
astyle --style=linux --indent=tab --convert-tabs --pad-oper --pad-header --align-pointer=name --align-reference=name --add-brackets --suffix=none drivers/iio/proximity/hx9023s.c

编译:
我们提到这个内核代码只是用于编译验证的,因此,在把你的驱动添加进去后大可不必做交叉编译(因为大部分人工作时都是用交叉编译,这里可能会因为惯性,又开始做交叉编译,可以这么验证,但是没必要),直接编译x86做验证即可。
首先安装编译相关的工具:
sudo apt-get update
sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev
然后测试编译原始版本,完整编译:
make defconfig    在x86环境下对应的是arch/x86/configs/x86_64_defconfig
make -j16
先完整编译一次内核是有必要的!因为后续的某些代码检查工具会依赖这次完整编译。
修改你的代码中的全部编译错误。

静态编译检查:
没有编译错误后执行代码的静态编译检查:
make C=1 CHECK="sparse" M=drivers/iio/proximity     最后这个参数指向你的新代码所在的目录
修改以上静态检查结果中的错误;

单独编译你的驱动:
后续修改代码后可以快速编译,只编译你的驱动即可,不必全部编译:
make M=drivers/iio/proximity  hx9023s.ko

代码格式规范检查:
./scripts/checkpatch.pl --strict drivers/iio/proximity/hx9023s.c
直接对源码进行规范检查尝试是可以的,但是正规的方式是把你的修改做个patch,然后对patch进行规范检查,如下:
./scripts/checkpatch.pl --strict 0001-iio-proximity-Add-driver-support-for-TYHX-s-HX9023S-.patch 0002-iio-proximity-Add-driver-support-for-TYHX-s-HX9023S-.patch 0003-iio-proximity-Add-driver-support-for-TYHX-s-HX9023S-.patch

没有什么问题就可以给社区提交了,最好不要用最基本的git send-email这种方式提交代码!因为代码会反复修改和提交多次,这个原始方法不适合管理。
b4是一个专用的linux社区代码提交工具,用这个会更方便一些:
先安装git-email用来发送邮件
sudo apt install git-email

安装b4:
sudo apt install python3 python3-pip
pipx install b4
pipx ensurepath
pipx completions
需要重启终端后b4才可用

对b4的一些理解:
b4必须工作自己的特定分支,,它会在这个特定分支顶端创建一个空commit,这个commit用于分割你要提交的修改和以前的commit,同时这个commit会被b4反复修改用来跟踪你的每次patch提交。它也是cover-letter。每次通过b4 send patch之后,这个commit就会以注释的形式追加一个下次的提交版本号和对应的comment模板。所以第一步就是创建一个b4的工作分支:
b4 prep -n Add-TYHX-HX9023S-sensor-driver

然后如果你先前在没有b4的跟踪下工作,可以把你的先前提交cherry-pick过来,要知道,这就是一个普通的branch而已,没什么特别。像以前一样在这个分支工作就好。把你的工作commit之后,提交前可以让b4做个patch检查:
b4 prep --check

编辑cover-letter正文:也就是哪个空commit的注释部分
b4 prep --edit-cover

b4会自动添加版本号,这个版本号取决于那个空commit中的revision关键字,它记录的上次的版本号,所以这次的版本号会在这个revision的基础上加1.所以如果你半路把工作切换到b4的,那你要用git rebase -i hash123456,把这个空提交的revision改成你的上次给社区提交时用的版本号。

尝试用b4将patch给自己发出,用以测试效果:
b4 send --to yasin.lee.x@gmail.com

如过没有执行过auto-to-cc的话,b4会给你提示,然后你要执行一下:
b4 prep --auto-to-cc  以上给自己发出patch后,检查无误后再执行这个命令!!!执行完这个命令后,发送时就会给所有相关维护者发出邮件了!
然后继续b4 send --to yasin.lee.x@gmail.com,就能给相关维护者抄过去了(同时可以给自己发一份)。
提交后可以在以下公开的邮件列表中搜索到你的提交。
https://lore.kernel.org/
后续等待维护者给你回复邮件,社区要求每个回复邮件中的每条建议都要被响应。所以你需要回复每个邮件,并对每一条建议或者疑问给出回复。那怕只是回复一句话表示接受这个建议。注意回复邮件应该是纯文本模式!回复时采用inline方式,就是把你的回复嵌入在原邮件中。

b4命令总结:
b4 prep --check      用脚本检查patches
b4 prep --edit-cover  编译封面邮件内容,注意别忘记邮件标题就是那个空commit的第一行信息
b4 prep --auto-to-cc  生成接收列表并记录在那个空commit中
b4 send --to yasin.lee.x@gmail.com 这个真的发送,不过中间会和用户交互一次,此时可以Ctrl+C终止。除了上面记录的接收列表,你也可以自己在这里再加一些接收者
最后,千万不要用outlook的邮箱!!!outlook服务器会篡改邮件头,这样邮件达到其他人那里后会无法和历史邮件关联成邮件线程!!!

其他一些可能的优化:
使用pahole工具检查代码中结构体的内存空洞,然后通过调整结构体中成员的位置,对空洞进行消除,一般情况下,把相同的数据类型排列在一起,并将数据类型从大到小排列,可以减少空洞的产生。
安装:
sudo apt-get install dwarves
使用:先要编译出带调试信息的内核模块,需要加上CFLAGS_MODULE="-g"参数。如果你在调试应用程序的话只有在gcc后加上-g参数即可,如:
gcc -g -o my_program my_program.c
然后:pahole my_program
如果是内核模块的话,就要像下面这样啦:
make M=drivers/iio/proximity CFLAGS_MODULE="-g" hx9023s.ko
然后:pahole drivers/iio/proximity/hx9023s.ko

检查dt-binding相关的yaml文件:
先安装相关工具,否则yaml有错误也检查不出来
sudo apt install yamllint
pip3 install dtschema --upgrade
rm Documentation/devicetree/bindings/processed-schema.json
DT编译检查
make dt_binding_check -j16   这会编译检查全部的yaml文件,特别慢!不要用!
用下面这个,编译检查指定的yaml文件
make DT_SCHEMA_FILES=Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.yaml dt_binding_check


 

这篇关于如何向linux社区提交一个新的驱动或patch的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107713

相关文章

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。