linux杂项设备驱动模型.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux杂项设备驱动模型

? Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。?所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。?在内核中用struct?miscdevice表示miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。miscdevice的API实现在drivers/char/misc.c中。? ?混杂项设备驱动的程序组织架构: 新建一个first_led.c,先可能用到的头文件都引用上吧! #include linux/kernel.h #include linux/module.h//驱动模块必需要加的个头文件 #include linux/miscdevice.h #include linux/fs.h #include linux/types.h #include linux/moduleparam.h #include linux/slab.h #include linux/ioctl.h #include linux/cdev.h #include linux/delay.h. //对应着相应机器平台的头文件 #include mach/gpio.h #include mach/regs-gpio.h #include plat/gpio-cfg.h //给自己设备驱动定义一个名字 #define DEVICE_NAME First_led ? ? 名字有了,但样子是怎样的呢?现在就开始定义一个“样子”! ? 如果一个字符设备驱动要驱动多个设备,那么它就不应该用misc设备来实现。 ? 通常情况下,一个字符设备都不得不在初始化的过程中进行下面的步骤:? 通过alloc_chrdev_region()分配主次设备号。 使用cdev_init()和cdev_add()来以一个字符设备注册自己。 ? 而一个misc驱动,则可以只用一个调用misc_register() 来完成这所有的步骤。(所以miscdevice是一种特殊的chrdev字符设备驱动) 所有的miscdevice设备形成一个链表,对设备访问时,内核根据次设备号查找 对应的miscdevice设备,然后调用其file_operations中注册的文件操作方法进行操作。 ?在Linux内核中,使用struct?miscdevice来表示miscdevice。这个结构体的定义为: ? struct?miscdevice?? { int?minor; const?char?*name; const?struct?file_operations?*fops; struct?list_head?list; struct?device?*parent; struct?device?*this_device; const?char?*nodename; mode_t?mode; }; minor是这个混杂设备的次设备号,若由系统自动配置,则可以设置为 MISC_DYNANIC_MINOR,name是设备名? 为了容易理解,我们先打大概的“样子”做好。只做minor、name、fops; 定义一个myfirst_led_dev设备: ? ? static struct miscdevice myfirst_led_dev = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = myfirst_led_dev_fops, }; ? ? Minor??name???都已经定义好了。那么接下来实现一下myfirst_led_dev_fops方法。 内核中关于file_operations的结构体如下: struct?file_operations?{ struct?module?*owner; loff_t?(*llseek)?(struct?file?*,?loff_t,?int); ssize_t?(*read)?(struct?file?*,?char?__user?*,?size_t,?loff_t?*); ssize_t?(*write)?(struct?file?*,?const?char?__user?*,?size_t,?loff_t?*); ssize_t?(*aio_read)?(struct?kiocb?*,?const?struct?iovec?*,?

文档评论(0)

wuyuetian + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档