驅動註冊的probe函式

2021-08-25 16:01:42 字數 1977 閱讀 7407

probe的呼叫

從driver_register看起:

int driver_register(struct device_driver * drv)

klist_init與init_completion沒去管它,可能是2.6的這個裝置模型要做的一些工作。直覺告訴我要去bus_add_driver。

bus_add_driver中:

都是些kobject 與 klist 、attr等。還是與裝置模型有關的。但是其中有一句:

driver_attach(drv);

單聽名字就很像:

void driver_attach(struct device_driver * drv)

這個熟悉,遍歷匯流排上的裝置並設用__driver_attach。

在__driver_attach中又主要是這樣:

driver_probe_device(drv, dev);

跑到driver_probe_device中去看看:

有一段很重要:

if (drv->bus->match && !drv->bus->match(dev, drv))

goto done;

明顯,是呼叫的驅動的匯流排上的match函式。如果返回1,則可以繼續,否則就done了。

繼承執行的話:

if (drv->probe)

只要probe存在則呼叫之。至此就完成了probe的呼叫。

這個過程鏈的關鍵還是在drv->bus->match ,因為其餘的地方出錯的話就是註冊失敗,而只要註冊不失敗且match返回1,那麼就鐵定會呼叫驅程的probe了。你可以註冊乙個匯流排型別和匯流排,並在 match中總是返回 1, 會發現,只要struct device_driver中的bus型別正確時,probe函式總是被呼叫.

有兩個重要的鍊錶掛在bus上,乙個是裝置device鍊錶,乙個是驅動driver鍊錶。

每當我們向一根bus註冊乙個驅動driver時,套路是這樣的:

driver_register(struct device_driver * drv) -> bus_add_driver() -> driver_attach() ->

bus_for_each_dev(drv->bus, null, drv, __driver_attach);

bus_for_each_dev遍歷該匯流排上所有的device,執行一次__driver_attach(),看能不能將驅動關聯(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結構的**。

如果您忘記了,先回頭去參考參考"我是sysfs"

->bus_attach_device() -> device_attach() ->bus_for_each_drv()

bus_for_each_drv與bus_for_each_dev類似,遍歷該匯流排上所有的driver,執行一次__device_attach(),看能不能將裝置關聯(attach)到某個已登記的驅動上去。

__device_attach()

->driver_probe_device() //後面與上面一樣

總結一些,一句話,註冊乙個某個bus的驅動就是先把驅動自己鏈入到bus驅動鏈表中去,在從bus的裝置鍊錶中一一尋找,看有沒有自己可以關聯上的裝置。找到就probe,再把二者bind起來。反之,新增裝置道理也是一樣的。

驅動註冊的probe函式

probe的呼叫 從driver register看起 int driver register struct device driver drv klist init與init completion沒去管它,可能是2.6的這個裝置模型要做的一些工作。直覺告訴我要去bus add driver。bus...

驅動註冊的probe函式

probe的呼叫 從driver register看起 int driver register struct device driver drv klist init與init completion沒去管它,可能是2.6的這個裝置模型要做的一些工作。直覺告訴我要去bus add driver。bus...

驅動註冊的probe函式

probe的呼叫 從driver register看起 int driver register struct device driver drv klist init與init completion沒去管它,可能是2.6的這個裝置模型要做的一些工作。直覺告訴我要去bus add driver。bus...