如果我们已经在使用struct of_device_id,那么struct i2c_device_id的用途是什么?

时间:2017-02-03 06:25:07

标签: linux linux-kernel linux-device-driver embedded-linux

我试图理解 Linux内核4.4 上的编解码器驱动程序代码。编解码器使用i2c总线连接到声卡,编解码器驱动程序代码写为I2C客户端。客户的 struct i2c_driver 包含 i2c_device_id 信息和 of_device_id 信息。

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

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

2 个答案:

答案 0 :(得分:1)

i2c_device_id结构引用了您的i2c_driver结构; I²C框架使用它来查找要连接到特定I²C器件的驱动程序。这类似于of_device_id信息如何用于查找设备树中描述的特定设备的驱动程序。

作为驱动程序编写者,您实际上并不知道编解码器将在以后实际枚举的方式(I²C或OF),因此您应该提供两条信息。

使用MODULE_DEVICE_TABLE()时,i2c_device_id结构中的值用于查找要加载的模块。 (这不太可能发生在既没有热插拔也没有模块的嵌入式系统中,但如果编解码器曾用于模块化系统(例如,用于测试),则自动加载可能不起作用。)
此外,MODULE_DEVICE_TABLE()提供的信息可用于确定某些特定硬件需要哪些内核配置选项。

答案 1 :(得分:0)

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

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);

通过用户区实例化I2C设备时:

echo adt75 0x50 > /sys/bus/i2c/devices/i2c-3/new_device

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

通过OF设备树实例化I2C设备时,将匹配其兼容属性(格式:“ manufacturer,model”),并将“ model”组件与struct i2c_device_id数组进行匹配-该数组还将该元素传递给lm75_probe。很整齐!

struct of_device_id的结构也具有.data属性,您可以通过其他机制进行访问。