首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果我们已经在使用struct i2c_device_id,那么如何使用struct of_device_id?

如果我们已经在使用struct i2c_device_id,那么如何使用struct of_device_id?
EN

Stack Overflow用户
提问于 2017-02-03 06:25:07
回答 2查看 3.3K关注 0票数 4

我试图理解Linux4.4上的编解码器驱动程序代码。编解码器采用i2c总线与声卡连接,编解码器驱动程序代码作为I2C客户端编写。客户端的结构i2c_driver包含i2c_device_id信息和of_device_id信息。

现在,根据我的理解,当struct of_device_id的兼容字符串与设备节点信息的兼容字符串匹配时,将调用客户端的探测函数。那么struct i2c_device_id的用途是什么?

注意:代码驱动程序正在使用设备树。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-03 11:42:39

您的i2c_device_id结构是由i2c_driver结构引用的;I 2 C框架使用它来查找要附加到特定I2 C设备的驱动程序。这类似于如何使用of_device_id信息为设备树中描述的特定设备查找驱动程序。

作为驱动程序编写者,您并不真正知道编解码器将如何在以后(I,2,C或OF)中进行实际枚举,因此您应该提供这两部分信息。

使用MODULE_DEVICE_TABLE()时,i2c_device_id结构中的值用于查找要加载的模块。(这种情况不太可能发生在既没有热插拔也没有模块的嵌入式系统中,但是如果在模块化系统中使用了编解码器(例如用于测试),那么自动加载可能就不能工作了。

此外,MODULE_DEVICE_TABLE()提供的信息可以用于确定某些特定硬件需要哪些内核配置选项。

票数 3
EN

Stack Overflow用户

发布于 2019-03-22 10:16:12

假设您有以下i2c驱动程序结构:

代码语言:javascript
运行
复制
static const struct i2c_device_id lm75_ids[] = {
        { "adt75", adt75, },
        { }
};
MODULE_DEVICE_TABLE(i2c, lm75_ids);

static const struct of_device_id lm75_of_match[] = {
        { .compatible = "adi,adt75" },
        { },
};
MODULE_DEVICE_TABLE(of, lm75_of_match);

static struct i2c_driver lm75_driver = {
        .driver = {
                .name   = "lm75",
                .of_match_table = of_match_ptr(lm75_of_match),
        },
        .probe          = lm75_probe,
        .id_table       = lm75_ids,
};
module_i2c_driver(lm75_driver);

当通过userland实例化I2C设备时:

代码语言:javascript
运行
复制
echo adt75 0x50 > /sys/bus/i2c/devices/i2c-3/new_device

I2c核心将名称"adt75“与struct i2c_device_id数组中的名称匹配,并将该元素传递给lm75_probe。

当通过设备树实例化I2C设备时,将匹配它的兼容属性(格式:“制造商,模型”),并将“模型”组件与struct i2c_device_id数组匹配,后者也将该元素传递给lm75_probe。挺干净的!

struct of_device_id还有一个.data属性,您可以通过不同的机制访问它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42018032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档