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

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92


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

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

regmap目前支持程度

[RK3288][Android6.0] 控制总线通用接口regmap小结_第3张图片

使用regmap后的框架:

[RK3288][Android6.0] 控制总线通用接口regmap小结_第4张图片

regmap的拓扑结构:

[RK3288][Android6.0] 控制总线通用接口regmap小结_第5张图片

初始化方法:
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/

你可能感兴趣的:(子类__I2C)