zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    全面质量管理-质量管理水平(二)
    全面质量管理-质量管理历史发展概述(一)
    浅谈性能测试流程
    git本地分支与远程分支关联与解除关联
    Sourcetree 代码管理
    HttpRunner3.x 学习8-参数化数据驱动
    HttpRunner3.x 学习6-hook机制
    PHP =>和->区别
    FineBI:实现仪表板分享
    椭圆型方程网格生成法
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7778922.html
Copyright © 2011-2022 走看看