简单字符设备驱动程序.docxVIP

  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文档。上传文档
查看更多
linux 驱动程序开发步骤 查看原理图、数据手册,了解设备的操作方法。 在内核中找到相近的驱动程序,以它为模板进行开发,有时候需要从零开始。 3)实现驱动程序的初始化:比如向内核注册驱动程序,这样应用程序传入文件名时,内核才能找到相应的驱动程序。 4)设计所要实现的操作,比如open,read,write,close。 5)实现中断服务(不是必需的) 编译该驱动程序到中,或者用insmod 命令加载。 测试驱动程序。 驱动框架 应用程序 API 接口 read,open,write 是对应驱动程序上的 led_read,led_open,led_write 的 写出驱动函数 led_read,led_open,led_write 每个系统调用,驱动程序怎样和它对应起来?? 定义一个 file_operations 结构,和应用层 API 对接, Linux 系统怎么知道去调用哪个驱动程序的 file_operations?? 根据设备类型和主设备号 例如应用层程序 open(dev/led);根据打开的文件属性中的根据设备类型和主设备号,找到内核中注册了的 file_operations 结构来判断是哪个驱动程序。 所以,要将注册函数将主设备号和 file_operations 一起注册到内核 最后把驱动程序加载到内核 如module_init(memdev_init); 加载时,就调用驱动初始化函数,向内核注册 |--------------------------------------------------------------------| | APP:open(dev/xxx);write();read() | | 文件属性:设备类型 c 主设备号 11 | |--------------------------------------------------------------------| | C 库 | |--------------------------------------------------------------------| | VFS 内核 | | chrdev 数组 0,1,2...11... | | 找到对应的 file_operations | |--------------------------------------------------------------------| | 1)led_read();led_write();led_open(); | |驱动程序:2)定义了file_operations 关联APP 函数 | | 3)chardev_region()注册到内核 | |--------------------------------------------------------------------| 注意: chardev_region()是2.4的接口, struct cdev 是2.6的接口 一、重要知识点 主次设备号 dev_t dev_t 是内核中用来表示设备编号的数据类型; int MAJOR(dev_t dev) int MINOR(dev_t dev) 这两个宏抽取主次设备号。 dev-_t MKDEV(unsigned int major, unsigned int minor) 这个宏由主/次设备号构造一个dev_t 结构。 分配和释放设备号静态申请设备号 int register_chardev_region(dev_t first,unsigned int count, char *name) //分配成功时,返回0,错误时,返回一个负的错误码参数: first 要注册的第一个设备号 count 要注册的设备号个数 name 设备名 Int alloc_chardev_region(dev_t *dev,unsigned int firstminor, unsigned int count, char *name) //分配成功时,返回0,错误时,返回一个负的错误码 //alloc_chardev_region 函数调用成功后,会把得到的设备号放入dev 中 参数: dev 分配到的设备号firstminor 起始次设备号count、name 和静态一样 动态申请设备号,注意第一个参数是传地址,而静态则是传 值。 几种重要的数据结构 struct file file 结构代表一个打开的文件,它由内核在open 时创建,并传递给该文件上进行操作的所有函数,直到最后的close

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

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

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档