regmap中 .write_reg = i2c_smbus_write_i2c_block_data
时间: 2023-06-28 11:15:58 浏览: 190
在 regmap 中,可以通过设置 `.write_reg` 函数指针来指定向寄存器写入数据的方法。`i2c_smbus_write_i2c_block_data` 是 Linux 内核中的一个函数,用于向 I2C 设备的寄存器中写入数据。其函数原型如下:
```
s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command,
u8 length, const u8 *values);
```
其中,`client` 是一个 `i2c_client` 结构体指针,表示要进行写入操作的 I2C 设备;`command` 是一个无符号 8 位整数,表示要写入的寄存器地址;`length` 是一个无符号 8 位整数,表示要写入的数据长度;`values` 是一个指向要写入的数据缓冲区的指针。
在使用该函数写入数据时,需要先将要写入的数据放入一个缓冲区中,然后将该缓冲区的地址传递给 `values` 参数,再指定要写入的寄存器地址和数据长度。该函数会自动将数据写入到指定的寄存器中。
在 regmap 中,可以将 `.write_reg` 函数指定为 `i2c_smbus_write_i2c_block_data`,从而使用该函数向 I2C 设备的寄存器中写入数据。设置方法如下:
```c
static const struct regmap_bus i2c_bus = {
.write_reg = i2c_smbus_write_i2c_block_data,
// 其他成员
};
struct regmap *map;
struct i2c_client *client;
// 初始化 i2c_client
client = i2c_new_client_device(adapter, &addr);
if (!client)
return -ENODEV;
// 创建 regmap
map = devm_regmap_init_i2c(client, ®s_config, &i2c_bus);
if (IS_ERR(map)) {
ret = PTR_ERR(map);
dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret);
return ret;
}
```
在创建 regmap 实例时,通过将 `i2c_bus` 的地址传递给 `devm_regmap_init_i2c()` 函数,可以将 `.write_reg` 函数指定为 `i2c_smbus_write_i2c_block_data`。这样,在使用 regmap 进行寄存器写入操作时,会自动调用 `i2c_smbus_write_i2c_block_data` 函数进行写入操作。
阅读全文