i2c_smbus_read_i2c_block_data参考代码
时间: 2023-04-03 17:01:52 浏览: 347
以下是 i2c_smbus_read_i2c_block_data 的参考代码:
```
int i2c_smbus_read_i2c_block_data(int file, __u8 command, __u8 length, __u8 *values)
{
struct i2c_smbus_ioctl_data args;
union i2c_smbus_data data;
int i;
if (length > 32) {
length = 32;
}
data.block[] = length;
if (ioctl(file, I2C_SMBUS, &args) < ) {
return -1;
}
for (i = 1; i <= length; i++) {
values[i - 1] = data.block[i];
}
return length;
}
```
请问,以上代码是用来做什么的?
相关问题
.read_reg = i2c_smbus_read_i2c_block_data 实例
i2c_smbus_read_i2c_block_data() 函数是 I2C SMBus 协议中读取 I2C 设备寄存器的函数,其函数原型如下:
```
__s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command,
u8 length, u8 *values);
```
其中,client 是一个指向 I2C 设备的 struct i2c_client 结构体的指针,command 是要读取的寄存器地址,length 是要读取的数据长度,values 是一个指向存放读取数据的缓冲区的指针。
下面是一个示例,演示如何使用 i2c_smbus_read_i2c_block_data() 函数读取一个 I2C 设备的寄存器:
```
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
void read_i2c_reg(struct i2c_client *client, u8 reg, u8 *data, u8 len)
{
int ret;
ret = i2c_smbus_read_i2c_block_data(client, reg, len, data);
if (ret < 0) {
dev_err(&client->dev, "Failed to read from I2C device\n");
return;
}
}
```
在此示例中,read_i2c_reg() 函数使用 i2c_smbus_read_i2c_block_data() 函数从 I2C 设备中读取一个指定寄存器的数据。其中,client 是一个指向 I2C 设备的 struct i2c_client 结构体的指针,reg 是要读取的寄存器地址,data 是一个指向存放读取数据的缓冲区的指针,len 是要读取的数据长度。如果读取操作失败,则函数会输出一条错误信息。
.read_reg = i2c_smbus_read_i2c_block_data 通过 regmap_read() 读取 实例
可以使用 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 是一个指向存放读取数据的缓冲区的指针。如果读取操作失败,则函数会返回错误码。如果读取操作成功,则函数会输出读取的数据。
阅读全文