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函数。
疑问
- 正确使用
of_match_table匹配设备树节点的方法是什么? - 当前的驱动配置存在哪些问题?
内容的提问来源于stack exchange,提问作者ALAN LI
相关产品推荐
相关产品推荐

