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,就像在max732x.c驱动程序中一样:
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表匹配设备.
| 归档时间: |
|
| 查看次数: |
4613 次 |
| 最近记录: |