RK3288][Android6.0] 调试笔记 --- 关闭按键音后无法录音问题【转】

本文转载自:http://blog.csdn.net/kris_fei/article/details/70052413

Platform: ROCKCHIP
OS: Android 6.0
Kernel: 3.10.92

这个问题蛮奇怪的,现象是:
1. 默认系统按键音是打开的,然后去录音,是正常的.
2. 当把按键音关闭之后再去录音,虽然录音有在工作,但是不能录制到声音.

理论上说播放和录音是两条不相干的通路,可以同时工作,也可以独立工作,
可事实上播放的配置影响到了录音. 

有通过系统自带的tinyplay以及tinycap工具去测试,现象也是一样,
说明是驱动层的问题.

最终发现是和codec rt5631硬件有关,root cause么有深究.

解决方法
diff --git a/sound/soc/rockchip/rk_i2s.c b/sound/soc/rockchip/rk_i2s.c
index 6b2e91d..2b1f5ee 100644
--- a/sound/soc/rockchip/rk_i2s.c
+++ b/sound/soc/rockchip/rk_i2s.c
@@ -722,7 +722,7 @@ static int rockchip_i2s_probe(struct platform_device *pdev)
                                   I2S_RXCR_TFS_PCM);
        }
 
-       rockchip_snd_txctrl(i2s, 0);
+       rockchip_snd_txctrl(i2s, 1);
        rockchip_snd_rxctrl(i2s, 0);
 
        return 0;      
     
rockchip_snd_txctrl函数.

[cpp] view plain copy
 
    1. static void rockchip_snd_txctrl(struct rk_i2s_dev *i2s, int on)  
    2. {  
    3.     unsigned long flags;  
    4.     unsigned int val = 0;  
    5.     int retry = 10;  
    6.   
    7.     spin_lock_irqsave(&lock, flags);  
    8.   
    9.     dev_dbg(i2s->dev, "%s: %d: on: %d ", __func__, __LINE__, on);  
    10.   
    11.     if (on) {  
    12.         regmap_update_bits(i2s->regmap, I2S_DMACR,  
    13.                    I2S_DMACR_TDE_MASK, I2S_DMACR_TDE_ENABLE);  
    14.   
    15.         regmap_update_bits(i2s->regmap, I2S_XFER,  
    16.                    I2S_XFER_TXS_MASK | I2S_XFER_RXS_MASK,  
    17.                    I2S_XFER_TXS_START | I2S_XFER_RXS_START);  
    18.   
    19.         i2s->tx_start = true;  
    20.     } else {  
    21.         i2s->tx_start = false;  
    22.   
    23.         regmap_update_bits(i2s->regmap, I2S_DMACR,  
    24.                    I2S_DMACR_TDE_MASK, I2S_DMACR_TDE_DISABLE);  
    25.   
    26.   
    27.         if (!i2s->rx_start) {  
    28.             regmap_update_bits(i2s->regmap, I2S_XFER,  
    29.                        I2S_XFER_TXS_MASK |  
    30.                        I2S_XFER_RXS_MASK,  
    31.                        I2S_XFER_TXS_STOP |  
    32.                        I2S_XFER_RXS_STOP);  
    33.   
    34.             regmap_update_bits(i2s->regmap, I2S_CLR,  
    35.                        I2S_CLR_TXC_MASK | I2S_CLR_RXC_MASK,  
    36.                        I2S_CLR_TXC | I2S_CLR_RXC);  
    37.   
    38.             regmap_read(i2s->regmap, I2S_CLR, &val);  
    39.   
    40.             /* Should wait for clear operation to finish */  
    41.             while (val) {  
    42.                 regmap_read(i2s->regmap, I2S_CLR, &val);  
    43.                 retry--;  
    44.                 if (!retry) {  
    45.                     dev_warn(i2s->dev, "fail to clear ");  
    46.                     break;  
    47.                 }  
    48.             }  
    49.             dev_dbg(i2s->dev, "%s: %d: stop xfer ",  
    50.                 __func__, __LINE__);  
    51.         }  
    52.     }  
    53.   
    54.     spin_unlock_irqrestore(&lock, flags);  
    55. }  
原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7778922.html