[RK3288][Android6.0] 控制匯流排通用介面regmap小結
阿新 • • 發佈:2018-12-22
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也對使用者空間提供了除錯介面來檢視暫存器的值是否正確。
[email protected]:/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
參考: