regmap中 .write_reg = i2c_smbus_write_i2c_block_data 实例
时间: 2023-06-28 21:15:59 浏览: 187
SMBus.zip_C8051F300 I2C_c8051f300_smbus slave
下面是一个使用 `i2c_smbus_write_i2c_block_data` 函数进行寄存器写入的 regmap 实例代码:
```c
#include <linux/i2c.h>
#include <linux/regmap.h>
struct regmap *map;
struct i2c_client *client;
// 初始化 i2c_client
client = i2c_new_client_device(adapter, &addr);
if (!client)
return -ENODEV;
// 创建 regmap
struct regmap_bus bus = {
.write_reg = i2c_smbus_write_i2c_block_data,
// 其他成员
};
map = devm_regmap_init_i2c(client, ®s_config, &bus);
if (IS_ERR(map)) {
ret = PTR_ERR(map);
dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret);
return ret;
}
// 向寄存器写入数据
u8 data_buf[2] = {0x12, 0x34};
ret = regmap_raw_write(map, reg_addr, data_buf, sizeof(data_buf) / sizeof(u8));
if (ret) {
dev_err(&client->dev, "Failed to write reg: %d\n", ret);
return ret;
}
```
在上述代码中,使用 `i2c_new_client_device()` 函数初始化了一个 `i2c_client` 结构体,并将其地址保存在 `client` 变量中。然后,创建了一个 `regmap_bus` 结构体,将其 `.write_reg` 成员指定为 `i2c_smbus_write_i2c_block_data` 函数,表示写寄存器时使用该函数进行写入操作。最后,使用 `devm_regmap_init_i2c()` 函数创建了一个 `regmap` 实例,并将 `regmap_bus` 结构体指针传递给该函数,表示指定的 `.write_reg` 函数将被用于寄存器的写操作。
在向寄存器写入数据时,通过调用 `regmap_raw_write()` 函数实现。该函数会将数据缓冲区中的数据写入到指定的寄存器地址中。在本例中,将 `data_buf` 缓冲区中的数据写入到指定的寄存器中,并将返回值保存在 `ret` 变量中。如果返回值为 0,则表示写入成功;否则,表示写入失败,需要根据返回值进行错误处理。
阅读全文