如何向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

相关文章

Linux下修改hostname的三种实现方式

《Linux下修改hostname的三种实现方式》:本文主要介绍Linux下修改hostname的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下修改ho编程stname三种方式方法1:修改配置文件方法2:hFvEWEostnamectl命

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

Git如何修改已提交人的用户名和邮箱

《Git如何修改已提交人的用户名和邮箱》文章介绍了如何修改Git已提交人的用户名和邮箱,包括注意事项和具体步骤,确保操作正确无误... 目录git修改已提交人的用户名和邮箱前言第一步第二步总结git修改已提交人的用户名和邮箱前言需注意以下两点内容:需要在顶层目录下(php就是 .git 文件夹所在的目

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

linux本机进程间通信之UDS详解

《linux本机进程间通信之UDS详解》文章介绍了Unix域套接字(UDS)的使用方法,这是一种在同一台主机上不同进程间通信的方式,UDS支持三种套接字类型:SOCK_STREAM、SOCK_DGRA... 目录基础概念本机进程间通信socket实现AF_INET数据收发示意图AF_Unix数据收发流程图A

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

linux打包解压命令方式

《linux打包解压命令方式》文章介绍了Linux系统中常用的打包和解压命令,包括tar和zip,使用tar命令可以创建和解压tar格式的归档文件,使用zip命令可以创建和解压zip格式的压缩文件,每... 目录Lijavascriptnux 打包和解压命令打包命令解压命令总结linux 打包和解压命令打

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值