设备驱动程序设计.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文档。上传文档
查看更多
设备驱动程序设计

设备驱动内涵 设备驱动程序是一个函数和数据结构的集合,它的目的是实现一个简单的管理设备的接口. 设备驱动程序一般都集成在操作系统内核中,使不同的应用程序进行共享 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口. 设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件一样对硬件设备进行操作.设备驱动程序是内核的一部分,它完成以下的功能: 1.对设备初始化和释放. 2.把数据从内核传送到硬件和从硬件读取数据. 3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据. 4.检测和处理设备出现的错误. 设备节点 大多数设备存在的特殊访问文件叫做设备节点,他们都定位在/dev目录里 。 当在系统中添加新设备或将附加设备的支持编译进内核之后,都必须为其建立设备节点 设备驱动程序接口 由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如 open,read,write,close...., 如何把系统调用和驱动程序关联起来呢? 设备驱动程序接口 结构struct file_operations 输入、输出系统向内核提供的统一的标准设备接口 定义在include/linux/fs.h中 lseek - 移动文件指针的位置,只用于可以随机存取的设备 read – 从字符设备读数据 Write – 向字符设备写数据 Open-打开设备,并初始化设备 Release-关闭设备,并释放资源 这个结构的每一个成员的名字都对应着一个系统调用.用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数 设备驱动程序设计者需要决定需要用哪些接口函数操作设备,为此要创建一个file_operations{}结构的实例。 init_module() cleanup_module() 分别是驱动程序的入口和出口 设备注册表 用于字符设备的注册 #define MAX_CHRDEV 255 static struct device_struct chrdevs[MAX_CHRDEV] ={ {null,null}, }; 设备注册后都要登记在device_struct Name设备名 struct file_operations *fops对设备操作的函数指针 设备管理函数 当安装一种设备时必须向系统提供它的设备驱动程序。 设备注册时,系统首先构筑file_operations结构体,然后把驱动程序的各个操作历程的入口地址赋予该结构体。 设备注册是通过系统调用实现的 设备管理函数 fs/devices.c register_chrdev(unsigned int major,const char *name,struct file_operations) 如果传入的major为0,则通过对主设备号按照由高到低的顺序进行检索,获得一个可使用的device_struct 0major255 若所有的major_number都被占用,返回-EBUSY错误码 同时注册设备接口struct file_operations If(major==0) { for(major=MAX_CHRDEV-1;major0;major--) { if(chrdevs[major].fops==null) { chrdevs[major].name=name; chrdevs[major].fops=fops; return major; } } return –EBUSY; } 不需要设备时系统需要调用unregister_chrdev()删除该字符设备的操作函数接口fops在内核 中的记录 Int unregister_chrdev(unsigned int major,const char *name) unregister_chrdev找到设备确认后,将改设备的device_struct中的name与fops赋值为null,达到注销设备的目的 if(strcmp(chrdevs[major].name,name) return -EINVAL; chrdevs[major].name=nul

文档评论(0)

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

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

1亿VIP精品文档

相关文档