ap3216c.c i2c probe函数始终无法执行,最后发现是传统匹配方式ID列表需要修改

编译官方例程源码中的I2C驱动例程,发现i2c的probe函数始终无法执行,没有在dev下面生成设备节点。

多方求助,原来是i2c需要传统匹配方式,设备树匹配方式要同时匹配,ap3216c中的probe函数才能执行。

例程如下:

【正点原子】阿尔法Linux开发板(A盘)-基础资料\01、例程源码\02、Linux驱动例程\21_iic\ap3216c.c中

/* 传统匹配方式ID列表 */

static const struct i2c_device_id ap3216c_id[] = {

复制代码
**{"alientek,ap3216c", 0},**  

{}

};

/* 设备树匹配列表 */

static const struct of_device_id ap3216c_of_match[] = {

复制代码
{ .compatible = "Liteon,ap3216c" },

{ /* Sentinel */ }

};

修改为:

/* 传统匹配方式ID列表 */

static const struct i2c_device_id ap3216c_id[] = {

复制代码
**{"ap3216c", 0},**  

{}

};

/* 设备树匹配列表 */

static const struct of_device_id ap3216c_of_match[] = {

复制代码
{ .compatible = "Liteon,ap3216c" },

{ /* Sentinel */ }

};

修改后从新编译,/dev的设备节点终于生成了:

root@ATK-IMX6U:/mnt# ls /dev

ap3216c

root@ATK-IMX6U:/mnt# ./ap3216cApp /dev/ap3216c

ir = 0, als = 0, ps = 0

ir = 0, als = 265, ps = 3

ir = 0, als = 265, ps = 3

我使用的设备树定义如下

F:\【正点原子】阿尔法Linux开发板(A盘)-基础资料\01、例程源码\03、正点原子Uboot和Linux出厂源码\linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7\arch\arm\boot\dts\imx6ull-alientek-emmc.dts

&i2c1 {

复制代码
clock-frequency = <100000>;

pinctrl-names = "default";

pinctrl-0 = <&pinctrl_i2c1>;

status = "okay";



mag3110@0e {

	compatible = "fsl,mag3110";

	reg = <0x0e>;

	position = <2>;

};



ap3216c@1e {

	compatible = "ap3216c";

	reg = <0x1e>;

};

};

内核中的匹配代码分析:

内核代码中 i2c_device_probe 函数中存在

static int i2c_device_probe(struct device *dev)

{

复制代码
struct i2c_client    *client = i2c_verify_client(dev);

struct i2c_driver    *driver;

int status;



if (!client)

    return 0;



... ...



driver = to_i2c_driver(dev->driver);

if (!driver->probe || !driver->id_table)

    return -ENODEV;



... ...



status = driver->probe(client, i2c_match_id(driver->id_table, client));



... ...

}

if (!driver->probe || !driver->id_table)

return -ENODEV

其中|| 逻辑或 判断规则:一真则真,两假才假,即

如果driver->id_table为空或者driver->probe为空则无法实现probe函数

所以,在新内核的dts设备树表述设备时,注册i2c_driver时,一定要将i2c_driver中的id_table实现!!!

其实也是根据设备树匹配成功的,只不过传统匹配表(i2c_device_id)也必须实现。如果只使用传统匹配表匹配应该是不需要设备树匹配表的。

相关推荐
逻辑驱动的ken7 分钟前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
枳实-叶1 小时前
【Linux驱动开发】第四天:dmesg日志全解+驱动加载失败极速排查
linux·运维·驱动开发
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
wdfk_prog2 小时前
正常关闭虚拟机时,不要点“关机”,而要点“关闭客户机”
linux·c语言·网络·ide·vscode
fish_xk3 小时前
Linux开方工具
linux·运维·服务器
無限進步D3 小时前
Java 面向对象高级 接口
java·开发语言
流年如夢3 小时前
单链表 -->增、删、查、改等详细操作
c语言·数据结构
两年半的个人练习生^_^4 小时前
Java日志框架和使用、日志记录规范
java·开发语言·开发规范
杨凯凡5 小时前
【032】排查入门:jstack、heap dump、Arthas 初识
java·开发语言·后端
其实防守也摸鱼5 小时前
无线网络安全--实验 规避WLAN验证之发现隐藏的SSID
java·开发语言·网络·安全·web安全·智能路由器·无线网络安全