驱动注册的probe函数.docx

驱动注册的probe函数.docx

ID:53112454

大小:17.25 KB

页数:4页

时间:2020-04-01

驱动注册的probe函数.docx_第1页
驱动注册的probe函数.docx_第2页
驱动注册的probe函数.docx_第3页
驱动注册的probe函数.docx_第4页
资源描述:

《驱动注册的probe函数.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、驱动注册的probe函数probe函数在设备驱动注册最后收尾工作,当设备的device和其对应的driver在总线上完成配对之后,系统就调用platform设备的probe函数完成驱动注册最后工作。资源、中断调用函数以及其他相关工作。下面是probe被调用的一些程序流程。从driver_register看起:[cpp] viewplaincopy1.int driver_register(struct device_driver * drv)  2.{  3.    klist_init(&drv->klist_devices, klist_devices_get, klist_devices

2、_put);  4.    init_completion(&drv->unloaded);  5.    return bus_add_driver(drv);  6.}  klist_init与init_completion没去管它,可能是2.6的这个设备模型要做的一些工作。直觉告诉我要去bus_add_driver。bus_add_driver中:都是些Kobject与klist、attr等。还是与设备模型有关的。但是其中有一句:driver_attach(drv);单听名字就很像:[cpp] viewplaincopy1.void driver_attach(struct device

3、_driver * drv)  2.{  3.    bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);  4.}  这个熟悉,遍历总线上的设备并设用__driver_attach。在__driver_attach中又主要是这样:driver_probe_device(drv,dev);跑到driver_probe_device中去看看:有一段很重要:if(drv->bus->match&&!drv->bus->match(dev,drv))gotoDone;明显,是调用的驱动的总线上的match函数。如果返回1,则可以继续,否则就D

4、one了。继承执行的话:[cpp] viewplaincopy1.if (drv->probe)  2.    ret = drv->probe(dev);  3.if (ret) {  4.    dev->driver = NULL;  5.    goto ProbeFailed;  1.}  只要probe存在则调用之。至此就完成了probe的调用。这个过程链的关键还是在drv->bus->match,因为其余的地方出错的话就是注册失败,而只要注册不失败且match返回1,那么就铁定会调用驱程的probe了。你可以注册一个总线类型和总线,并在match中总是返回1,会发现,只要stru

5、ctdevice_driver中的bus类型正确时,probe函数总是被调用.有两个重要的链表挂在bus上,一个是设备device链表,一个是驱动driver链表。每当我们向一根bus注册一个驱动driver时,套路是这样的:driver_register(structdevice_driver*drv)->bus_add_driver()->driver_attach()->bus_for_each_dev(drv->bus,NULL,drv,__driver_attach);bus_for_each_dev遍历该总线上所有的device,执行一次__driver_attach(),看能不能

6、将驱动关联(attach)到某个设备上去。__driver_attach()->driver_probe_device()->drv->bus->match(dev,drv),//调用bus的match函数,看device和driver匹不匹配。如果匹配上,继续执行really_probe()。->really_probe()->driver->probe()。(如果bus->probe非空,则调用bus->probe)而每当我们向一根bus添加一个硬件时时,套路是这样的:device_add()\device_add中有很多操作kobject,注册sysfs,形成硬件hiberarchy结

7、构的代码。如果您忘记了,先回头去参考参考"我是sysfs"->bus_attach_device()->device_attach()->bus_for_each_drv()bus_for_each_drv与bus_for_each_dev类似,遍历该总线上所有的driver,执行一次__device_attach(),看能不能将设备关联(attach)到某个已登记的驱动上去。__device_a

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。