我正在尝试了解I2C客户端驱动程序。根据我在注册I2C驱动程序之前的理解,我们必须定义i2c_device_id
表和设备树兼容表。
我有疑虑。请帮助我理解。
1)i2c_device_id
结构的定义包含两个成员(name
,driver_data
)。第一个成员(name
)用于定义将在驱动程序绑定期间使用的设备名称,第二个成员(driver_data
)的用途是什么。
2)驱动程序绑定将基于i2c_device_id
表或设备树兼容字符串发生。
提前致谢。
答案 0 :(得分:10)
1)
i2c_device_id
结构的定义包含两个成员(name
,driver_data
)。第一个成员(name
)用于定义将在驱动程序绑定期间使用的设备名称,第二个成员(driver_data
)的用途是什么。
首先定义i2c_device_id
结构的表(数组),就像在max732x.c驱动程序中完成的那样:
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表匹配设备。