1. 程式人生 > >[RK3288][Android6.0] 控制匯流排通用介面regmap小結

[RK3288][Android6.0] 控制匯流排通用介面regmap小結

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也對使用者空間提供了除錯介面來檢視暫存器的值是否正確。

[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

參考