1、Regmap 申请与初始化
regmap 支持多种物理总线,比如 I2C 和 SPI,我们需要根据所使用的接口来选择合适的 regmap 初始化函数。Linux 内核提供了针对不同接口的 regmap 初始化函数。
SPI 接口初始化函数为 regmap_init_spi
I2C 接口的初始化函数为 regmap_init_i2c
不管是什么接口,全部使用 regmap_exit 这个函数来释放 regmap
我们一般会在 probe 函数中初始化 regmap_config,然后申请并初始化 regmap。
2、regmap 设备访问 API 函数
不管是 I2C 还是 SPI 等接口,还是 SOC 内部的寄存器,对于寄存器的操作就两种:读和写。regmap 提供了最核心的两个读写操作:regmap_read 和 regmap_write。这两个函数分别用来读/写寄存器。
在 regmap_read 和 regmap_write 的基础上还衍生出了其他一些 regmap 的 API 函数,首先是regmap_update_bits 函数。看名字就知道,此函数用来修改寄存器指定的 bit,函数原型如下:
int
regmap_update_bits
(struct regmap *
map
,
unsigned
int
reg,
unsigned
int
mask,
unsigned
int
val,
函数参数和返回值含义如下:
map:要操作的 regmap。
reg:要操作的寄存器。
mask:掩码,需要更新的位必须在掩码中设置为 1。
val:需要更新的位值。
返回值:0,写成功;其他值,写失败。
比如要将寄存器的 bit1 和 bit2 置 1,那么 mask 应该设置为 0X00000011,此时 val 的 bit1 和 bit2 应该设置为 1,也就是 0Xxxxxxx11。
如果要清除寄存器的 bit4 和 bit7,那么 mask 应该设置为 0X10010000,val 的 bit4 和 bit7 设置为 0,也就是 0X0xx0xxxx。
接下来看一下 regmap_bulk_read 函数,此函数用于读取多个寄存器的值,函数原型如下:
int
regmap_bulk_read
(struct regmap *
map
,
unsigned
int
reg,
void
*val,
size_t
val_count)
函数参数和返回值含义如下:
map:要操作的 regmap。
reg:要读取的第一个寄存器。
val:读取到的数据缓冲区。
val_count:要读取的寄存器数量。
返回值:0,写成功;其他值,读失败。
另外也有多个寄存器写函数 regmap_bulk_write,函数原型如下:
int
regmap_bulk_write
(struct regmap *
map
,
unsigned
int
reg,
const
void
*val,
size_t
val_count)
函数参数和返回值含义如下:
map:要操作的 regmap。
reg:要写的第一个寄存器。
val:要写的寄存器数据缓冲区。
val_count:要写的寄存器数量。
返回值:0,写成功;其他值,读失败。
关于 regmap 常用到 API 函数就讲解到这里,还有很多其他功能的 API 函数,大家自行查 阅 Linux 内核即可,内核里面对每个 API 函数都有详细的讲解。
全部0条评论
快来发表一下你的评论吧 !