[RK3288][Android6.0] 控制总线通用接口regmap小结

来源:互联网 发布:淘宝屏蔽关键词 编辑:程序博客网 时间:2024/06/06 12:42
Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92


看音频模块时发现了一个叫regmap的东西,看了下以后势必会用到,也把小结分享给大家。
之前使用I2C或者SPI总线进行读写时的框架


需要自己再对读写函数进行封装,这样每个设备驱动都要重复干一遍这个事情,代码也冗余。因此,后来慢慢地出现了控制总线通用接口,即regmap框架,它把这些控制接口封装起来统一使用了,事实上regmap一开始是用于ASOC也就是audio模块的,后来被移到了/driver/base/regmap目录下,也就是说它成为了各个驱动模块都能使用的框架了。

regmap目前支持程度


使用regmap后的框架:


regmap的拓扑结构:


初始化方法:
devm_regmap_init_mmio()
devm_regmap_init_i2c()
devm_regmap_init_spi()
最终调用的都是
regmap_init()

读写方法:
regmap_update_bits()    //先读回来再对相应位操作
regmap_read()
regmap_write()
本上上调用的都是
_regmap_read()
_regmap_write()

实例
sound/soc/rockchip/rk_i2s
:
static int rockchip_i2s_probe(struct platform_device *pdev){......    //i2s对应的是mmio类型    i2s->regmap = devm_regmap_init_mmio(&pdev->dev, regs,                        &rockchip_i2s_regmap_config);......}static const struct regmap_config rockchip_i2s_regmap_config = {    .reg_bits = 32,    .reg_stride = 4,    .val_bits = 32,    .max_register = I2S_RXDR,    .writeable_reg = rockchip_i2s_wr_reg,    .readable_reg = rockchip_i2s_rd_reg,    .volatile_reg = rockchip_i2s_volatile_reg,    .precious_reg = rockchip_i2s_precious_reg,    .cache_type = REGCACHE_FLAT,};
更新寄存器
static int rockchip_i2s_hw_params(......){......    regmap_update_bits(i2s->regmap, I2S_TXCR,               I2S_TXCR_VDW_MASK |               I2S_TXCR_CSR_MASK,               val);......}

调试:

regmap也对用户空间提供了调试接口来查看寄存器的值是否正确。

root@rk3288:/sys/kernel/debug/regmap/ff890000.rockchip-i2s # cat registers
00: 00000000
04: 00000000
08: 00000000
0c: 00000000
10: 00000100
14: 00000000
18: 00000000
1c: 00000003
20: 00000000
28: 00000000

参考

http://opensourceforu.com/2017/01/regmap-reducing-redundancy-linux-code/

https://lwn.net/Articles/451789/

http://elinux.org/images/a/a3/Regmap-_The_Power_of_Subsystems_and_Abstractions.pdf

http://blog.csdn.net/wp_neu/article/details/72356783

http://blog.miopeco.com/2015/03/23/linux_kernel_regmap/

原创粉丝点击