.read_reg = i2c_smbus_read_i2c_block_data 通过 regmap_read() 读取 实例
时间: 2023-08-11 15:04:09 浏览: 63
可以使用 regmap_read() 函数结合 .read_reg = i2c_smbus_read_i2c_block_data 函数来读取 I2C 设备寄存器的数据。下面是一个示例:
```
#include <linux/regmap.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
int read_i2c_reg(struct regmap *map, u8 reg, u8 *data, u8 len)
{
int ret;
ret = regmap_read(map, reg, data);
if (ret < 0) {
dev_err(map->dev, "Failed to read from I2C device\n");
return ret;
}
return 0;
}
int probe(struct i2c_client *client)
{
struct regmap_config config = {
.reg_bits = 8,
.val_bits = 8,
.max_register = 0xff,
.write_flag_mask = 0x80,
.cache_type = REGCACHE_NONE,
};
struct regmap *map;
int ret;
u8 data[2];
map = devm_regmap_init_i2c(client, &config);
if (IS_ERR(map)) {
ret = PTR_ERR(map);
dev_err(&client->dev, "Failed to initialize regmap: %d\n", ret);
return ret;
}
ret = read_i2c_reg(map, 0x12, data, 2);
if (ret) {
dev_err(&client->dev, "Failed to read register\n");
return ret;
}
dev_info(&client->dev, "Read data: 0x%x 0x%x\n", data[0], data[1]);
return 0;
}
```
在此示例中,probe() 函数使用 devm_regmap_init_i2c() 函数初始化一个 regmap 结构体,然后调用 read_i2c_reg() 函数读取指定寄存器的数据。read_i2c_reg() 函数通过调用 regmap_read() 函数来实现,其中,map 是一个指向 regmap 结构体的指针,reg 是要读取的寄存器地址,data 是一个指向存放读取数据的缓冲区的指针。如果读取操作失败,则函数会返回错误码。如果读取操作成功,则函数会输出读取的数据。