2014-03-28 7 views
5

Ich versuche zu verstehen this Treibercode von mcspi für omap2 Panda Board.Wer ruft "Probe" -Funktion im Treibercode?

Ich verstehe nicht, wer die probe Funktion aufruft und was ist die Rufkette in this Treibercode?

Wie wird der Fahrer informiert, wenn das Gerät angeschlossen ist?

+0

Bitte, Zeilennummern hinzufügen in "spi-omap2-mcspi.c" – osgx

+0

Zeilennummer hinzugefügt –

+0

möglich Duplikat von [Wer ruft die Sonde() des Treibers] (http://stackoverflow.com/questions/7578582/who-calls-the-probe-of-driver) – osgx

Antwort

10

Die Sondenfunktion von spi-omap2-mcspi.c ist in der static struct platform_driver omap2_mcspi_driver gespeichert, die mit module_platform_driver(omap2_mcspi_driver); (am Ende der Datei) registriert ist. Die module_platform_driver Makro, definiert in platform_device.h die Struktur zu platform_driver_register Makro und __platform_driver_register Funktion von 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); 

Die Sonde passieren nun driver_register Funktion übergeben von 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 } 

So, nun der Fahrer registriert in der Bus (platform_bus_type).

Actual Aufruf Sonde über driver_probe_devicedrivers/base/dd.c gemacht wird, dann really_probe (gleiche Datei Zeile 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

Danke für Ihre Antwort. Können Sie bitte die Anrufkette erklären? Und wie wird der Fahrer informiert, wenn das Gerät angeschlossen ist? –

+2

Wirklich kann ich nicht. Ich kann nur Code oder einige Seiten im Internet suchen, kann so sein: http://www.cprogramdevelop.com/1120807/ "Registrierungsphase: Platform_driver_register()> driver_register()> bus_add_driver()> driver_attach()> bus_for_each_dev (), in jedem hängt an .. Platform BUS die Ausrüstung für __driver_attach(),> driver_probe_device(), um die drv-> bus-> match() erfolgreich ausgeführt, durch einen Zeiger zu plattform_match> strncmp (pdev> name, die drv> name, BUS_ID_SIZE) call real_probe (eigentlich entsprechendes Gerät platform_driver> Probe (platform_device) " – osgx

+0

Das ist ein nützlicher Link. Danke! –