regmap(I2C_SMBUS_BLOCK_PROC_CALL) 实例
时间: 2023-08-11 22:04:09 浏览: 167
下面是一个使用`regmap(I2C_SMBUS_BLOCK_PROC_CALL)`函数的实例:
```c
#include <linux/i2c.h>
#include <linux/regmap.h>
/* 假设我们已经获取了一个i2c_client结构体指针,称为client */
/* 定义一个regmap_config结构体 */
static const struct regmap_config my_regmap_config = {
.name = "my_regmap",
.reg_bits = 8,
.val_bits = 8,
.max_register = 0xff,
};
/* 初始化一个regmap结构体 */
static struct regmap *my_regmap_init(struct i2c_client *client)
{
struct regmap *map;
int ret;
/* 分配一个regmap结构体 */
map = devm_regmap_init_i2c(client, &my_regmap_config);
if (IS_ERR(map)) {
pr_err("Failed to allocate regmap: %ld\n", PTR_ERR(map));
return NULL;
}
/* 设置I2C_SMBUS_BLOCK_PROC_CALL读写函数 */
ret = regmap_set_i2c_bus(map, client->adapter, client->addr,
I2C_SMBUS_BLOCK_PROC_CALL);
if (ret) {
pr_err("Failed to set I2C bus for regmap: %d\n", ret);
regmap_exit(map);
return NULL;
}
return map;
}
/* 在驱动程序中使用regmap */
static int my_driver_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct regmap *map;
u8 val;
/* 初始化一个regmap结构体 */
map = my_regmap_init(client);
if (!map)
return -ENODEV;
/* 使用regmap进行读写操作 */
regmap_write(map, 0x10, 0x55);
regmap_read(map, 0x20, &val);
return 0;
}
/* 在驱动程序中使用regmap */
static int my_driver_remove(struct i2c_client *client)
{
/* 在驱动程序卸载时,释放regmap结构体 */
regmap_exit(dev_get_regmap(client, NULL));
return 0;
}
/* 定义一个i2c_driver结构体 */
static const struct i2c_device_id my_driver_id[] = {
{ "my_device", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, my_driver_id);
static struct i2c_driver my_driver = {
.driver = {
.name = "my_driver",
},
.probe = my_driver_probe,
.remove = my_driver_remove,
.id_table = my_driver_id,
};
/* 注册i2c_driver */
module_i2c_driver(my_driver);
```
在上面的代码中,我们定义了一个`regmap_config`结构体,并在其中指定了需要使用的寄存器位数、值位数和最大寄存器地址。然后,我们使用`devm_regmap_init_i2c`函数初始化了一个`regmap`结构体,并使用`regmap_set_i2c_bus`函数设置了I2C总线和设备地址以及使用`I2C_SMBUS_BLOCK_PROC_CALL`读写函数。
接着,在驱动程序中使用`regmap_write`和`regmap_read`函数来进行寄存器读写操作。
注意:这只是一个简单的示例,实际上使用`regmap`需要更多的代码和配置。
阅读全文