i2c_new_device函数
时间: 2024-02-11 12:40:32 浏览: 204
i2c_new_device函数是Linux内核中I2C子系统提供的一个函数,用于向I2C总线添加一个新的I2C设备。该函数的定义如下:
```c
struct i2c_client *i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info);
```
其中,adap参数是指向I2C适配器的指针,info参数是指向I2C设备信息的指针。该函数返回一个i2c_client结构体指针,表示添加成功的I2C设备。
在调用该函数之前,需要先填写好i2c_board_info结构体,该结构体中包含了I2C设备的地址、名称、驱动程序等信息。在添加成功后,可以使用返回的i2c_client结构体指针来操作该I2C设备,例如发送和接收数据。
需要注意的是,添加的I2C设备在使用完后需要通过i2c_unregister_device函数进行注销,以释放系统资源。
相关问题
regmap 会自动选择 i2c_smbus_write_i2c_block_data 函数进行 I2C 写操作,并将数据写入指定的寄存器中 实例
是的,您理解得非常正确。当您使用 `regmap_write` 函数写入数据时,`regmap` 会自动选择适当的底层函数进行操作,其中包括 `i2c_smbus_write_i2c_block_data` 函数进行 I2C 写操作。下面是一个示例,展示了如何使用 `regmap` 实现 I2C 写操作。
```c
#include <linux/i2c.h>
#include <linux/regmap.h>
struct i2c_client *client;
struct regmap *regmap;
// 初始化 I2C 设备
client = i2c_new_device(adapter, &board_info);
// 创建 regmap 实例
regmap = devm_regmap_init_i2c(client, ®map_config);
// 向指定寄存器写入数据
regmap_write(regmap, reg_offset, data);
```
在这个示例中,`i2c_new_device` 函数用于创建一个新的 I2C 设备,`devm_regmap_init_i2c` 函数用于创建一个新的 `regmap` 实例,`regmap_write` 函数用于向指定的寄存器写入数据。在 `devm_regmap_init_i2c` 函数中,`regmap_config` 参数用于指定 regmap 的配置信息,包括 `.reg_write` 函数和其他参数。
当您调用 `regmap_write` 函数时,`regmap` 会根据寄存器描述信息自动选择合适的底层函数进行操作,其中包括 `i2c_smbus_write_i2c_block_data` 函数进行 I2C 写操作。因此,您无需手动调用 `i2c_smbus_write_i2c_block_data` 函数,`regmap` 会自动完成这个操作。
i2c_device_id
在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)。驱动程序会依据这些信息来识别和初始化设备。
阅读全文
相关推荐
















