You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux平台驱动probe函数未触发问题:驱动已注册但未执行探测

Linux Platform驱动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属性与驱动匹配。需明确:

  1. Platform驱动probe函数的触发依赖是什么?
  2. 为何匹配设备树节点后仍未自动执行probe?

解答

Probe函数的触发依赖

Platform驱动的probe触发必须同时满足以下条件:

  • 匹配条件达成:驱动与设备节点通过compatible字符串(设备树场景)、name字段或ID表完成匹配;
  • 设备节点启用:设备树节点的status属性为"okay"或内核认可的启用状态;
  • 依赖资源就绪:设备树中引用的phandle节点(如引脚配置节点)必须存在且处于启用状态;
  • 设备对象已创建:设备树节点已被内核解析为有效的platform_device实例。

本次问题的核心原因及排查方向

  1. 驱动注册日志逻辑写反
    代码中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");
    }
    
  2. 设备树phandle引用无效
    设备树节点中pinctrl-0 = <&PHANDLE1>;和pinctrl-1 = <&PHANDLE2>;引用了未定义的节点。内核解析设备树时,若引用的phandle节点不存在或未启用,会导致当前设备节点无法被解析为有效的platform_device,进而无法触发probe。
    排查:确认设备树中存在PHANDLE1、PHANDLE2对应的引脚配置节点,且这些节点的status属性为"okay"。

  3. 内核配置缺失
    若内核未开启CONFIG_OF(设备树支持)、CONFIG_PLATFORM_DEVICES等必要选项,设备树节点无法被解析为platform_device,驱动匹配机制失效。
    排查:检查内核.config文件,确保CONFIG_OF=y、CONFIG_PLATFORM_DRIVERS=y等选项已启用。

  4. 设备地址冲突
    设备节点命名为simple@0,@后的0是设备地址,若系统中已有其他设备占用该地址,可能导致节点无法被正确识别,可作为次要排查点。

内容的提问来源于stack exchange,提问作者Bret Joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:43:13