日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

platform总线的probe函数调用

發布時間:2023/12/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 platform总线的probe函数调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????我們知道,platform總線提供了設備和驅動的mach函數,當設備和驅動匹配完成后,就會執行驅動的probe函數,但是這個probe函數是如何被調用的呢。

????probe函數在設備驅動注冊最后收尾工作,當設備的device 和其對應的driver 在總線上完成配對之后,系統就調用platform設備的probe函數完成驅動注冊最后工作。資源、中斷調用函數以及其他相關工作。下面是probe被調用的一些程序流程。

1:從注冊函數platform_driver_register()函數開始

int?platform_driver_register(struct?platform_driver?*drv) {drv->driver.bus?=?&platform_bus_type;if?(drv->probe)drv->driver.probe?=?platform_drv_probe;if?(drv->remove)drv->driver.remove?=?platform_drv_remove;if?(drv->shutdown)drv->driver.shutdown?=?platform_drv_shutdown;return?driver_register(&drv->driver); }

這個函數首先是對驅動進行填充,然后調用driver_register()函數,這個函數是向內核注冊驅動的函數,不同的總線最終都是調用這個函數向內核進行驅動的注冊。

driver_register(&drv->driver);

????bus_add_driver(drv);

?????????driver_attach(drv);

????????????bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);

??????????????? __driver_attach

__driver_attach函數如下

static?int?__driver_attach(struct?device?*dev,?void?*data) {struct?device_driver?*drv?=?data;/**?Lock?device?and?try?to?bind?to?it.?We?drop?the?error*?here?and?always?return?0,?because?we?need?to?keep?trying*?to?bind?to?devices?and?some?drivers?will?return?an?error*?simply?if?it?didn't?support?the?device.**?driver_probe_device()?will?spit?a?warning?if?there*?is?an?error.*/if?(!driver_match_device(drv,?dev))return?0;if?(dev->parent)????/*?Needed?for?USB?*/device_lock(dev->parent);device_lock(dev);if?(!dev->driver)driver_probe_device(drv,?dev);device_unlock(dev);if?(dev->parent)device_unlock(dev->parent);return?0; }

分析可知,首先是調用driver_mach_device函數進行設備和驅動的匹配(這里應該根據具體的總線來調用相應的mach函數),如果匹配失敗則直接return 0,如果匹配成功,則進行下一步,probe函數的調用,probe函數的調用通過driver_probe_device()函數來引出。調用層次如下

driver_probe_device(drv, dev);???

????really_probe(dev, drv);

really_probe()函數的部分代碼如下

if?(dev->bus->probe)?{ret?=?dev->bus->probe(dev);if?(ret)goto?probe_failed;}?else?if?(drv->probe)?{ret?=?drv->probe(dev);if?(ret)goto?probe_failed;}

分析可知,在驅動和設備匹配成功后,首先會判斷總線的的probe指針是否為空,如果不為空,則執行總線的prboe函數,如果總線的prboe函數為空,則進一步判斷驅動的probe函數是否為空,如果不為空,則執行驅動的probe函數

轉載于:https://blog.51cto.com/11674570/1952431

總結

以上是生活随笔為你收集整理的platform总线的probe函数调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。