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)也必须实现。如果只使用传统匹配表匹配应该是不需要设备树匹配表的。

相关推荐
white-persist16 小时前
【攻防世界】reverse | Mysterious 详细题解 WP
c语言·开发语言·网络·汇编·c++·python·安全
赖small强16 小时前
【Linux C/C++ 开发】 GCC 编译过程深度解析指南
linux·c语言·c++·预处理·链接·编译·编译过程
做人不要太理性16 小时前
【Linux系统】ext2文件系统
大数据·linux·操作系统·文件系统
保持低旋律节奏16 小时前
linux——软件包、yum 安装和卸载
linux·运维·服务器
從南走到北16 小时前
JAVA代驾小程序源码代驾跑腿APP源码
java·开发语言·微信·微信小程序·小程序
lightqjx16 小时前
【C++】对set和map的使用
开发语言·数据结构·c++·stl
莫道桑榆晚丶16 小时前
Linux系统编程--------MP3项目实战
linux·学习
快乐zbc16 小时前
C++ 中 typedef 指针别名与 const 的坑
开发语言·c++
urkay-16 小时前
Android getDrawingCache 过时废弃
android·java·开发语言·kotlin·iphone·androidx
小oo呆16 小时前
【学习心得】Python好库推荐——pipx
linux·开发语言·python