regmap()配置成 smbus 协议读数据 实例
时间: 2024-02-07 11:02:11 浏览: 70
SMBUS协议V3.1中英文版本一起打包
3星 · 编辑精心推荐
以下是一个使用 regmap 配置成 smbus 协议读取数据的示例:
```c
#include <linux/i2c.h>
#include <linux/regmap.h>
static struct i2c_client *client;
static struct regmap *regmap;
static int smbus_read_data(unsigned int reg, unsigned int *val)
{
int ret;
u8 buf[2];
if (!regmap)
return -EINVAL;
/* SMBus read word protocol */
ret = i2c_smbus_read_i2c_block_data(client, reg, 2, buf);
if (ret < 0)
return ret;
*val = (buf[1] << 8) | buf[0];
return 0;
}
static int smbus_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
{
/* Save the I2C client */
client = i2c;
/* Setup regmap */
regmap = devm_regmap_init_i2c(i2c, &smbus_regmap_config);
if (IS_ERR(regmap)) {
dev_err(&i2c->dev, "Failed to initialize regmap\n");
return PTR_ERR(regmap);
}
/* Use regmap to read data */
unsigned int val;
int ret = regmap_read(regmap, 0x10, &val);
if (ret < 0) {
dev_err(&i2c->dev, "Failed to read data from register\n");
return ret;
}
dev_info(&i2c->dev, "Data read from register: %u\n", val);
return 0;
}
static const struct i2c_device_id smbus_id[] = {
{ "smbus-device", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, smbus_id);
static struct i2c_driver smbus_driver = {
.driver = {
.name = "smbus-device",
},
.probe = smbus_probe,
.id_table = smbus_id,
};
module_i2c_driver(smbus_driver);
```
在上面的示例中,我们使用了 `devm_regmap_init_i2c()` 初始化了一个基于 i2c 的 regmap,并将其存储在全局变量 `regmap` 中。然后,我们使用 `regmap_read()` 函数从寄存器地址 `0x10` 中读取数据,并将其存储在 `val` 变量中。最后,我们在日志中打印出了读取到的数据。
请注意,上面的示例仅用于说明如何使用 regmap 配置成 smbus 协议读取数据,实际应用中需要根据具体需求进行适当修改。
阅读全文