Linux平台驱动probe函数未触发问题:驱动已注册但未执行探测
驱动代码
// SPDX-License-Identifier: GPL-2.0 #include <linux/module.h> #include <linux/init.h> #include <linux/pm.h> #include <linux/of_device.h> #include <linux/fb.h> static int simple_probe(struct platform_device *pdev) { printk(KERN_ERR "SIMPLE: %s\n", "Probing"); return 0; } const struct of_device_id simple_of_match[] = { { .compatible = "example,simple", }, { /*End of List*/ }, }; struct platform_driver simple_driver = { .probe = simple_probe, .driver = { .name = "simple", .owner = THIS_MODULE, .of_match_table = simple_of_match } }; static int __init init(void) { if (platform_driver_register(&simple_driver)) { printk(KERN_ERR "SIMPLE: %s\n", "Registerered"); } else { printk(KERN_ERR "SIMPLE: %s\n", "Failed"); } return 0; } static void __exit deinit(void) { platform_driver_unregister(&simple_driver); } module_init(init); module_exit(deinit); MODULE_DESCRIPTION("Simple Platform driver"); MODULE_AUTHOR("Bret Joseph Antonio <bret@binclab.com>"); MODULE_LICENSE("GPL");
设备树配置
/dts-v1/; / { simple@0 { compatible = "example,simple"; pinctrl-names = "lcm_rst_out1_gpio", "lcm_rst_out0_gpio"; pinctrl-0 = <&PHANDLE1>; pinctrl-1 = <&PHANDLE2>; status = "okay"; }; };
问题详情
驱动日志显示[ 0.178889] SIMPLE: Registered,但probe回调函数未执行,无对应输出。设备树未使用overlay,设备节点status设为"okay",compatible属性与驱动匹配。需明确:
- Platform驱动probe函数的触发依赖是什么?
- 为何匹配设备树节点后仍未自动执行probe?
解答
Probe函数的触发依赖
Platform驱动的probe触发必须同时满足以下条件:
- 匹配条件达成:驱动与设备节点通过compatible字符串(设备树场景)、name字段或ID表完成匹配;
- 设备节点启用:设备树节点的status属性为"okay"或内核认可的启用状态;
- 依赖资源就绪:设备树中引用的phandle节点(如引脚配置节点)必须存在且处于启用状态;
- 设备对象已创建:设备树节点已被内核解析为有效的platform_device实例。
本次问题的核心原因及排查方向
驱动注册日志逻辑写反
代码中platform_driver_register的返回值判断逻辑错误:该函数返回0表示注册成功,非0表示失败。当前代码中,注册失败时打印"Registered",成功时打印"Failed",用户看到的"Registered"实际是注册失败日志,驱动并未成功注册,自然不会触发probe。
修正代码逻辑:if (platform_driver_register(&simple_driver)) { printk(KERN_ERR "SIMPLE: %s\n", "Failed to register"); } else { printk(KERN_ERR "SIMPLE: %s\n", "Registered successfully"); }设备树phandle引用无效
设备树节点中pinctrl-0 = <&PHANDLE1>;和pinctrl-1 = <&PHANDLE2>;引用了未定义的节点。内核解析设备树时,若引用的phandle节点不存在或未启用,会导致当前设备节点无法被解析为有效的platform_device,进而无法触发probe。
排查:确认设备树中存在PHANDLE1、PHANDLE2对应的引脚配置节点,且这些节点的status属性为"okay"。内核配置缺失
若内核未开启CONFIG_OF(设备树支持)、CONFIG_PLATFORM_DEVICES等必要选项,设备树节点无法被解析为platform_device,驱动匹配机制失效。
排查:检查内核.config文件,确保CONFIG_OF=y、CONFIG_PLATFORM_DRIVERS=y等选项已启用。设备地址冲突
设备节点命名为simple@0,@后的0是设备地址,若系统中已有其他设备占用该地址,可能导致节点无法被正确识别,可作为次要排查点。
内容的提问来源于stack exchange,提问作者Bret Joseph

