第11章设备驱动程序设计基础.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第 11 章 设备驱动程序设计基础 * 本章重点 1.?在Linux环境下查看设备文件。 2.?主设备号与次设备号。 3.?设备驱动程序设计流程。 4.?设备的分类及相关的数据结构。 5.?简单字符设备驱动程序的设计。 6. GPIO驱动程序的设计。 * 11.1 设备驱动程序的概念 Linux系统的设备文件为3类:字符设备文件、块设备文件和网络设备文件。 1. 设备文件的查看 在Linux系统的/dev目录下,使用命令ls –al |more可以查看到设备文件的一些相关信息 2. 主设备号与次设备号 主设备号标识设备对应的驱动程序,次设备号由内核使用,用于指向设备。 一个主设备号可以驱动多个设备。例如,/dev/null和/dev/zero都由驱动1来管理, 而虚拟控制台和串口终端都由驱动4管理。 * 11.1 设备驱动程序的概念 设备号在内核中的定义,体现在linux/types.h中一个dev_t类型,用来定义设备编号,包含主、次设备号。为获得一个dev_t的主设备号或者次设备号,可以使用以下函数: major(dev_t dev); minor(dev_t dev); * 11.1 设备驱动程序的概念 例如:输出主从设备号的程序。 # includeunistd.h # includesys/stat.h int main() { struct stat *ptr; stat(“/etc/passwd”,ptr); printf(The major device no is:%d\n,major(ptr-st_dev));/*主设备号*/ ???? ?printf(The minor device no is:%d\n,minor(ptr-st_dev));/*从设备号*/ return 0; } * 12.2.2 打开通讯端口 3. 设备驱动相关的数据结构 编写字符设备驱动程序会涉及到3个结构体,即file_operation(文件操作)、file(文件)、inode(节点),它们定义在include/linux/fs.h文件中。 编写块设备驱动程序也要涉及3个结构体,即:结构体block_device_operation定义在include/linux/fs.h文件中;结构体gendisk定义在include/genhd.h文件中;结构体request定义在include/linux/blkdev.h文件中。 * 11.2 驱动程序的设计流程 字符驱动程序设计流程 * 11.2 驱动程序的设计流程 字符驱动程序设计流程 字符设备驱动程序流程: (1)定义设备文件file_operation结构体变量; (2)定义相关设备操作函数; (3)定义设备初始化函数。 module_init(“设备初始化函数”);在设备初始化函数中,调用register_chrdev函数向系统注册设备; (4)定义设备卸载函数 module_exit(“设备卸载函数”); 在设备卸载函数中调用unregister_chrdev函数释放设备。 (5)编译设备 编译成模块时,在gcc的命令行里加上这样的参数:-D_KERNEL_ -DMODULE -C * 11.2 驱动程序的设计流程 字符驱动程序设计流程 (6)加载模块 当设备驱动程序以模块形式加载时,模块在调用insmod命令时被加载,此时的入口地址是init_module或module_init函数,在该函数中完成设备的注册。接着根据用户的实际需要,对相应设备进行读、写等操作。 模块用insmod命令加载,加载模块时调用函数module_init ; (7)查看设备 用lsmod命令来查看所有已加载的模块状态; (8)申请设备节点 在成功地向系统注册了设备驱动程序后(调用register_chrdev成功后),就可以用mknod命令来把设备映射为一个特别文件,其他程序使用这个设备的时候,只要对此特别文件进行操作就行了。 (9)卸载设备 同样在执行命令rmmod时调用函数cleanup_module或module_exit,完成设备的卸载。 * 11.2 驱动程序的设计流程 字符驱动程序设计流程 表11.1 内核模块常用命令 命 令 功 能 lsmod 列出系统中加载的模块 insmod 加载模块 rmmod 卸载模块 mknod 创建相关模块 * 11.2 驱动程序的设计流程 11.2.2 驱动程序流程设计举例 (1)在RedHat Linux 9的home文件夹下,新建文件夹driver,在文件夹driver用vi编辑器编辑下面的驱动程序hello.c。 #includ

文档评论(0)

jyr0221 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档