i2c_device_id
时间: 2024-11-16 22:20:32 浏览: 21
在Linux I2C设备驱动中,`i2c_device_id`扮演着关键角色[^2]。它是用于标识每个I2C设备及其关联驱动程序的一种结构,存储在设备树(Device Tree)中。当一个新的I2C设备被检测到时,`i2c_new_device`函数会创建一个`i2c_device_id`实例来描述该设备。这个ID包含了设备的制造商ID、产品ID以及可能的一些其他特定信息,这些信息用于在初始化过程中找到正确的驱动程序来处理通信。
具体来说,当硬件控制器报告新发现的I2C设备时,它会查找对应的`i2c_device_id`定义。如果找到了匹配的设备ID,驱动程序就会被加载并配置以与该设备交互。如果没有找到匹配,系统可能会采取默认行为或者抛出错误。
举个例子,假设有一个I2C设备的设备树节点定义如下:
```device-tree
/i2c@1 {
compatible = "driver-name", "vendor-id:product-id";
reg = <0x71 0x01>;
i2c-device-id = <0x1234 0x5678 0x01>;
};
```
这里的`i2c-device-id`部分( `<0x1234 0x5678 0x01>`)表明这个设备的制造商ID(0x1234)、产品ID(0x5678),以及可能的子地址(0x01)。驱动程序会依据这些信息来识别和初始化设备。
相关问题
linux i2c_device_id 结构体成员
Linux内核中的i2c_device_id结构体主要用于表示I2C总线设备的身份信息,它是由两部分组成:bus_number和device_address。这个结构体通常用于设备树(Device Tree)中,以匹配硬件设备到驱动程序。
`i2c_device_id`的成员包括:
1. `int bus_num` 或 `__u8 bus`:表示I2C总线的编号,是一个无符号八位整数,范围从0开始,如0x00~0xFF对应于标准的I2C buses 0~7。
2. `__be16 device` 或 `__u16 address`:这是一个大端序的无符号短整数,代表了设备地址,通常在I2C通信中用作从地址。它是7位地址加上一位R/W标志(0通常表示读取,1表示写入)。
例如,在设备树文件中,可能会看到这样的声明:
```c
&i2c@<bus-number>: {
compatible = "driver-name", "compatible-string";
reg = <bus_num>, <device_address>;<other properties>;
};
```
其中`<bus-number>`和`<device_address>`会被实际的i2c_device_id填充。
解释如何调用static const struct i2c_device_id lm3642_id[] = { {LM3642_NAME, 0}, {} };
这是一个定义在Linux内核中的i2c驱动程序中使用的一个静态常量数组。其中包含了i2c设备的ID信息,这些信息用于在内核启动时自动探测i2c设备并匹配对应的驱动程序。具体地说,这个数组定义了一个i2c设备ID结构体,包括设备名称和设备地址。在这个数组的最后,还有一个空的结构体,用于表示数组结束。
在编写i2c驱动程序时,可以使用这个数组来注册i2c设备。例如,在驱动程序的probe函数中,可以使用i2c_register_device函数来注册设备,如下所示:
```
static int lm3642_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
// 使用i2c_register_device函数注册设备
struct lm3642_data *data;
struct device *dev = &client->dev;
struct lm3642_platform_data *pdata = dev->platform_data;
int ret;
// ...
return 0;
}
// 声明i2c设备ID数组
static const struct i2c_device_id lm3642_id[] = {
{LM3642_NAME, 0},
{}
};
// 声明i2c驱动程序结构体
static struct i2c_driver lm3642_driver = {
.driver = {
.name = LM3642_NAME,
.of_match_table = of_match_ptr(lm3642_of_match),
},
.probe = lm3642_probe,
.remove = lm3642_remove,
.id_table = lm3642_id,
};
// 注册i2c驱动程序
module_i2c_driver(lm3642_driver);
```
在这个驱动程序中,我们使用了lm3642_id数组来声明设备ID,同时在i2c_driver结构体中使用id_table成员来指定这个数组。当内核启动时,会自动调用i2c驱动程序的probe函数,并将对应的i2c_client结构体和id参数传递给它。在probe函数中,我们可以通过id参数来匹配对应的设备,并使用i2c_register_device函数来注册这个设备。
阅读全文