一、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); |