[Linux Audio Driver] PDM CLOCK导致的耳机右声道POP音问题

0. 背景

此问题现象是,当音乐播放器里面有两首歌时,正在播放一首,然后双击耳机的中间按键会出现POP音;这里会发现,直接在界面上切歌,是不会有这样的问题的;

在这里插入图片描述

(注:如此时音乐的名字mute1,我使用两个静音文件来做测试以排除音源本身的问题)

这是由于,直接用界面切歌,会默认触发提示音,进入设置里面,把所有的提示音都关闭,此问题即可通过在音乐播放器界面切歌复现;以下开始debug.

1. 软件修改

修改对应平台mixer_paths_XX.xml文件:

<path name="headphones">
        <ctl name="MI2S_RX Channels" value="Two" />
        <ctl name="RX1 MIX1 INP1" value="RX1" />
        <ctl name="RX2 MIX1 INP1" value="RX2" />
        <ctl name="RDAC2 MUX" value="RX2" />
        <ctl name="HPHL" value="Switch" />
        <ctl name="HPHR" value="Switch" />
</path>

这种是正常的耳机立体声配置,这样的配置会出现POP音问题;软件通过修改为下面可规避问题:

<path name="headphones">
        <ctl name="MI2S_RX Channels" value="Two" />
        <ctl name="RX1 MIX1 INP1" value="RX1" />
        <ctl name="RX2 MIX1 INP1" value="RX2" />
        <ctl name="RDAC2 MUX" value="RX1" />
        <ctl name="HPHL" value="Switch" />
        <ctl name="HPHR" value="Switch" />
</path>

这种修改会让耳机的右声道也复用左声道的数据,这样就是配置的假的立体声;

2. 开始怀疑耳机的右声道软件上配置和左声道有差异

还能咋办,抓log呗:

echo -n "file q6afe.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file q6asm.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file q6adm.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file msm-pcm-routing-v2.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file msm-pcm-q6-v2.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file msm-dai-q6-v2.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file msm-dai-fe.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file dapm.c +p" > /sys/kernel/debug/dynamic_debug/control
echo -n "file soc-pcm.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file soc-core.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file soc-dapm.c +p" > /sys/kernel/debug/dynamic_debug/control 
echo -n "file pcm_native.c +p" > /sys/kernel/debug/dynamic_debug/control

进shell里面,logcat -c ,然后抓两种XML配置的差异log;

在这里插入图片描述

在这里插入图片描述

我们从log对比,可以看到,两个配置的差异点,就是上下电的时候,(真)立体声配置会多一些RX2相关的widget .

3. 求助高通

没有有效进展,过程略。

4. 继续分析

当时就想着会不会有的项目木得这个问题,一个android9 项目没有,一个android7的项目发现耳机的左声道和右声道都有POP音。

在这里插入图片描述

问题没解决,然后咋还越搞越复杂了。

然后我怀疑耳机座子设计有问题,看到网上博客有大佬有下面的分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我拿了android9和android7的电路设计找了,这两个项目的硬件负责人都没有发现问题;

5. 接下来我开始骚操作了

//LA.UM.6.6\kernel\msm-3.18\sound\soc\codecs\wcd9306.c

static int wcd9xxx_enable_static_pa(struct wcd9xxx_mbhc *mbhc, bool enable)
{
    struct snd_soc_codec *codec = mbhc->codec;
    int wg_time = snd_soc_read(codec, WCD9XXX_A_RX_HPH_CNP_WG_TIME) *
                   TAPAN_WG_TIME_FACTOR_US;
    /*
     * Tapan requires additional time to enable PA.
     * It is observed during experiments that we need
     * an additional wait time about 0.35 times of
     * the WG_TIME
     */
    wg_time += (int) (wg_time * 35) / 100;

    snd_soc_update_bits(codec, WCD9XXX_A_RX_HPH_CNP_EN, 0x30,
                enable ? 0x30 : 0x0);
    /* Wait for wave gen time to avoid pop noise */
    usleep_range(wg_time+ WCD9XXX_USLEEP_RANGE_MARGIN_US, 2*wg_time + WCD9XXX_USLEEP_RANGE_MARGIN_US);
    pr_err("wangliang>>>>>>1 %s",__func__);
    pr_debug("%s: PAs are %s as static mode (wg_time %d)\n", __func__,
         enable ? "enabled" : "disabled", wg_time);
    return 0;
}

我找到了这个函数,是一个高通参考的外部codec芯片里面的log:

It is observed during experiments that we need an additional wait time about 0.35 times of the WG_TIME,

在这里插入图片描述

这句话深深的打动了我的内心,人家都说根据实验加个延迟就能避免pop音,然后我去找codec驱动里面相关上下电代码加延迟。

LA.UM.6.6\kernel\msm-3.18\sound\soc\codecs\msm8x16-wcd.c

在这里插入图片描述

结果是木得用;

或者把耳机的控制前后顺序改一波?

在这里插入图片描述

还是木得用,这个会导致切换歌曲的时候,瞬间没有POP音,但是过个2-3秒,POP音就和机关枪一样的……

6. 这BUG咋解?

在这里插入图片描述
讲道理,android9项目没问题,说明这个问题是可以解决的,更关键的是,耳机的代码底层一般不会改动的;

但是高通没有效建议,硬件说没问题,软件又找不到,尼玛我咋解这个BUG,拿头解…

7. 曙光

在这里插入图片描述
总之就是 通过修改一些 不影响音频的代码,用几乎同一套软件,烧进不同的项目,一个有问题,
一个没有问题;基本可以证明这个POP音是硬件造成的了。

我往窗外看了看,已经午夜10点了,太阳是木得了,月光惨淡,阴雨绵绵,我可以下班了。

8. 最终解决

在这里插入图片描述
在这里插入图片描述
Qualcomm Technologies, Inc. and/or its affiliated companies. All rights reserved.)

GPIO69,作为PMU与CPU通信的时钟信号,居然接了个电容,把这个电容拿掉POP音就没有了;

根本原因硬件大佬也分析不出来,以下为猜测:

  1. 由于这个电容的延迟,PMU与CPU通信的clock信号被破坏,至少在dapm上下电的时候,clock信号异常

  2. 电容充放电与外围电路形成回路,产生异音。

后续发现此问题会造成,双PA放大的硬件,喇叭切歌时发出POP音,电容拿掉即可解决。

9. 作者注

/******
@article{Linux Audio Driver,
Author = { 1byte ≠ 8bit},
Year = { 2020},
}
******/
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将Android设备的频切换到蓝牙耳机,可以按照以下步骤进行操作: 首先,确保蓝牙耳机已经与Android设备成功配对。在设备的设置菜单中,找到“蓝牙”选项,并打开蓝牙功能。在配对列表中选择你的蓝牙耳机,并进行配对。 一旦蓝牙耳机成功连接,可以采取以下两种方法将频切换到蓝牙耳机: 方法一:在通知面板中切换频输出。下滑打开通知面板,在频控制器中,通常会显示设备当前正在使用的频输出设备。点击该设备图标,会弹出一个菜单,其中列出了所有可用的频输出选项,包择轨蓝牙耳机作为当前频输出设备。 方法二:在设置菜单中切换频输出。进入设备的设置菜单,在“声和振动”或类似的选项下,找到“频输出”或“频设备”选项。点击该选项,会列出所有可用的频输出设备,包括蓝牙耳机。选择蓝牙耳机作为当前频输出设备。 一旦成功切换频输出到蓝牙耳机,Android设备的所有频输出,包括乐、视频和通话声,都会通过蓝牙耳机进行播放。如果将蓝牙耳机关闭或与设备断开连接,频输出将自动切换回设备的内置扬声器。 总结来说,要将Android设备的频切换到蓝牙耳机,需要确保设备和蓝牙耳机成功配对。然后,在通知面板或设置菜单中选择蓝牙耳机作为频输出设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值