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

Linux 4.9下of_match_table匹配设备树需id_table的原因及用法咨询

Linux 4.9下I2C驱动of_match_table匹配设备树节点异常问题

环境与设备树节点

运行环境为Linux 4.9,设备树中laser-radio节点定义如下:

{
    i2c@7000c000 {
        laser-radio@29 {
            compatible = "lyz,vl53l0x";
            reg = <0x29>;
        };
    };
};

驱动代码情况

仅配置of_match_table时无法工作

仅设置of_match_table匹配设备树时,驱动无法正常运行,代码如下:

static const struct of_device_id vl53l0x_dt_match[] = {
    { .compatible = "lyz,vl53l0x" },
    { }
};
MODULE_DEVICE_TABLE(of, vl53l0x_dt_match);

struct i2c_driver vl53l0x_driver = {
    .driver =
        {
            .name = "vl53l0x",
            .owner = THIS_MODULE,
            .of_match_table = vl53l0x_dt_match,
        },
    .probe = vl53l0x_probe,
    .remove = vl53l0x_remove,
};

添加id_table后正常运行

添加id_table后,驱动可正常工作,代码如下:

static const struct i2c_device_id vl53l0x_id[] = {
    { "vl53l0x", 0 },
    {}
};
MODULE_DEVICE_TABLE(i2c, vl53l0x_id);

static const struct of_device_id vl53l0x_dt_match[] = {
    { .compatible = "lyz,vl53l0x" },
    { }
};
MODULE_DEVICE_TABLE(of, vl53l0x_dt_match);

struct i2c_driver vl53l0x_driver = {
    .driver =
        {
            .name = "vl53l0x",
            .owner = THIS_MODULE,
            .of_match_table = vl53l0x_dt_match,
        },
    .probe = vl53l0x_probe,
    .remove = vl53l0x_remove,
    .id_table = vl53l0x_id,
};

调试现象

通过在i2c_device_match函数中添加printk调试发现:

  • 无id_table时,设备树节点匹配成功(打印"lyz : get right match"),但驱动无法进入probe函数;
  • 仅使用id_table时,匹配成功后可正常进入probe函数。

疑问

  1. 正确使用of_match_table匹配设备树节点的方法是什么?
  2. 当前的驱动配置存在哪些问题?

内容的提问来源于stack exchange,提问作者ALAN LI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:52:37