谁在驱动程序代码中调用“探针”功能?
Posted
技术标签:
【中文标题】谁在驱动程序代码中调用“探针”功能?【英文标题】:Who calls "probe" function in driver code? 【发布时间】:2014-05-08 11:41:00 【问题描述】:我正在尝试了解 omap2 熊猫板的 mcspi 驱动程序代码 this。
不明白是谁调用了probe
函数,this驱动代码中的调用链是什么?
设备连接后如何通知驱动程序?
【问题讨论】:
请在“spi-omap2-mcspi.c”中添加行号 Who calls the probe() of driver 的可能副本 213 /* module_platform_driver() - 不执行 214 * 在模块初始化/退出中的任何特殊操作的驱动程序的帮助宏。这消除了很多 215 * 样板。每个模块只能使用一次这个宏,并且 216 * 调用它会替换 module_init() 和 module_exit() 【参考方案1】:来自spi-omap2-mcspi.c
的探测函数保存在static struct platform_driver omap2_mcspi_driver
中,该module_platform_driver(omap2_mcspi_driver);
已注册(在文件末尾)。在platform_device.h 中定义的module_platform_driver
宏会将结构传递给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);
探测现在从drivers/base/driver.c 传递给driver_register
函数
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_device
drivers/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;
【讨论】:
感谢您的回答。你能解释一下调用链吗?以及设备连接时如何通知驱动程序? 真的不行。我只能在internet上搜索code或者一些网站,可能是这样的:cprogramdevelop.com/1120807》注册阶段:Platform_driver_register() > driver_register() > bus_add_driver() > driver_attach() > bus_for_each_dev(),在每个挂在..平台上BUS设备为__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)" 这是一个有用的链接。谢谢! (它很有用,但有点过时).. 也请查看此链接 ->> kernel.org/doc/Documentation/driver-model/platform.txt "设备命名和驱动程序绑定...驱动程序绑定由驱动程序核心自动执行,调用驱动程序probe() 在找到设备和驱动程序之间的匹配后。如果probe() 成功,则驱动程序和设备照常绑定。找到这样的匹配项有三种不同的方法: ...//read this//",还要检查 early_platform_driver_probe() kernel.org/doc/Documentation/driver-model/platform.txt 是链接。我跳过了有趣的部分,所以只需转到 kernel.org/doc/Documentation/driver-model/platform.txt 并阅读“设备命名和驱动程序绑定”部分以上是关于谁在驱动程序代码中调用“探针”功能?的主要内容,如果未能解决你的问题,请参考以下文章