使用I2C设备id表的driver_data成员

时间:2014-07-07 08:46:04

标签: linux-device-driver i2c

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

我有疑虑。请帮助我理解。

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

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

提前致谢。

1 个答案:

答案 0 :(得分:10)

  

1)i2c_device_id结构的定义包含两个成员(namedriver_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);

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

static int max732x_probe(struct i2c_client *client,
                         const struct i2c_device_id *id)

现在,您可以出于自己的目的使用 id->driver_data (这是表中每个设备唯一的)。例如。 “max7320”芯片driver_data将为1

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

static uint64_t max732x_features[] = {
    [0] = FEATURE0,
    [1] = FEATURE1 | FEATURE2,
    [2] = FEATURE2
};

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

max732x_features[id->driver_data]

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

  

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

要弄清楚这一点,您可以查看 i2c_device_match() 功能(例如here)。如您所见,第一个I2C内核尝试通过compatible字符串(OF样式,即设备树)匹配设备。如果失败,则尝试按id表匹配设备。