2014-03-28 77 views
5

我想了解omap2熊貓板的mcspi的驅動代碼this誰在驅動程序代碼中調用「探測」功能?

我不明白是誰叫probe函數和this驅動代碼中的調用鏈是什麼?

設備連接時如何通知驅動程序?

+0

請在 「SPI-OMAP2-mcspi.c」 添加行號 – osgx

+0

行號添加 –

+0

可能(誰調用了驅動程序的probe()](http://stackoverflow.com/questions/7578582/who-calls-the-probe-of-driver) – osgx

回答

10

spi-omap2-mcspi.c的探測功能保存在static struct platform_driver omap2_mcspi_driver中,該文件已在module_platform_driver(omap2_mcspi_driver);(在文件末尾)註冊。該module_platform_driver宏,在platform_device.h定義將結構傳遞到platform_driver_register宏觀和__platform_driver_register功能從drivers/base/platform.c

527 /** 
528 * __platform_driver_register - register a driver for platform-level devices 
529 * @drv: platform driver structure 
530 * @owner: owning module/driver 
531 */ 
532 int __platform_driver_register(struct platform_driver *drv, 
533         struct module *owner) 
534 { 
... 
536   drv->driver.bus = &platform_bus_type; 
537   if (drv->probe) 
538     drv->driver.probe = platform_drv_probe; 
... 
544   return driver_register(&drv->driver); 
545 } 
546 EXPORT_SYMBOL_GPL(__platform_driver_register); 

現在傳遞給driver_register功能的探頭從drivers/base/driver.c

139 /** 
140 * driver_register - register driver with bus 
141 * @drv: driver to register 
142 * 
143 * We pass off most of the work to the bus_add_driver() call, 
144 * since most of the things we have to do deal with the bus 
145 * structures. 
146 */ 
147 int driver_register(struct device_driver *drv) 
148 { 
... 
154   if ((drv->bus->probe && drv->probe) || 
... 
167   ret = bus_add_driver(drv); 
... 
178 } 

所以,現在的司機被註冊公共汽車(platform_bus_type)。

到探頭實際呼叫通過driver_probe_devicedrivers/base/dd.c做了,那麼really_probe(同一文件行265):

265 static int really_probe(struct device *dev, struct device_driver *drv) 
266 { 
... 
270   pr_debug("bus: '%s': %s: probing driver %s with device %s\n", 
271     drv->bus->name, __func__, drv->name, dev_name(dev)); 
... 
287   if (dev->bus->probe) { 
288     ret = dev->bus->probe(dev);  /// <<<< HERE 
289     if (ret) 
290       goto probe_failed; 
291   } else if (drv->probe) { 
292     ret = drv->probe(dev);   /// <<<< OR HERE 
293     if (ret) 
294       goto probe_failed; 
295   } 
296 
297   driver_bound(dev); 
298   ret = 1; 
299   pr_debug("bus: '%s': %s: bound device %s to driver %s\n", 
300     drv->bus->name, __func__, dev_name(dev), drv->name); 
301   goto done; 
+0

感謝您的回答。 你能解釋一下呼叫鏈嗎? 當設備連接時如何通知驅動程序? –

+2

真的我不能。我只能搜索代碼或在互聯網上的一些網站,可能是這樣的:http://www.cprogramdevelop.com/1120807/「註冊階段:Platform_driver_register()> driver_register()> bus_add_driver()> driver_attach()> bus_for_each_dev ),在每一個掛起的平臺上。設備爲__driver_attach(),driver_probe_device()確定drv-> bus-> match()成功執行,通過指針執行platform_match> strncmp(pdev> name, drv> name,BUS_ID_SIZE)調用really_probe(實際相應的設備platform_driver> probe(platform_device)) – osgx

+0

這是一個非常有用的鏈接。謝謝! –

相關問題