platform驅動之probe函數

驅動註冊的probe函數

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

從driver_register看起:
int driver_register(struct device_driver * drv)
{
klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put);
init_completion(&drv->unloaded);
return bus_add_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)
{
bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
}
這個熟悉,遍歷總線上的設備並設用__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) {
ret = drv->probe(dev);
if (ret) {
dev->driver = NULL;
goto ProbeFailed;
}
只要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起來。反之,添加設備道理也是一樣的。

 

====

http://www.google.com.hk/search?q=platform+prob+%E8%B0%83%E7%94%A8

發佈了6 篇原創文章 · 獲贊 13 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章