- 1、本文档共88页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
9 嵌入式Linux设备驱动开发 9.1 设备驱动概述 9.1.1 设备驱动简介及驱动模块 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件只是个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。 设备驱动程序是内核的一部分,它完成以下的功能: 对设备初始化和释放 把数据从内核传送到硬件,从硬件读取数据。 读取应用程序传送给设备文件的数据和回送应用程序请求的数据 检测和处理设备出现的错误 Linux内核中采用可加载的模块化设计,常见的驱动程序也 作为内核模块动态加载的,而一些最基础的驱动则直接编译 在内核文件中。 应了解掌握一些模块相关命令: 1、lsmod 列出系统中所有已经加载的模块的大小与名称等 2、modinfo 查看模块信息 3、rmmod 移除已挂载模块 4、insmod和modprobe用于挂载模块 insmod 功能上没有modprobe 强,modprobe 在挂载模块是不用指定模块文件的路径,也不用带文件的后缀.o 或.ko ;而insmod 需要的是模块的所在目录的绝对路径,并且一定要带有模块文件名后缀的(modulefile.o 或modulesfile.ko ); 5、mkmod用于创建相关模块 9.1.2 设备文件分类 分为三类:块设备文件、字符设备文件和网络设备文件 块设备文件通常指一些需要以块的方式写入的设备 字符设备文件通常指可以直接读写,没有缓冲区的设备 9.1.3设备号 在Linux内核看来,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务;而次设备号则用来标识具体且唯一的某个设备。 9.1.4驱动层次结构 9.1.5 设备驱动程序与外界的接口 Linux设备驱动程序与外界的接口可以分为三部分: 驱动程序与操作系统内核的接口:通过数据结构file_operations来完成 驱动程序与系统引导的接口:利用驱动程序对设备进行初始化 驱动程序与设备的接口:描述了驱动程序如何与设备进行交互,与具体设备密切相关 9.1.6 设备驱动程序的特点 内核代码:设备驱动程序是内核的一部分,如果驱动程序出错,则可能导致系统崩溃 内核接口:设备驱动程序必须为内核或者其子系统提供的一个标准接口。比如,一个终端驱动程序必须为内核提供一个文件I/O接口;一个SCSI设备驱动程序应该为SCSI子系统提供一个SCSI设备接口,同时SCSI子系统也必须为内核提供文件的I/O接口及缓冲区。 内核机制和服务:设备驱动程序使用一些标准的内核服务,如内存分配等等 可装载:大多数的Linux 操作系统设备驱动程序都可以在需要时装载进内核,在不需要时从内核中卸载。 可设置:Linux 操作系统设备驱动程序可以集成为内核的一部分,并可以根据需要把其中的某一部分集成到内核中,这只需要在系统编译时进行相应的设置即可 动态性:在系统启动且各个设备驱动初始化后,驱动程序将维护其控制的设备。如果该设备驱动程序控制的设备不存在也不影响系统的运行,那么此时的设备驱动程序只是多占了一点系统内存 9.2 字符设备驱动编写 1. 字符设备驱动编写流程 流程说明: 驱动程序静态编译到内核;和OS挂接入口点,没有main函数 驱动程序作为内核模块的一部分,可以通过调用insmod命令动态加载到内核中去;同样可以通过调用rmmod卸载。 gcc编译参数:-D__KERNEL__ -DMODULE –Ikernelsrc_include_dir 模块必须在一个文件里实现 init_module:insmod自动调用,负责初始化工作 参见:kernel/include/linux/init.h cleanup_module:卸载时调用,负责清除工作 下例给出了实现了一个最基本内核模块的程序框架,注意它不提供实际的功能,但是可以作为模块编程的模板。 #includelinux/module.h #includelinux/kernel.h #includelinux/init.h #includelinux/errno.h #includelinux/sched.h /* 函数说明 */ static int __init module_init(void) static void module_cleanup(void) /* 模块注册函数 */ module_init(module_init)
您可能关注的文档
最近下载
- 2025CSCO非小细胞肺癌诊疗指南2025.docx
- 第二节+串并联电路中电流的规律(教学课件)物理鲁科版(五四学制)2024九年级上册.pptx VIP
- 电信研发工程师L1题库.xlsx VIP
- DBJD25-67-2019 甘肃省建筑与装饰工程预算定额地区基价 不含税 中册.docx VIP
- 水生态产品价值实现路径.pptx
- 学习解读《中华人民共和国反不正当竞争法》课件(2025年新修订版).pptx VIP
- 数据架构、应用架构、业务架构及技术架构4A架构设计方案.pptx VIP
- 组合式空调机组运行调试使用及维护.pdf VIP
- 工程类邀请招标文件参考模板.doc VIP
- 电力内外线课题六 配电线路设备.ppt VIP
文档评论(0)