一、regmap_config用来配置regmap对象
常见的结构体成员如下:
int reg_bits;// 寄存器地址的位数 int val_bits;// 存储寄存器的位数 unsigned int max_register; // 最大寄存器地址,防止访问越界 int (*reg_read)(void *context, unsigned int reg, unsigned int *val);//读寄存器 int (*reg_write)(void *context, unsigned int reg, unsigned int val);//写寄存器 u8 read_flag_mask;// 读寄存器掩码 u8 write_flag_mask;// 写寄存器掩码 |
二、regmap初始化
Regmap支持多种硬件接口的初始化API,最常用的为I2C和SPI,初始化函数原型如下:
regmap_init_i2c(struct i2c_client *i2c, struct regmap_config *config); regmap_init_spi(struct spi_device *spi, strcut regmap_config *config); |
regmap_init_spi()"函数接受一个指向SPI设备的指针(spi)和Regmap配置参数(config)。它首先分配内存以存储Regmap对象,然后设置Regmap的相关字段和操作函数,以便与SPI总线进行通信。最后,函数返回指向初始化的Regmap对象的指针
三、使用regmap
配置和注册regmap实例后,就可以调用regmap提供的read/write/update等操作了。常用的操作函数原型如下:
//向单个reg写入val int regmap_write(struct regmap *map, int reg, int val); //向单个reg写入指定长度的数据,数据存放在val中 int regmap_raw_write(struct regmap *map, int reg, void *val, size_t val_len); // 写多个reg int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,size_t val_count); // 直接写入reg,不经过regmap cache int regmap_multi_reg_write_bypassed(struct regmap *map, const struct reg_sequence *regs,int num_regs); //写多个reg,并立即刷新cache写入 int regmap_raw_write_async(struct regmap *map, unsigned int reg,const void *val, size_t val_len); // 读取单个reg的数据到val中/ int regmap_read(struct regmap *map, int reg, int *val); // 读取单个reg中指定长度的数据 int regmap_raw_read(struct regmap *map, int reg, void *val, size_t val_len); // 读取从reg开始之后val_count个寄存器的数据到val中 int regmap_bulk_read(struct regmap *map, int reg, void *val, size_t val_count); // 更新reg寄存器中mask指定的位 int regmap_update_bits(struct regmap *map, int reg, int mask, int val); //写入寄存器值指定bit * int regmap_write_bits(struct regmap *map, unsigned int reg, unsigned int mask, unsigned int val); // 设置读写寄存器不通过cache模式而是bypass模式,读写立即生效,一般在audio等确保时序性驱动中用到 void regcache_cache_bypass(arizona->regmap, true); |
四、释放regmap
在驱动注销时释放已注册的regmap。
void regmap_exit(struct regmap *map); |