DB43∕T 2260-2021 信息技术应用创新工程建设规范第 9 部分:驱动开发通用技术要求(湖南省).pdf
-
资源ID:89774818
资源大小:992.91KB
全文页数:44页
- 资源格式: PDF
下载积分:19金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
DB43∕T 2260-2021 信息技术应用创新工程建设规范第 9 部分:驱动开发通用技术要求(湖南省).pdf
信息技术应用创新工程建设规范第9部分:驱动开发通用技术要求Engineering specification for the Application Innovation Project of Information TechnologyPart 9:General technical requirements of driver developing43湖南省地方标准ICSCCS 01.140.20L 70DB43/T 22602021 发 布湖南省市场监督管理局2021-12发布-292022-03实施-29DB43/T 22602021 I 目 次 前言 引言 1 范围 1 2 规范性引用文件 1 3 术语和定义 1 4 缩略语 2 5 核内驱动总体要求 2 5.1 编程要求 2 5.2 设备驱动模型 3 5.3 文件组织形式 3 5.4 驱动程序实现 3 5.5 第三方技术使用 4 6 核内驱动具体要求 5 6.1 字符设备驱动程序 5 6.2 块设备驱动程序 6 6.3 平台设备驱动程序 7 6.4 网络设备驱动程序 9 6.5 显示帧缓存设备驱动程序 10 6.6 驱动程序的 DKMS 包制作 12 6.7 驱动程序的调试验证 13 7 常用外设开发要求 13 7.1 打印机驱动开发 13 7.2 扫描仪驱动开发 14 7.3 手写液晶屏驱动开发 15 附录 A(资料性)设备驱动分类 16 附录 B(资料性)驱动程序实现函数示例 17 附录 C(资料性)驱动程序可调用的内核函数接口 19 附录 D(规范性)驱动程序相关的结构体 21 附录 E(资料性)DKMS 技术说明及示例 23 附录 F(资料性)第三方内核模块打包 26 附录 G(资料性)驱动程序的调试验证方法 32 附录 H(资料性)打印机驱动库配置文件示例 36 DB43/T 22602021 II DB43/T 22602021 III 前 言 本文件按照 GB/T 1.12020标准化工作导则 第 1 部分:标准化文件的结构和起草规则的规定起草。请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别专利的责任。信息技术应用创新工程建设规范分为以下几个部分:第 1 部分:台式微型计算机通用技术要求;第 2 部分:便携式微型计算机通用技术要求;第 3 部分:服务器通用技术要求;第 4 部分:操作系统通用技术要求;第 5 部分:操作系统硬件兼容性通用技术要求;第 6 部分:操作系统软件兼容性通用技术要求;第 7 部分:办公套件通用技术要求;第 8 部分:电子公文通用技术要求;第 9 部分:驱动开发通用技术要求;第 10 部分:应用开发通用技术要求;第 11 部分:迁移适配通用技术要求;第 12 部分:国产化信息系统建设质量管理规范;第 13 部分:国产化信息系统运行维护规范;第 14 部分:国产化信息系统建设验收规范;第 15 部分:云计算通用技术要求。本部分为第 9 部分。本部分由湖南省国家密码管理局提出。本部分由湖南省工业和信息化厅归口。本部分起草单位:银河麒麟软件(长沙)有限公司、中国人民解放军国防科技大学、飞腾信息技术有限公司、湖南湘江鲲鹏信息科技有限责任公司、湖南中软信息系统有限公司、湖南长城科技信息有限公司、湖南国科微电子股份有限公司、长沙景嘉微电子股份有限公司、鹏城实验室。本部分主要起草人:张铎、吴庆波、孙立明、刘云、王琦、刘正元、王勇军、李唯实、王晓川、马俊、齐璇、蔡威、张月、吕超、董昱、曹泽文、付志鹏。DB43/T 22602021 IV DB43/T 22602021 V 引 言 湖南省为深入贯彻国家网络强国战略,全面落实中央有关文件精神,部署开展湖南省信息技术应用创新工程建设,保障全省各级党政机关关键信息基础设施信息安全和信息系统安全可靠运行。针对自主可控产品体系初具规模,但相关产品和工程实施标准规范还很缺乏的现状,为了规范工程建设,加速工程进度,扩大建设结果,同时有力提升自主可控产业发展水平,确保信息安全,由湖南省国家密码管理局作为业务主管单位、湖南省工业和信息化厅作为技术归口单位,由中国人民解放军国防科技大学、中国电子信息产业集团有限公司等单位与湖南省合作制定了 信息技术应用创新工程建设规范 地方标准。信息技术应用创新工程建设规范主要由自主可控核心产品、典型应用、工程管理等方面的规范组成,重点解决应用创新工程建设当中产品选型、应用开发、工程实施等基础环节的实际问题,可为应用创新工程的用户使用单位、集成建设单位和相关产品研制单位,在产品和应用规范化、软硬件兼容适配、工程实施标准等方面提供一般性指引。信息技术应用创新工程建设规范 未来将根据自主可控产业和应用创新工程的发展变化进行相应的必要调整和补充。DB43/T 22602021 VI DB43/T 22602021 1 信息技术应用创新工程建设规范 第 9 部分:驱动开发通用技术要求 1 范围 本文件提出了国产操作系统驱动程序开发的编程要求、设备驱动模型、文件组织形式、驱动程序实现、第三方技术使用等总体要求,并针对字符设备、块设备、平台设备、网络设备、显示帧缓存设备的驱动程序框架和开发提出具体要求。本文件适用于国产操作系统上第三方驱动程序的开发,也为第三方驱动程序的调试验证提供指导。2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中,注日期的引用文件,仅该日期对应的版本适用于本文件;不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。GB/T 152721994 程序设计语言 C 3 术语和定义 下列术语和定义适用于本文件。3.1 驱动程序 driver 驱动程序是硬件厂商根据操作系统编写的配置文件,操作系统通过驱动来与控制设备和进行通信。3.2 设备 device 是计算机系统中输入、输出设备(包括外存储器)的统称。设备对数据和信息起着传输、转送和存储的作用。3.3 总线 bus 是计算机各种功能部件之间传送信息的公共通信干线。3.4 设备驱动模型 device driver model 设备驱动模型是操作系统内核为了管理硬件上的设备和对应的驱动程序所制定的一套软件体系。3.5 平台总线 platform bus 平台总线是操作系统内核定义的一种虚拟总线,操作系统内核通过平台总线来管理芯片内部集成设备。3.6 平台设备驱动模型 platform device driver model DB43/T 22602021 2 平台设备驱动模型,即采用平台总线的方式对驱动程序和设备进行管理的设备驱动模型。3.7 字符设备 character device 字符设备是不可寻址的,仅提供数据的流式访问的设备。3.8 块设备 block device 块设备是以块为单位的、可以寻址的设备。块设备通常支持重定位操作,实现对数据的随机访问。3.9 网络设备 network device 网络设备通过网络适配器和特定的网络协议来完成网络访问的设备。3.10 版本魔术信息 vermagic information 版本魔术信息是驱动程序内存储的、用来描述操作系统内核版本号以及基础内核配置的字符串。3.11 导出符号 export symbol 导出符号是操作系统内核模块导出的、可供其他模块中的函数使用的全局变量或者函数。3.12 GNU 编译器套件 GNU Compiler Collection GNU 编译器套件是由 GNU 开发的编程语言编译器,它包括 C、C+、Objective-C、Fortran、Java、Ada 和 Go 语言前端,也包括了这些语言的库(如 libstdc+,libgcj 等。)3.13 OPPS 信息 OPPS Information 操作系统内核发生严重错误时所提示的信息,包括错误发生时的各个常用寄存器的值,调用的堆栈,以及出错的可能原因。4 缩略语 下列缩略语适用于本文件:ACPI:高级配置和电源管理接口(Advanced Configuration and Power Management Interface)CPU:中央处理器(Central Processing Unit)DKMS:动态内核模块支持(Dynamic Kernel Module Support)GNU:开源标准(GNUs Not Unix)GPL:GNU 通用公共许可证(GNU General Public License)I/O:输入/输出(Input/Output)NAPI:网络数据处理 API(New API)PMU:性能监视单元(Performance Monitoring Unit)5 核内驱动总体要求 5.1 编程要求 驱动程序代码应符合 GB/T 15272-1994 和 Linux 内核编程的相关要求,并采用系统内核提供的代码DB43/T 22602021 3 检查脚本来检查驱动程序代码的合规性。为了保证内核升级时其内部调用符号的可用性,驱动程序代码分为内核框架层和核心代码逻辑层,其中内核框架层实现与内核对接的部分,而核心代码逻辑层实现驱动模块的核心功能,编写时应符合以下原则:a)不使用内核的 API 接口和数据结构;b)不使用内核的框架代码;c)不进行内核版本的判断处理;d)不使用宏进行同架构内 CPU 的判断处理;e)二进制文件只包含需要保护的代码。5.2 设备驱动模型 应基于设备驱动模型来进行驱动程序开发,设备驱动模型分类参见附录 A,设备和驱动程序均应挂载到总线上,并通过总线来实现对驱动程序和设备的管理。5.3 文件组织形式 应采用独立目录存放驱动程序的代码文件,驱动程序目录:a)应包含 Makefile 驱动程序构建文件,用于驱动程序的自动化编译;b)应使用.c 源码文件来保存驱动程序实现,若驱动程序的功能复杂,通过多个源码文件来分类存放驱动程序实现;c)应使用.h 头文件来声明驱动程序中的函数、数据结构和变量,应安装内核提供的 linux/init.h、linux/module.h 和 linux/kernel.h 头文件,当需要调用内核功能时,驱动应使用上述头文件中提供的函数接口来请求内核功能;d)应使用 Kconfig 配置文件来描述驱动程序源码文件相关的内核配置菜单;e)宜使用 Readme 说明文档来介绍驱动程序的功能和使用方法。5.4 驱动程序实现 5.4.1 入口函数 驱动程序开发应定义和实现驱动程序的入口函数,驱动程序的入口函数应满足以下要求:a)应使用_init 初始化修饰符来修饰入口函数;b)应完成驱动程序的注册和加载操作;c)应调用内核提供的驱动程序总线注册函数来完成驱动程序的注册;d)应通过具体的返回值来表示驱动程序是否加载成功,加载失败的返回值宜定义为负值,不同的负值对应不同的错误原因;e)应通过内核提供的 module_init()模块初始化函数来声明驱动程序的入口函数。驱动程序入口函数示例见附录 B.1。5.4.2 出口函数 驱动程序开发应定义和实现驱动程序的出口函数,驱动程序的出口函数应满足以下要求:a)应使用_exit 退出修饰符来修饰出口函数;b)应完成驱动的卸载操作;c)应打印卸载相关信息,无需通过返回值来注明驱动程序的卸载是否成功;d)应通过内核提供的 module_exit()模块退出函数来声明驱动程序的出口函数。DB43/T 22602021 4 驱动程序出口函数示例见附录 B.2。5.4.3 信息声明 驱动程序的加载代码中应包含驱动程序的信息声明,包括“模块许可协议”、“版本”、“作者”以及“模块描述”等信息,信息声明示例见附录 B.3。5.4.4 remove 卸载函数 驱动程序应实现 remove 卸载函数,在 remove 卸载函数中实现对驱动程序申请的设备、内存以及sys 文件系统节点等资源的释放。卸载程序中的资源释放示例见附录 B.4。若驱动程序中注册了回调函数,则 remove 卸载函数中应包含注销回调函数的操作。5.4.5 核心数据结构的可扩展性 应通过以下方式来实现驱动程序核心数据的可扩展性:a)在数据结构中添加 reserved 保留字段;b)在数据结构中添加表示私有数据的指针,扩展时只需要修改该指针所指向的数据结构,而无需修改核心数据结构。核心数据结构的可扩展性实现示例见附录 B.5。5.4.6 probe 探测函数 驱动程序应实现 probe 探测函数,用于完成设备驱动程序注册的最后收尾工作。在 probe 探测函数中进行硬件资源的获取、内存结构的映射以及设备的创建等操作时,应通过内核提供的内核操作函数接口进行,涉及的内核操作函数接口见附录 C。5.4.7 用户空间内存访问 若驱动程序需访问用户空间内存,应在访问前先使用 access_ok 检验函数来检查用户空间内存指针的有效性。5.4.8 调试统计变量 驱动程序开发时应添加必要的调试统计变量,以便于对驱动程序的调试测试。调试统计变量宜实现分级开关,以提供各种粒度的调试测试选项。5.4.9 导出符号规范 驱 动 程序 应 使用 内核提 供 的 EXPORT_SYMBOL_GPL 宏或 EXPORT_SYMBOL 宏 来导 出 符号。EXPORT_SYMBOL_GPL 宏导出的符号适用于包含 GPL 许可的模块,EXPORT_SYMBOL 宏导出的符号适用于任何模块。示例:驱动导出符号的两种方式 EXPORT_SYMBOL(func1);EXPORT_SYMBOL_GPL(func2);5.5 第三方技术使用 驱动程序开发若涉及对第三方技术的使用,应在驱动程序正式开发前对所涉及的第三方技术进行效率、兼容性、稳定性等方面的测试,确保第三方技术的使用不会对驱动程序的功能、性能造成不良影响。DB43/T 22602021 5 6 核内驱动具体要求 6.1 字符设备驱动程序 6.1.1 驱动程序框架 字符设备驱动程序框架见图 1。图 1 字符设备驱动程序框架 字符设备驱动包括以下部分:a)设备文件操作函数接口:字符设备驱动通过 file_operation 结构体函数集向用户空间提供设备文件操作函数接口。file_operation 结构体中的函数集用于实现驱动与/dev 下的字符设备节点联通,当用户空间的应用程序通过调用文件操作函数 open(打开)、write(写)、read(读)、close(关闭)对/dev 目录下字符设备节点进行操作时,会通过 file_operation 结构体中的对应函数来通知驱动实现对字符设备的对应操作。b)内核空间的字符设备驱动程序。驱动程序直接与字符设备硬件打交道,负责实现设备注册、设备操作等硬件操作功能。6.1.2 开发要求 6.1.2.1 函数接口 为实现系统/dev 下的字符设备节点与驱动程序的联通,字符设备驱动程序应提供并实现与 llseek、read、write、open、close 等文件操作函数接口所对应的函数实现,并通过 file_operations 文件操作结构体将文件操作函数与驱动程序内的函数实现相关联。file_operations 文件操作结构体格式应符合附录 D.1 要求。6.1.2.2 驱动程序注册 字符设备驱动程序应基于平台驱动模型注册,包含以下内容:DB43/T 22602021 6 a)应提前准备好驱动程序对应的主设备号,主设备号应使用内核已注册的主设备号之外的数值;b)应使用平台驱动结构 platform_driver 封装驱动程序信息;c)应使用平台驱动程序注册函数 platform_driver_register(drv)将驱动程序注册到平台总线的驱动程序链表中。6.1.2.3 字符设备注册 字符设备的注册应包含如下内容:a)预生成一个尚未被申请使用的设备号;b)预生成设备号的主设备号为对应的驱动程序的主设备号,从设备号应从 0 开始,宜根据驱动程序所匹配的设备数量按序取值,最大取值不超过 1048575;c)应使用静态申请方式申请设备号;d)应对 cdev 结构体进行初始化,并将实现的 file_operations 函数结构体与 cdev 关联;e)针对注册的字符设备,应使用内核提供的函数组创建对应 sys 文件系统节点,且需对返回值做错误处理,若有多个从设备,应创建 class 类。6.1.2.4 驱动匹配 字符设备驱动程序开发应同时通过设备树和 ACPI 两种方式来封装设备信息,并将封装后的信息分别添加到“驱动-设备”匹配队列中。6.2 块设备驱动程序 6.2.1 驱动程序框架 块设备驱动程序框架分为三个层次,见图 2。图 2 块设备驱动程序框架 a)通用块层:为各种类型的块设备建立一个统一的模型,接受上层发出的数据读写请求,并最终发出 I/O 请求。通用块层隐藏了底层硬件块设备的特性,为块设备提供了一个通用的抽象视图;DB43/T 22602021 7 b)输入输出调度层:接收通用块层发出的 I/O 请求,缓存请求并合并相邻的请求,根据设置好的调度算法,回调驱动层提供的请求处理函数,以处理具体的 I/O 请求;c)块设备驱动层:处理集体 I/O 请求,处理过程根据块设备类型的不同而有所不同。块设备驱动程序的一般处理流程应为:上层调用通用块层提供的接口提交 I/O 请求,这些请求首先被放入输入输出调度层的 I/O 调度队列,经过合并和排序,最终将转换后的 I/O 请求派发到具体块设备驱动准备的等待队列,由块设备驱动进一步处理。6.2.2 开发要求 6.2.2.1 函数接口 块设备驱动程序的函数接口应符合以下要求:a)虚拟块设备的驱动程序可以不提供 probe 探测函数接口;b)若块设备驱动程序中需要对 I/O 请求进行特殊处理,则应提供并实现 I/O 处理函数;示例:I/O 处理函数接口 static blk_qc_t xxx_make_request(struct request_queue*q,struct bio*bio);c)块设备驱动程序应实现 I/O 中断请求对应的中断处理函数接口,虚拟块设备的驱动程序可以不实现该函数接口;示例:中断处理函数接口 static irqreturn_t gdrom_command_interrupt(int irq,void*dev_id);d)块设备驱动程序应提供并实现 ioctl、open、close 等基本块设备操作的设备操作函数接口。示例:设备操作函数接口 int(*ioctl)(struct block_device*,fmode_t,unsigned,unsigned long);/*Ioctl接口*/int(*open)(struct block_device*,fmode_t);/*Open接口*/void(*release)(struct gendisk*,fmode_t);/*Close接口*/6.2.2.2 驱动程序加载 块设备驱动程序的加载主要包括以下内容:a)应使用 alloc_disk()块设备分配函数分配 gendisk 通用块设备结构体;b)可以通过内核提供的 register_blkdev()块设备注册函数注册设备;c)若需要 I/O 调度,应使用请求队列进行数据传输;d)应初始化 gendisk 通用块设备结构体,并对结构体的成员赋初值;e)应使用 add_disk()设备添加函数激活该块设备。6.2.2.3 驱动程序卸载 块设备驱动程序的卸载主要包括以下内容:a)应使用 del_gendisk()设备删除函数删除块设备,并使用put_disk()函数删除对块设备的引用;b)应使用blk_clean_queue()块设备队列清除函数清除请求队列,并释放请求队列所占用的资源;c)若在模块加载函数中使用了register_blkdev()块设备注册函数注册设备,则应调用unregister_ blkdev()块设备注销函数注销设备并释放对设备的引用。6.3 平台设备驱动程序 6.3.1 驱动程序框架 平台设备驱动程序可分为平台控制器驱动和平台设备驱动两个部分,驱动框架见图 3。DB43/T 22602021 8 图 3 平台设备驱动程序子系统框架 6.3.2 开发要求 6.3.2.1 函数接口 6.3.2.1.1 对外接口 平台设备驱动程序提供给应用层的接口应使用标准接口,提供的接口应有说明以及用例。提供的对外接口应采用 dev 节点方式或 sysfs 节点方式。6.3.2.1.2 电源管理接口 平台设备驱动程序应提供设备的暂停、恢复流程和电源管理接口,以确保在系统休眠或待机时可以保存设备自身的寄存器的状态以及其他必要的上下文信息,以及确保系统恢复后设备能恢复到休眠或待机之前的状态。6.3.2.2 驱动及设备注册 平台设备驱动程序应满足总线设备驱动的平台设备驱动模型,设备应注册在总线上 平台控制器驱动应注册成 master 主设备,控制器下设备驱动应注册成 slave 从设备,并使用 master 主设备提供的接口来完成收发功能。驱动程序和设备注册时,应使用系统内核提供的接口完成注册,包括:a)总线注册控制器驱动的接口;b)平台控制器设备驱动注册成总线 master 主设备的接口;c)控制器下设备驱动注册成总线 slave 从设备的接口;d)slave 从设备使用 master 主设备 xfer 的接口。6.3.2.3 设备资源的描述和获取 应使用标准的设备描述接口来描述和获取设备资源信息,包括物理地址中断号端口等其他可以描DB43/T 22602021 9 述的信息。6.3.2.4 驱动程序加载 标准的驱动程序加载应包括以下内容:a)使用设备树或者 acpi table 匹配的加载方法;b)使用标准的总线设备函数接口模型;c)驱动程序应提供设备树和 acpi table 匹配节点的方法。6.4 网络设备驱动程序 6.4.1 驱动程序框架 网络设备驱动程序框架分为网络协议接口层、网络设备接口层、提供实际功能的网络驱动接口层以及设备媒介层四层,见图 4。图 4 网络设备驱动程序框架 a)网络协议接口层:向网络层协议提供统一的数据包收发接口,使得上层协议独立于具体的设备;b)网络设备接口层:向网络协议接口层提供的用于描述具体网络设备属性和操作的 net_device结构体,该结构体是设备驱动功能层各函数的容器;c)网络驱动接口层:实现网络设备接口层 net_device 结构体中所声明的成员函数,驱使网络设备硬件完成相应动作的程序;d)设备媒介层是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介,根据设备驱动功能层中的函数在物理上驱动网络适配器等。6.4.2 开发要求 6.4.2.1 函数接口 网络设备驱动程序开发应根据 net_device 网络设备结构体中声明的成员函数实现设备驱动功能层的相关函数接口,并将 net_device 网络设备结构体注册到系统内核中。网络设备驱动程序接口应包含初始化接口,发送接口和接收接口。DB43/T 22602021 10 6.4.2.2 网络设备管理 6.4.2.2.1 管理接口 网络设备驱动程序开发应使用内核提供的接口来进行网络设备的管理,网络设备的管理应包含以下内容:a)分配及初始化网络设备 net_device;b)以太网的初始化;c)注册/注销网络设备 net_device;d)开始/停止发送队列。6.4.2.2.2 数据结构 网络设备驱动程序开发应使用内核提供的结构体来描述网络设备及设备操作,应包括以下结构体:a)sk_buff 结构体是网络驱动程序框架中信息的载体,是网络分层模型中对数据进行层层打包以及层层解包的载体;b)net_device 网络设备结构体用来描述一个网络设备,是设备接口层的核心,也是编写网络驱动程序的核心对象;c)net_device_ops 网络设备操作结构体定义了网络设备的操作方法集,其格式应符合附录 D.2要求。6.4.2.3 网络设备的中断处理 网络设备的中断处理方式分为传统中断方式和 NAPI 处理方式两种,在进行网络设备中断处理时,应根据实际业务特点和需要,按这两种方式之一进行中断处理。6.5 显示帧缓存设备驱动程序 6.5.1 驱动程序框架 显示帧缓存设备驱动程序框架见图 5。图 5 显示帧缓存设备驱动程序框架 DB43/T 22602021 11 显示帧缓存设备驱动程序分为通用层和设备层两层:通用层代码为内核通用实现,在通用代码中会提供 mmap、read、open、ioctl 等通用函数接口,用户可以直接调用这些接口;设备层代码由驱动程序实现,应提供设备操作函数接口来实现对显卡设备的操作。6.5.2 开发要求 6.5.2.1 函数接口 显示帧缓存设备驱动程序应提供并实现显示帧缓存设备的操作函数接口,以供内核实现对显示帧缓存设备的操作。应实现的显示帧缓存设备操作集结构体及应提供的设备操作函数接口格式应符合附录D.3。6.5.2.2 驱动程序注册 应通过以下两种方式进行驱动程序注册:a)PCI 设备的驱动程序应通过 pci_register_driver PCI 设备驱动程序注册函数注册。b)非 PCI 设备的驱动程序应通过 platform_driver_register 平台设备驱动程序注册函数注册。6.5.2.3 驱动程序加载 显示帧缓存设备驱动程序在加载时,应允许通过模块参数控制其加载过程。在 驱 动 开 发 时,可 用 的 模 块 参 数 应 使 用 MODULE_PARM_DESC 宏 来 进 行 声 明,并 通 过module_param_named 函数来进行参数传递。6.5.2.4 probe 探测函数 显示帧缓存设备驱动程序的 probe 探测函数应包含以下操作:a)定义所需结构体指针;b)获取中断号,根据硬件手册规范,申请中断资源 request_irq;c)获取映射 I/O 端口/内存资源:先调用 request_mem_region 函数取得 I/O 端口/内存资源,然后通过 ioremap 函数将 I/O 端口/内存资源映射到虚拟地址空间;d)初始化 fb_info 帧缓存信息结构体;e)申请并映射显存资源:PCI 设备使用显存应通过 pci_resource_start 函数来申请显存;非 PCI设备使用 DMA 内存应通过 dma_alloc_writecombine 函数来申请 DMA 内存,并根据平台特性决定是否启用 cache;f)硬件寄存器初始化;g)调用 fb_check_var 函数检查 var 相关参数是否符合要求;h)注册 framebuffer 帧缓存;i)创建硬件相关 sys 系统文件、节点等。6.5.2.5 remove 卸载函数 显示帧缓存设备驱动程序的 remove 卸载函数中应包含以下操作:a)注销 framebuffer 帧缓存;b)关闭硬件设备;c)解除显存映射;d)释放显存、中断、释放 fb_info 结构体内存以及 I/O 端口/内存资源。DB43/T 22602021 12 6.6 驱动程序的 DKMS 包制作 6.6.1 一般开发要求 开发第三方驱动程序 DKMS 包应满足以下要求:a)第三方驱动程序应以 DKMS 软件包的方式发布;b)第三方驱动程序的核心代码可以闭源,但应保证生成的二进制模块的兼容性;c)宜通过包创建工具自动生成编译 DKMS 软件包所需的控制和配置文件;d)根据是否闭源,打包后的 DKMS 包应遵循如下命名规则:开源模块命名为:原始模块名-dkms_版本号_CPU 架构.软件包格式;闭源模块命名为:原始模块名-dkms-closed_版本号_CPU 架构.软件包格式。6.6.2 核心代码闭源情况下的驱动程序开发 在第三方驱动程序核心代码需要闭源的前提下,为保证内核升级时其内部调用的符号的可用性,驱动程序开发时应满足以下要求:a)除了在内核升级时保持不变的例如 readl/writel/printk 等最基本的工具函数外,不宜使用内核的 API 接口、数据结构和变量;b)不宜使用内核的常见的框架代码;c)内核版本一般是通过编译时的宏进行判断的,除非一个内核版本发布一个二进制文件,否则不应进行内核小版本号的判断处理;d)不应使用宏进行同架构内 CPU 的判断处理;e)应精简二进制部分的代码,只包含需要保护的代码。6.6.3 核心代码的二进制封装 应使用如下方法进行核心源码的二进制封装:a)应将核心逻辑层源码闭源,直接使用核心逻辑层源码编译生成的.o 二进制文件;b)应使用 xxd 二进制显示和处理工具来将.o 可执行文件转换成.o.hex 十六进制编码文件后保存在源码目录中,并在编译时进行还原,以避免直接使用.o 可执行文件生成 ko 动态链接文件时出现编译报错;c)当存在大量.o 可执行文件需要转换时,宜编写脚本进行批量处理;d)编译时,应使用 xxd 工具将.o.hex 十六进制编码文件还原成.o 可执行文件,并通过 make 命令以生成 ko 动态链接文件;e)若.o 可执行文件需要支持多个架构平台,应在源码目录下创建 objs 目录,并在目录中分架构路径存放对应的二进制文件。6.6.4 驱动程序 DKMS 包制作 制作和加载第三方驱动程序 DKMS 包的相关技术及步骤见附录 E 和附录 F。驱动程序 DKMS 包制作应满足以下要求:a)应创建编包目录以及控制、配置文件;b)应复制源码以及封装二进制文件至编包目录中;c)应编写 src/Makefile 配置文件;d)应通过“dpkg-buildpackage-sa”命令来进行驱动程序 DKMS 包的编译。DB43/T 22602021 13 6.7 驱动程序的调试验证 可使用 printk 系列函数、OOPS 错误信息定位、FTrace 分析函数以及 perf 性能统计工具来进行驱动程序的调试验证,使用方法及示例见附录 G。7 常用外设开发要求 7.1 打印机驱动开发 7.1.1 开发环境 打印机驱动开发应在操作系统提供的统一的驱动开发环境中进行,开发环境提供了驱动编译所需要的组件及对应的参考版本号,形成统一的组件列表及组件号版本。打印机开发环境组件列表见表 1。表 1 打印机开发环境组件 序号序号 组件名称组件名称 组件描述组件描述 组件组件参考参考版本号版本号 1 libcups2-dev 通用 UNIX 打印系统 cups 开发库 2.2.2 2 libcupsimage2-dev 通用 UNIX 打印系统 cups 图像开发库 2.2.2 3 libqt4-dev Qt4 开发文件,用于打印驱动 UI 可视化交互开发 4.8.7 4 libcupsfilters-dev 用于打印驱动软件开发,包含使用 libcupsfilters开发驱动程序的头文件 1.13.4 5 qt4-qmake 用于打印驱动软件 Qt4 编译 4.8.7 6 libusb-1.0.0-dev 用于打印驱动与 USB 设备通信开发 1.0.20 7 libjpeg-dev 用于打印驱动对图片进行压缩和解压 8c-2 8 libnotify4 用于在操作系统下提示打印机状态信息 0.7.6-2 9 autoconf 用于对开源模块源码生成自动配置编译文件 2.69-6 10 gcc/g+用于打印驱动程序源代码 GNU C/C+编译 4:5.3.1 11 qt5-qmake 用于打印驱动软件 Qt5 编译 5.6.1 7.1.2 运行环境 打印机驱动应在操作系统提供的统一的运行环境中执行,不需单独安装运行环境,运行环境各组件和组件版本号,可以支撑多个打印机厂家多种设备的运行,操作系统版本宜向下兼容打印机驱动,减少驱动重复适配。打印机运行环境组件列表见表 2。表 2 打印机运行环境组件 序号序号 组件名称组件名称 组件描述组件描述 组件组件参考参考版本号版本号 1 CUPS 打印服务系统,打印驱动运行在该系统上 2.2.2 2 Qt4 为使用 Qt 开发的程序提供运行时环境 4.8.7 3 Qt5 为使用 Qt 开发的程序提供运行时环境 5.6.1 4 system-config-printer 提供打印机设备管理、任务管理等功能 1.5.7 DB43/T 22602021 14 表 2 打印机运行环境组件(续)序号序号 组件名称组件名称 组件描述组件描述 组件组件参考参考版本号版本号 5 libjpeg 提供图片压缩和解压功能 8c-2 6 dbus 打印驱动程序可通过该库使用 D-Bus 进程间通信功能 1.10.6 7.1.3 配置信息 当各打印机驱动开发商将驱动包安装到系统上或当操作系统集成这些驱动包时,打印机驱动厂商应提供相应的配置文件放置于指定目录下,以满足运行时的必要配置文件要求。配置文件应遵循以下要求:a)配置文件存放于/etc/kylin-printer/目录下,以.conf 为后缀,配置文件名以各厂商名命名,如 printer-xxx.conf;b)同一厂商的不同型号打印机,均写入该配置文件中,允许出现同一驱动库对应不同型号的打印机;c)有新驱动库安装入系统时,要求驱动包自行向该配置文件内追加内容;d)配置文件中应指明打印机的具体型号,以及该型号的驱动库存放在操作系统上的具体路径;e)驱动库应具有明确的标识符,安装于系统/usr/lib/kylin-printer/目录下,各厂商在此目录下建立以厂商名命名的目录,将其驱动库放置于其中。具体的配置格式实例见附录 H。7.2 扫描仪驱动开发 7.2.1 开发环境 扫描仪驱动开发应在操作系统统一的驱动开发环境中进行,开发环境提供了驱动编译所需要的组件及对应的版本号,形成统一的组件列表及组件号版本。扫描仪开发环境组件列表见表 3。表 3 扫描仪开发环境组件 序号序号 组件名称组件名称 组件描述组件描述 组件组件参考参考版本号版本号 1 libsane-dev 用于扫描仪驱动开发 1.0.25+20150528 2 libusb-1.0.0-dev 用于扫描仪驱动与 USB 设备通信开发 1.0.20 3 libjpeg-dev 用于扫描仪驱动对图片进行压缩和解压 8c-2 4 autoconf 用于对开源模块源码生成自动配置编译文件 2.69-6 5 gcc/g+用于扫描仪驱动程序源代码编译 4:5.3.1 6 git 用于扫描仪驱动源代码库管理 1:2.7.4 7 pkg-config 用于获得系统库/模块的所有编译相关的信息,供扫描仪驱动开发参考和引用 0.29.1 7.2.2 运行环境 扫描仪驱动应在操作系统统一的运行环境中执行,不需单独安装运行环境。运行环境应包含各组件名称和组件版本号,可支撑多个扫描仪厂家及多种扫描仪设备的运行;操作系统版本应向下兼容扫描仪DB43/T 22602021 15 驱动,减少扫描仪驱动在不同操作系统版本上多次适配。扫描仪运行环境组件列表见表 4。表 4 扫描仪运行环境组件 序号序号 组件名称组件名称 组件描述组件描述 组件版本号组件版本号 1 libsane 通用扫描仪接口 1.0.25+20150528 2 libsane-common 通用扫描仪接口 1.0.25+20150528 3 libusb-1.0.0 用于扫描仪驱动与 USB 设备通信开发 1.0.20 7.3 手写液晶屏驱动开发 7.3.1 开发环境 手写液晶屏驱动开发应在操作系统统一的驱动开发环境中进行,开发环境提供了驱动编译所需要的组件及对应的版本号,形成统一的组件列表及组件号版本。手写液晶屏开发环境组件列表见表 5。表 5 手写液晶屏开发环境组件 序号序号 组件名称组件名称 组件描述组件描述 组件组件参考参考版本号版本号 1 libqt4-dev Qt4 用于手写液晶屏驱动软件开发 4.8.7 2 qt4-qmake Qt4 用于手写液晶屏驱动软件编译 4.8.7 3 libusb-1.0.0-dev 用于手写液晶屏驱动与 USB 设备通信开发 1.0.20 4 autoconf 用于对开源模块源码生成自动配置编译文件 2.69-6 5 gcc/g+用于手