[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目录下,也就是说它成为了各个驱动模块都能使用的框架了。
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:
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/
阅读全文
1 0
- [RK3288][Android6.0] 控制总线通用接口regmap小结
- [RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED
- [RK3288][Android6.0] DDR Frequency控制流程小结
- [RK3288][Android6.0] GPU DVFS控制策略小结
- [RK3288][Android6.0] 通用访问系统寄存器
- [RK3288][Android6.0] Camera HAL流程小结
- [RK3288][Android6.0] StageFright解码流程小结
- [RK3288][Android6.0] USB 枚举过程小结
- [RK3288][Android6.0] USB UVC 驱动小结
- [RK3288][Android6.0] USB 枚举过程小结
- [RK3288][Android6.0] 串口驱动流程小结
- [RK3288][Android6.0] USB ECHI 驱动小结
- [RK3288][Android6.0] ION 驱动流程小结
- [RK3288][Android6.0] SettingsProvider数据库小结
- [RK3288][Android6.0] 音频调试方法小结
- [RK3288][Android6.0] MediaCodec初始化过程小结
- [RK3288][Android6.0] 有线耳机驱动小结
- [RK3288][Android6.0] Camera HAL流程小结
- socket编程中write、read和send、recv之间的区别
- 数据结构之图的十字链表
- Device Tree(二):基本概念
- Python的字符串
- oracle归档
- [RK3288][Android6.0] 控制总线通用接口regmap小结
- Android研究-Android的init启动到launcher启动-主要分析zygote服务
- 监测防护SambaCry CVE-2017-7494漏洞
- Launcher 记录自定义桌面
- java 枚举类型的使用
- 快速排序算法原理及实现(单轴快速排序、三向切分快速排序、双轴快速排序)
- jQuery中ajax的4种常用请求方式
- 数据结构之元素拆分
- Spring的事务管理