1*4882a593Smuzhiyun.. _cn_submittingdrivers: 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun.. include:: ../disclaimer-zh_CN.rst 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun:Original: :ref:`Documentation/process/submitting-drivers.rst 6*4882a593Smuzhiyun <submittingdrivers>` 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文 9*4882a593Smuzhiyun交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻 10*4882a593Smuzhiyun译存在问题,请联系中文版维护者:: 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun 中文版维护者: 李阳 Li Yang <leoyang.li@nxp.com> 13*4882a593Smuzhiyun 中文版翻译者: 李阳 Li Yang <leoyang.li@nxp.com> 14*4882a593Smuzhiyun 中文版校译者: 陈琦 Maggie Chen <chenqi@beyondsoft.com> 15*4882a593Smuzhiyun 王聪 Wang Cong <xiyou.wangcong@gmail.com> 16*4882a593Smuzhiyun 张巍 Zhang Wei <wezhang@outlook.com> 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun如何向 Linux 内核提交驱动程序 19*4882a593Smuzhiyun============================= 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun这篇文档将会解释如何向不同的内核源码树提交设备驱动程序。请注意,如果你感 22*4882a593Smuzhiyun兴趣的是显卡驱动程序,你也许应该访问 XFree86 项目(https://www.xfree86.org/) 23*4882a593Smuzhiyun和/或 X.org 项目 (https://x.org)。 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun另请参阅 Documentation/translations/zh_CN/process/submitting-patches.rst 文档。 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun分配设备号 29*4882a593Smuzhiyun---------- 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun块设备和字符设备的主设备号与从设备号是由 Linux 命名编号分配权威 LANANA( 32*4882a593Smuzhiyun现在是 Torben Mathiasen)负责分配。申请的网址是 https://www.lanana.org/。 33*4882a593Smuzhiyun即使不准备提交到主流内核的设备驱动也需要在这里分配设备号。有关详细信息, 34*4882a593Smuzhiyun请参阅 Documentation/admin-guide/devices.rst。 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun如果你使用的不是已经分配的设备号,那么当你提交设备驱动的时候,它将会被强 37*4882a593Smuzhiyun制分配一个新的设备号,即便这个设备号和你之前发给客户的截然不同。 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun设备驱动的提交对象 40*4882a593Smuzhiyun------------------ 41*4882a593Smuzhiyun 42*4882a593SmuzhiyunLinux 2.0: 43*4882a593Smuzhiyun 此内核源码树不接受新的驱动程序。 44*4882a593Smuzhiyun 45*4882a593SmuzhiyunLinux 2.2: 46*4882a593Smuzhiyun 此内核源码树不接受新的驱动程序。 47*4882a593Smuzhiyun 48*4882a593SmuzhiyunLinux 2.4: 49*4882a593Smuzhiyun 如果所属的代码领域在内核的 MAINTAINERS 文件中列有一个总维护者, 50*4882a593Smuzhiyun 那么请将驱动程序提交给他。如果此维护者没有回应或者你找不到恰当的 51*4882a593Smuzhiyun 维护者,那么请联系 Willy Tarreau <w@1wt.eu>。 52*4882a593Smuzhiyun 53*4882a593SmuzhiyunLinux 2.6: 54*4882a593Smuzhiyun 除了遵循和 2.4 版内核同样的规则外,你还需要在 linux-kernel 邮件 55*4882a593Smuzhiyun 列表上跟踪最新的 API 变化。向 Linux 2.6 内核提交驱动的顶级联系人 56*4882a593Smuzhiyun 是 Andrew Morton <akpm@linux-foundation.org>。 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun决定设备驱动能否被接受的条件 59*4882a593Smuzhiyun---------------------------- 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun许可: 代码必须使用 GNU 通用公开许可证 (GPL) 提交给 Linux,但是 62*4882a593Smuzhiyun 我们并不要求 GPL 是唯一的许可。你或许会希望同时使用多种 63*4882a593Smuzhiyun 许可证发布,如果希望驱动程序可以被其他开源社区(比如BSD) 64*4882a593Smuzhiyun 使用。请参考 include/linux/module.h 文件中所列出的可被 65*4882a593Smuzhiyun 接受共存的许可。 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun版权: 版权所有者必须同意使用 GPL 许可。最好提交者和版权所有者 68*4882a593Smuzhiyun 是相同个人或实体。否则,必需列出授权使用 GPL 的版权所有 69*4882a593Smuzhiyun 人或实体,以备验证之需。 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun接口: 如果你的驱动程序使用现成的接口并且和其他同类的驱动程序行 72*4882a593Smuzhiyun 为相似,而不是去发明无谓的新接口,那么它将会更容易被接受。 73*4882a593Smuzhiyun 如果你需要一个 Linux 和 NT 的通用驱动接口,那么请在用 74*4882a593Smuzhiyun 户空间实现它。 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun代码: 请使用 Documentation/process/coding-style.rst 中所描述的 Linux 代码风 77*4882a593Smuzhiyun 格。如果你的某些代码段(例如那些与 Windows 驱动程序包共 78*4882a593Smuzhiyun 享的代码段)需要使用其他格式,而你却只希望维护一份代码, 79*4882a593Smuzhiyun 那么请将它们很好地区分出来,并且注明原因。 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun可移植性: 请注意,指针并不永远是 32 位的,不是所有的计算机都使用小 82*4882a593Smuzhiyun 尾模式 (little endian) 存储数据,不是所有的人都拥有浮点 83*4882a593Smuzhiyun 单元,不要随便在你的驱动程序里嵌入 x86 汇编指令。只能在 84*4882a593Smuzhiyun x86 上运行的驱动程序一般是不受欢迎的。虽然你可能只有 x86 85*4882a593Smuzhiyun 硬件,很难测试驱动程序在其他平台上是否可用,但是确保代码 86*4882a593Smuzhiyun 可以被轻松地移植却是很简单的。 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun清晰度: 做到所有人都能修补这个驱动程序将会很有好处,因为这样你将 89*4882a593Smuzhiyun 会直接收到修复的补丁而不是 bug 报告。如果你提交一个试图 90*4882a593Smuzhiyun 隐藏硬件工作机理的驱动程序,那么它将会被扔进废纸篓。 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun电源管理: 因为 Linux 正在被很多移动设备和桌面系统使用,所以你的驱 93*4882a593Smuzhiyun 动程序也很有可能被使用在这些设备上。它应该支持最基本的电 94*4882a593Smuzhiyun 源管理,即在需要的情况下实现系统级休眠和唤醒要用到的 95*4882a593Smuzhiyun .suspend 和 .resume 函数。你应该检查你的驱动程序是否能正 96*4882a593Smuzhiyun 确地处理休眠与唤醒,如果实在无法确认,请至少把 .suspend 97*4882a593Smuzhiyun 函数定义成返回 -ENOSYS(功能未实现)错误。你还应该尝试确 98*4882a593Smuzhiyun 保你的驱动在什么都不干的情况下将耗电降到最低。要获得驱动 99*4882a593Smuzhiyun 程序测试的指导,请参阅 100*4882a593Smuzhiyun Documentation/power/drivers-testing.rst。有关驱动程序电 101*4882a593Smuzhiyun 源管理问题相对全面的概述,请参阅 102*4882a593Smuzhiyun Documentation/driver-api/pm/devices.rst。 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun管理: 如果一个驱动程序的作者还在进行有效的维护,那么通常除了那 105*4882a593Smuzhiyun 些明显正确且不需要任何检查的补丁以外,其他所有的补丁都会 106*4882a593Smuzhiyun 被转发给作者。如果你希望成为驱动程序的联系人和更新者,最 107*4882a593Smuzhiyun 好在代码注释中写明并且在 MAINTAINERS 文件中加入这个驱动 108*4882a593Smuzhiyun 程序的条目。 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun不影响设备驱动能否被接受的条件 111*4882a593Smuzhiyun------------------------------ 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun供应商: 由硬件供应商来维护驱动程序通常是一件好事。不过,如果源码 114*4882a593Smuzhiyun 树里已经有其他人提供了可稳定工作的驱动程序,那么请不要期 115*4882a593Smuzhiyun 望“我是供应商”会成为内核改用你的驱动程序的理由。理想的情 116*4882a593Smuzhiyun 况是:供应商与现有驱动程序的作者合作,构建一个统一完美的 117*4882a593Smuzhiyun 驱动程序。 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun作者: 驱动程序是由大的 Linux 公司研发还是由你个人编写,并不影 120*4882a593Smuzhiyun 响其是否能被内核接受。没有人对内核源码树享有特权。只要你 121*4882a593Smuzhiyun 充分了解内核社区,你就会发现这一点。 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun资源列表 125*4882a593Smuzhiyun-------- 126*4882a593Smuzhiyun 127*4882a593SmuzhiyunLinux 内核主源码树: 128*4882a593Smuzhiyun ftp.??.kernel.org:/pub/linux/kernel/... 129*4882a593Smuzhiyun ?? == 你的国家代码,例如 "cn"、"us"、"uk"、"fr" 等等 130*4882a593Smuzhiyun 131*4882a593SmuzhiyunLinux 内核邮件列表: 132*4882a593Smuzhiyun linux-kernel@vger.kernel.org 133*4882a593Smuzhiyun [可通过向majordomo@vger.kernel.org发邮件来订阅] 134*4882a593Smuzhiyun 135*4882a593SmuzhiyunLinux 设备驱动程序,第三版(探讨 2.6.10 版内核): 136*4882a593Smuzhiyun https://lwn.net/Kernel/LDD3/ (免费版) 137*4882a593Smuzhiyun 138*4882a593SmuzhiyunLWN.net: 139*4882a593Smuzhiyun 每周内核开发活动摘要 - https://lwn.net/ 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun 2.6 版中 API 的变更: 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun https://lwn.net/Articles/2.6-kernel-api/ 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun 将旧版内核的驱动程序移植到 2.6 版: 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun https://lwn.net/Articles/driver-porting/ 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun内核新手(KernelNewbies): 150*4882a593Smuzhiyun 为新的内核开发者提供文档和帮助 151*4882a593Smuzhiyun https://kernelnewbies.org/ 152*4882a593Smuzhiyun 153*4882a593SmuzhiyunLinux USB项目: 154*4882a593Smuzhiyun http://www.linux-usb.org/ 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun写内核驱动的“不要”(Arjan van de Ven著): 157*4882a593Smuzhiyun http://www.fenrus.org/how-to-not-write-a-device-driver-paper.pdf 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun内核清洁工 (Kernel Janitor): 160*4882a593Smuzhiyun https://kernelnewbies.org/KernelJanitors 161