linux内核部件分析(九)——设备驱动模型之device-driver.docx

linux内核部件分析(九)——设备驱动模型之device-driver.docx

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

前面我们分析了device、driver、bus三种类型,主要是三者的注册与注销,在sysfs中的目录与属性文件创建等内容。本节就来详细分析下,在设备注册到总线上时,总线是如何为其寻找对应的驱动的;在驱动注册到总线上时,总线又是如何为其寻找对应的设备的。?本节的实现代码集中在drivers/base/bus.c和drivers/base/dd.c中。先来回忆下,在device_register()-device_add()中,先是调用bus_add_device()添加device与bus间的联系,并添加bus为device定义的属性,然后会调用bus_probe_device()。bus_probe_device()会试图为已挂在总线上的该设备寻找对应的驱动。我们的故事就从这里开始。[cpp]?/qb_2008/article/details/6854086view plain/qb_2008/article/details/6854086copy/qb_2008/article/details/6854086print/qb_2008/article/details/6854086?/**??*?bus_probe_device?-?probe?drivers?for?a?new?device??*?@dev:?device?to?probe??*??*?-?Automatically?probe?for?a?driver?if?the?bus?allows?it.??*/?void?bus_probe_device(struct?device?*dev)??{???struct?bus_type?*bus?=?dev-bus;???int?ret;????if?(bus??bus-p-drivers_autoprobe)?{???ret?=?device_attach(dev);???WARN_ON(ret??0);???}??}??bus_probe_device()为总线上的设备寻找驱动。它先是检查bus-p-drivers_autoprobe,看是否允许自动探测。允许了才会调用device_attach()进行实际的寻找工作。说到bus-p-drivers_autoprobe这个变量,它是在bus_type_private中的,在调用bus_register()前都初始化不了,在bus_register()中自动定为1。所以,除非是用户空间通过drivers_autoprobe属性文件主动禁止,bus总是允许自动探测的,所有的bus都是如此。[cpp]?/qb_2008/article/details/6854086view plain/qb_2008/article/details/6854086copy/qb_2008/article/details/6854086print/qb_2008/article/details/6854086?/**??*?device_attach?-?try?to?attach?device?to?a?driver.??*?@dev:?device.??*??*?Walk?the?list?of?drivers?that?the?bus?has?and?call??*?driver_probe_device()?for?each?pair.?If?a?compatible??*?pair?is?found,?break?out?and?return.??*??*?Returns?1?if?the?device?was?bound?to?a?driver;??*?0?if?no?matching?driver?was?found;??*?-ENODEV?if?the?device?is?not?registered.??*??*?When?called?for?a?USB?interface,?@dev-parent-sem?must?be?held.??*/?int?device_attach(struct?device?*dev)??{???int?ret?=?0;????down(dev-sem);???if?(dev-driver)?{???ret?=?device_bind_driver(dev);???if?(ret?==?0)???ret?=?1;???else?{???dev-driver?=?NULL;???ret?=?0;???}???}?else?{???pm_runtime_get_noresume(dev);???ret?=?bus_for_each_drv(dev-bus,?NULL,?dev,?__device_attach);???pm_runti

文档评论(0)

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

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

1亿VIP精品文档

相关文档