linux內(nèi)核部件分析(九)——設備驅(qū)動模型之device-driver

linux內(nèi)核部件分析(九)——設備驅(qū)動模型之device-driver

ID:42604127

大?。?3.31 KB

頁數(shù):15頁

時間:2019-09-18

linux內(nèi)核部件分析(九)——設備驅(qū)動模型之device-driver_第1頁
linux內(nèi)核部件分析(九)——設備驅(qū)動模型之device-driver_第2頁
linux內(nèi)核部件分析(九)——設備驅(qū)動模型之device-driver_第3頁
linux內(nèi)核部件分析(九)——設備驅(qū)動模型之device-driver_第4頁
linux內(nèi)核部件分析(九)——設備驅(qū)動模型之device-driver_第5頁
資源描述:

《linux內(nèi)核部件分析(九)——設備驅(qū)動模型之device-driver》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在教育資源-天天文庫。

1、前面我們分析了device、driver、bus三種類型,主要是三者的注冊與注銷,在sysfs中的目錄與屬性文件創(chuàng)建等內(nèi)容。本節(jié)就來詳細分析下,在設備注冊到總線上時,總線是如何為其尋找對應的驅(qū)動的;在驅(qū)動注冊到總線上時,總線又是如何為其尋找對應的設備的。???本節(jié)的實現(xiàn)代碼集中在drivers/base/bus.c和drivers/base/dd.c中。先來回憶下,在device_register()->device_add()中,先是調(diào)用bus_add_device()添加device與bus間

2、的聯(lián)系,并添加bus為device定義的屬性,然后會調(diào)用bus_probe_device()。bus_probe_device()會試圖為已掛在總線上的該設備尋找對應的驅(qū)動。我們的故事就從這里開始。[cpp]?viewplaincopyprint?1./**?2.?*?bus_probe_device?-?probe?drivers?for?a?new?device?3.?*?@dev:?device?to?probe?4.?*?5.?*?-?Automatically?probe?for?a?d

3、river?if?the?bus?allows?it.?6.?*/??7.void?bus_probe_device(struct?device?*dev)??8.{??9.????struct?bus_type?*bus?=?dev->bus;??10.????int?ret;??11.??12.????if?(bus?&&?bus->p->drivers_autoprobe)?{??13.????????ret?=?device_attach(dev);??14.????????WARN_ON

4、(ret?p->drivers_autoprobe,看是否允許自動探測。允許了才會調(diào)用device_attach()進行實際的尋找工作。說到bus->p->drivers_autoprobe這個變量,它是在bus_type_private中的,在調(diào)用bus_register()前都初始化不了,在bus_register()中自動定為1。所以,除非是用戶空間通過drivers

5、_autoprobe屬性文件主動禁止,bus總是允許自動探測的,所有的bus都是如此。[cpp]?viewplaincopyprint?1./**?2.?*?device_attach?-?try?to?attach?device?to?a?driver.?3.?*?@dev:?device.?1.?*?2.?*?Walk?the?list?of?drivers?that?the?bus?has?and?call?3.?*?driver_probe_device()?for?each?pair.?

6、If?a?compatible?4.?*?pair?is?found,?break?out?and?return.?5.?*?6.?*?Returns?1?if?the?device?was?bound?to?a?driver;?7.?*?0?if?no?matching?driver?was?found;?8.?*?-ENODEV?if?the?device?is?not?registered.?9.?*?10.?*?When?called?for?a?USB?interface,?@dev->

7、parent->sem?must?be?held.?11.?*/??12.int?device_attach(struct?device?*dev)??13.{??14.????int?ret?=?0;??15.??16.????down(&dev->sem);??17.????if?(dev->driver)?{??18.????????ret?=?device_bind_driver(dev);??19.????????if?(ret?==?0)??20.????????????ret?=?1

8、;??21.????????else?{??22.????????????dev->driver?=?NULL;??23.????????????ret?=?0;??24.????????}??25.????}?else?{??26.????????pm_runtime_get_noresume(dev);??27.????????ret?=?bus_for_each_drv(dev->bus,?NULL,?dev,?__device_attach);??28.????????pm

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。