使用I2C设备id表的driver_data成员

use*_*586 4 i2c linux-device-driver

我想了解I2C客户端驱动程序.根据我在注册I2C驱动程序之前的理解,我们必须定义i2c_device_id表和设备树兼容表.

我有疑虑.请帮我理解.

1)i2c_device_id结构的定义包含两个成员(name,driver_data).第一个成员(name)用于定义将在驱动程序绑定期间使用的设备名称,第二个成员(driver_data)的用途是什么.

2)驱动程序绑定将基于i2c_device_id表或设备树兼容的字符串发生.

提前致谢.

Sam*_*nko 10

1)i2c_device_id结构的定义包含两个成员(name,driver_data).第一个成员(name)用于定义将在驱动程序绑定期间使用的设备名称,第二个成员(driver_data)的用途是什么.

首先定义结构的表(数组)i2c_device_id,就像在驱动程序中一样:

static const struct i2c_device_id max732x_id[] = {
    { "max7319", 0 },
    { "max7320", 1 },
    { "max7321", 2 },
    { },
};
MODULE_DEVICE_TABLE(i2c, max732x_id);
Run Code Online (Sandbox Code Playgroud)

在驱动程序探测功能中,您将此阵列的一个元素(对于您的特定设备)作为第二个参数:

static int max732x_probe(struct i2c_client *client,
                         const struct i2c_device_id *id)
Run Code Online (Sandbox Code Playgroud)

现在您可以根据自己的需要使用id->driver_data(表中的每个设备都是唯一的).例如,对于"max7320"芯片driver_data将会1.

例如,如果您具有特定于每个设备的功能,则可以创建如下所示的功能数组:

static uint64_t max732x_features[] = {
    [0] = FEATURE0,
    [1] = FEATURE1 | FEATURE2,
    [2] = FEATURE2
};
Run Code Online (Sandbox Code Playgroud)

并且您可以从此阵列获取特定设备的功能,如下所示:

max732x_features[id->driver_data]
Run Code Online (Sandbox Code Playgroud)

当然,出于同样的原因,您可以使用驱动程序名称.但它需要更多的代码和更多的CPU时间.所以基本上如果你不需要driver_data你的驱动程序 - 你只需要0为所有设备(在设备表中).

2)驱动程序绑定将基于i2c_device_id表或设备树兼容的字符串发生.

要弄清楚这一点,你可以看一下i2c_device_match()函数(例如这里).如您所见,第一个I2C内核尝试逐个compatible字符串匹配(OF样式,即Device Tree).如果失败,则尝试通过id表匹配设备.

  • 补充一点 #2,当 I2C 内核通过兼容字符串匹配时,它还将 `compatible = "manufacturer,model"` 的模型部分与结构 i2c_device_id 数组匹配,并将其传递给 i2c 设备探测器。整洁的! (2认同)