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

解决Alsa underrun爆音问题的一种措施 alsa underrun 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},
}
******/
嵌入式基础接口-音频接口(I2S、PDM、PCM/TDM) I2S I2S总线,又称集成电路内置音频总线,专门用于音频设备之间的数据传输,广泛应用于多媒体系统。它采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。 I2S引脚 1、SCLK:串行时钟,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK都有1个脉冲。SCLK的频率=2×采样频率×采样位数。 2、LRCK:帧时钟(也称WS),用于切换左右声道的数据。LRCK为“1”表示正在传输的是右声道的数据,为“0”则表 阅读详情

相关推荐

PDM协议---音频数据接收

脉冲密度调制。

嵌入式心学修行者,以代码为器,以良知为核。探索嵌入式开发中的“知行合一”,在编译、调试、部署中事上磨练致心中之光,铸可靠之器。 1986

[Linux Audio Driver] 音频POP音问题归纳总结

1. 板级电容/电感发声 情况就是你设备开机之后,啥也没干,然后听到呲啦刺啦的声音,这种情况我遇到过一次,这个是 不合理的结构设计或者走线导致的,硬件实力挖坑,需要改版解决。 2.播放声音长时间有杂音 这个锅我们送给硬件,这个是芯片之间有干扰;需要硬件检查个别芯片的地是不是干净的。 3. 插拔USB出现POP音 还是需要硬件背锅,相关电路加磁珠有可能优化此问题. 4. 播放声音的瞬间有POP...

编程菜汝狗 2429

硅麦驱动开发及调试(pdm>>I2S>>pcm)

硅麦mic驱动开发

星空语_的博客 2924

[Linux Audio Driver] 高通音频相关汇总(持续更新)

0. 背景 之前写了一些音频的博客,但是比较散乱,就想着汇总下写的博客,也是对自己知识结构的梳理,这个会持续更新。 1. 代码分析&总结 I2S相关介绍 ACDB文件加载流程(一) ACDB文件加载流程(二) ACDB文件加载流程(完结篇) 高通平台内部MIC_BIAS简介 从设备地址理解 Android7 外部PA Speaker代码结构 MSM8953音频部分设备树调用关系 开启音频kernel内核debug功能 声卡与XML匹配流程 SDM660平台内部CODEC tinyalsa命令总结 S

编程菜汝狗 4962

Audio CODEC 基本知识及应用

一、Codec 字面上的意思就是编解码器,是bai编码器encoder与解码器decoder的混合体, 软件层面来说,音频编解码器就是根据特定的音频文件格式或流媒体格式、对数字音频数据实现压缩/解压缩的计算机程序. 在硬件层面,音频编解码器指一个能编码模拟音频到数字音频和解码数字音频到模拟音频的独立设备。换种说法,它包含运行在同样时钟的模数转换器(ADC)和数模转换器(DAC)。这在声卡中被使用以支持音频输入和输出。 Codec里面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入

nuanse763的专栏 8342

[RK3399][Android7.1] 调试笔记 --- 解决开关按键时产生的Pop声

Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 背景: 按键音在打开和关闭的时候,会有pop声。 原因: audio codec后面有个功放,功放一直打开着,当codec打开和关闭的时候,会有噪声带进到功放中。 解决方法: 注:GPIO4_D4是用来控制功放的开关。 diff --git a/arch/arm64/boot/dts/rockch...

Kris Fei's blog 4829

音频POP音、咚啪音问题

音频POP音、咚啪音问题: https://notes.z-dd.net/2020/03/05/%E9%9F%B3%E9%A2%91POP%E9%9F%B3%E3%80%81%E5%92%9A%E5%95%AA%E9%9F%B3%E9%97%AE%E9%A2%98/

DD'Notes 1万+

音频驱动篇之pop音攻略

接触音频驱动工作也有2年的时间了,这这段时间里深刻感受了手机行业的更新换代是MB的迅速。2年的时间里,从TI到QUALCOMM,从android2.1到4.2,从单核到四核。经我参与的项目就有20款,日子是相当的难过。 今天回头来说一些我在研发过程中遇到的一些音频难点问题与大家分享,希望对从事音频驱动行业的兄弟们有些许帮助,同时也希望大家有好的想法可以和我沟通,与大家分享。 一、pop音产生的...

飞天鱼 3374

RK3588 Android12音频驱动分析全网最全

linux,Android芯片知识大全,驱动大全。

crl6的博客 5016

Selecting PDM Microphone Clock Frequencies and Decimation Ratios.pdf

Selecting PDM Microphone Clock Frequencies and Decimation Ratios PDM麦克风选择以及抽取比设置

钢铁雄心4存档修改全攻略:从基础设置到高级玩法(附国家代码表)

本文详细解析《钢铁雄心4》存档修改技巧,从基础设置到高级玩法全覆盖。包括存档文件位置、格式转换、国家实力调整、国际关系修改等实用内容,并附赠国家代码表。掌握存档修改技能,解锁游戏全部潜力,实现精细参数控制,超越控制台指令的局限。

weixin_29233857的博客 1433

audio调试:数字麦(DMIC)如何配置

本文介绍rk3588平台DMIC的配置;首先了解下,常见的数字麦有纯pdm麦和通过一些codec芯片将数字麦转换为i2s信号输入到SOC

weixin_42851620的博客 9843

海康SDK实战:如何从PS流中提取H264裸流并实现前端播放(附完整代码)

本文详细介绍了如何利用海康SDK从PS流中提取H264裸流,并构建无插件前端播放的完整链路。通过解析PS流结构、提取H264 ES流,结合WebSocket实时传输与WFS.js前端播放器,实现了低延迟、高可控性的视频流处理方案,为开发者提供了从数据源到前端渲染的实战代码与清晰指南。

weixin_29051811的博客 476

国产音频芯片:音频ADC,音频DAC,音频CODEC,音频CLASS D如何竞争欧美大牌?

CL7016,USB连接电脑或手机录音耳机监听口可以同时监听录音/降噪/音量加减等功能,CL7016+LDR6023完成边听歌边充电的Type-C音频转接口。 CL1026+ DSP(数字版手机声卡) CL1009录音/放音 (运动相机) CL1026 + 2.4G无线(领夹麦克风) CL1026 or CL4016(音箱,音响) CL1026+5.8无线(监听耳机) CL1009+DSP(行车记录仪)

weixin_51957723的博客 9560

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

NL2SQL进阶系列(3):Data-Copilot、Chat2DB、Vanna Text2SQL优化框架开源应用实践详解[Text2SQL]

丨汀、的博客 5421

NAS新玩法!豆瓣与迅雷结合,轻松实现自动下载电影自动追剧功能

NAS新玩法!豆瓣与迅雷结合,轻松实现自动下载电影自动追剧功能

XiaoqiangClub的博客 6388

ES9023音频解码芯片原理及应用简介

一般来说,音频解码器分为两类,一类是用于Hi-Fi听音的纯音频解码器,即指把CD机等数字音源器材一分为二后,去掉转盘(驱动光碟旋转读盘)的部分。纯音频解码器的主要作用是把读取的数字音频信息转换成模拟音频信号输出,供功率放大重放;因此严格说纯音频解码器应称作D/A(数字/模拟)转换器。另一类即AV影音解码器,即平常所说的在“家庭影院”设备中使用的解码器,主要作用是把录音时经过编码的多声道音频信息作解码还原,经D/A转换后供功率 放大重放。解码芯片,它是解码器的心脏。目前为止深受国内发烧友及厂家喜好的莫过于由美

isweekDN的博客 5172

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

中心UI组件是一个框架,为所有SAPFiori应用程序提供公共基础设施SAPFiorilaunchpad是所有SAPFioriUI的基础,并为SAPFiori应用程序提供基本功能,如登录,界面大小,应用程序之间的导航,和基于角色的应用程序目录。ABAP前端服务器包含所有基础设施组件,用于为客户端生成SAPFiori应用程序特定的UI,并与SAPBusinessSuite后端系统通信。SAPFiori应用程序的处理过程如下首先,客户端加载SAPFiori应用程序的界面。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 941

全志V3S学习笔记(三)CODEC的使用(声音播放功能)

全志V3S学习笔记(三)CODEC的使用(声音播放功能) 文章目录全志V3S学习笔记(三)CODEC的使用(声音播放功能)下载alsa-lib和alsa-utils1.编译alsa-lib2.编译alsa-utils3.把文件拷贝到开发板在开发板上ls -l /dev/snd看看系统是否已经有了设备节点,如果没有,需要手动创建。音频播放测试驱动测试代码总结 下载alsa-lib和alsa-utils https://www.alsa-project.org/main/index.php/Download

Topshenck的博客 2504

对角两对双差速轮AGV的平移、直行、转弯和原地旋转之PID控制

本示例将展示如何使用PID控制算法,控制具有对角线布置的两对双差速轮(左前和右后)的AGV,实现平移、直行、转弯和原地旋转等运动。通过对车辆的运动学和PID控制器的设计,我们可以精确地控制AGV的运动

xiaoc100200的博客 1511

matlab 点云按高程进行赋色【2024最新版】

首先按照Z轴方向求取所在点云的高程极值(包括高程最大值与最小值),然后将高程归一化到0~255范围内,最后采用matlab中的colormap颜色渲染函数进行赋色并保存渲染结果到点云。

点云侠的博客 3341

【P52】基于继电器的音频静音电路

TDA1543 还没做完,主要原因是最近一直忙着做别的工作赚钱糊口,做耳放什么的实在要穷死了。因为 I2S 模块选用了 QCC5125 蓝牙模块,它有一个播放状态输出接口,在音频播放的时候输出高电平,没有播放的时候输出低电平。除了播放状态,还有蓝牙连接状态的输出,但是只使用蓝牙状态,在 USB 接入时就不能用了,最后还是选择播放状态来控制。因为开机后一定不可能先呈现播放状态,因此使用静音电路可以在...

daveswong的博客 1999

华为嵌入式面试题及参考答案(持续更新)

异步是指在程序执行过程中,某些任务不需要等待立即完成就可以继续执行其他任务的过程。在计算机编程中,异步通常用于处理长时间运行的操作,如文件读写、网络通信等,以避免阻塞主线程。异步处理通常涉及到回调函数、事件循环、协程或未来的概念。使用宏定义来避免命名冲突。#else#endif堆和栈是计算机程序中用于存储数据的两种不同类型的内存区域。

大模型大数据攻城狮的专栏 2484

[转载]数字音频接口

一直想了解下所有的数字音频接口,进行归纳总结,这边发现一篇总结的很好的文章,放到csdn进行分享,原文链接如下: http://www.wangdali.net/wp-content/uploads/2014/10/p9trad_chain.png 概述 数字音频接口DAI,即Digital Audio Interfaces,顾名思义,DAI表示在板级或板间传输数字音频信号的方式...

只为分享 5976

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

NXP i.MX8系列平台开发讲解 - 3.12 Linux 之Audio子系统(一)

ALSA最初于2002年引入Linux内核,旨在提供更先进的音频支持,以替代旧的OSS(Open Sound System)音频系统。ALSA的引入解决了OSS存在的限制,并为Linux内核提供了更高质量和更灵活的音频功能。随着Linux内核的不断发展,ALSA得到了持续的改进和扩展。ALSA现在已经成为Linux内核的一部分,提供了广泛的音频功能和驱动程序支持。它支持多种音频硬件设备,包括声卡、USB音频接口、蓝牙音频等。

hywelstar的嵌入式软件开发笔记 1549

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: [Thinking in C] 注释符被编译器替换成了啥?
下一篇: [Linux Audio Driver] ACDB文件加载流程(完结篇)
1byte ≠ 8bit
博客等级 码龄8年 7242粉丝 170原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值