谁在驱动程序代码中调用“探针”功能?

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_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;

【讨论】:

感谢您的回答。你能解释一下调用链吗?以及设备连接时如何通知驱动程序? 真的不行。我只能在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 并阅读“设备命名和驱动程序绑定”部分

以上是关于谁在驱动程序代码中调用“探针”功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何实施“谁在说话?” webrtc ios应用程序中的功能?

谁在 Linux 系统中调用了我的 DBus API

谁在调用删除?

谁在调用错误视图,为啥?

K8S(十三)探针

K8S(十三)探针