使用开发板上的ap3216c做实验,首先修改了设备树,添加了在i2c1下添加了i2c设备AP3216C,名字为compatible = “DUNNAN,AP3216C”;然后在终端下搜/sys/bus/i2c/devices/,发现设备是存在的,说明内核解析成功了设备树 ,并且也正确获取了compatible,但是i2c设备注册的时候,通过函数i2c_add_driver,无法匹配到compatible。 但是添加id_table后,可以识别到了,(是通过设备树识别到,因为我进入/sys/bus/i2c/drivers目录下,发现了设备树里的其他属性),不知道为什么我加了id_table后可以识别到,不加就识别不到,和id_table里的内容无关,只需要添加这个项就好 。按我的理解,通过match函数,优先检测设备树属性,之后再去检测id_table属性,和有没有id_table无关,但事实测出来是有关系的,
有大佬解惑一下吗?.c和设备树见附录
i2c.zip (15.5 KB)
在 Linux-4.9.88 版本的内核中;
在 drivers/i2c/i2c-core.c 中;
如果设备树匹配成功,最后会进入 i2c_device_probe 来执行驱动的 probe 函数;
如下图:如果 id_table 为空,就直接返回不执行了;
目的是防止 i2c_match_id 执行后有段错误,访问非法指针;
status = driver->probe(client, i2c_match_id(driver->id_table, client));
至于 i2c probe 这么写的目的应该是为了兼容不使用设备树的驱动;
1 个赞
理解了,这个还挺麻烦的,靠自己找不知道得找到什么时候
与设备树是匹配到了,只是在调用probe的路上被return掉了