linux i2c_device_id 结构体成员
时间: 2024-10-17 21:09:12 浏览: 35
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函数来注册这个设备。
i2c_driver结构体
i2c_driver结构体是Linux内核中用于描述I2C总线设备驱动程序的数据结构。它定义在<linux/i2c.h>头文件中,包含以下成员:
- struct module *owner:指向驱动程序所属的模块的指针。
- const char *driver_name:驱动程序的名称。
- const struct i2c_device_id *id_table:指向一个数组,每个元素表示一个支持的I2C设备,包含设备的名称和ID。
- int (*probe)(struct i2c_client *client, const struct i2c_device_id *id):当I2C设备被探测到时,该函数被调用。该函数返回0表示成功,返回其他值表示错误。
- int (*remove)(struct i2c_client *client):当I2C设备被移除时,该函数被调用。该函数返回0表示成功,返回其他值表示错误。
- void (*shutdown)(struct i2c_client *client):当系统关闭时,该函数被调用,用于释放资源。
- int (*suspend)(struct i2c_client *client, pm_message_t mesg):当系统进入挂起状态时,该函数被调用,用于保存设备状态。
- int (*resume)(struct i2c_client *client):当系统恢复正常工作时,该函数被调用,用于恢复设备状态。
- const struct of_device_id *of_match_table:指向一个数组,每个元素表示一个支持的设备节点,包含设备的名称和ID。
通过填充i2c_driver结构体中的成员,可以实现对I2C设备的控制和管理。
阅读全文