简介:《高通平台Audio入门手册》面向刚接触高通平台音频驱动与系统Bringup的工程师及学习者,聚焦音频软硬件框架认知与Bringup流程梳理,帮助读者建立从硬件组件到软件分层的整体理解。文档围绕CODEC、SLIMbus、GPIO、PIL等关键模块展开,并逐项说明PIL加载、SLIMbus状态、声卡注册、CODEC上电时序与复位、软硬件匹配、GPIO配置、外部芯片集成及音频通路配置等排查要点,同时覆盖kernel层设备树、系统层音频属性与HAL层Device table等分层配置。资源包共1个docx文件,约2.61MB,以文档形式便于查阅和对照。已有2974人浏览学习,适合作为高通音频入门与Bringup阶段的框架性参考,也可用于梳理调试思路和分层检查清单。
1. 高通平台 audio 入门:一块没声音的板子该从哪儿下手
板子第一次回片,喇叭一声不响,kernel log 里连声卡注册那一行都没有。这是高通平台 audio 入门最常见的开场,也是这份手册想解决的核心问题:不是教你怎么调音效,而是教你怎么让一颗 codec 在板子上先出声。手册从软硬件系统框架讲起,把 CODEC、SLIMbus/SoundWire、ALSA 分层的关系摊开,再按 PIL 加载、总线 UP、声卡注册、上电时序与复位、GPIO、通路配置的顺序走一遍 bringup,最后落到 ACDB 校准和 QXDM 抓 log。它不涉及音频算法,讲的是寄存器、时序、设备树和 mixer 通路这些必须手动打通的部分。适合刚接手高通平台音频 bringup 的驱动工程师、BSP 同学,以及要从 system 层或 HAL 层往下追无声问题的应用侧开发。下文按我实际排查的顺序重组了这本手册的骨架,遇到卡壳的地方直接照章节翻。
2. 软硬件框架:CODEC、SLIMbus 与 ALSA 分层的对应关系
2.1 从 SoC 到喇叭:一条音频链路要经过几道手
高通平台的音频主控不在 codec 里,而在 SoC 内部的 LPASS/ADSP 上。ADSP 负责混音、重采样、音效和 voice 处理,codec 只是模拟前端。所以一条下行链路大致是:App 解码出 PCM → AudioFlinger 混音 → HAL → kernel ALSA → ADSP 里的 AFE/ADM 矩阵 → 数字总线(SLIMbus 或 SoundWire)→ WCD 系列 codec 做 DAC → 差分模拟输出 → 外部 PA 或 WSA 智能功放 → 喇叭。上行反过来:MIC 经 MICBIAS 供电、PGA 放大、ADC 采样,再沿同一条总线回到 ADSP。
这条链路上每一段都可能断,而现象往往都是「没声音」,所以必须建立分段验证的习惯。我一般先确认 ADSP 起来了没有,再看总线上的设备在不在,再看声卡注册,最后才去查 mixer 通路。顺序颠倒的话,很容易在 xml 里改半天,实际上后端 codec 根本没 probe 成功。
硬件侧有一件事在原理图评审阶段就该定下来:模拟输出走差分还是单端。差分的每个信号都有独立基准线,共模噪声在接收端被抵消,两线同受干扰时电压差变化很小;单端共用一根地,干扰来的时候地不变、信号线变,压差就被放大了。喇叭和听筒这类长走线、旁边又有 DCDC 的场景,差分基本是必选项。等板子回来发现底噪大再改,就是割线飞线的活了。
2.2 CODEC 内部做了什么:ADC/DAC、MICBIAS 与耳机检测
WCD 系列 codec 里值得 bringup 时关注的就几块:DAC 和 Class-H 耳机功放、ADC 与 MIC 偏置、MBHC(耳机插拔与线控检测)、以及一堆数字音量与 DSM 调制寄存器。DAC 之后的模拟增益、耳机功放的静态电流、MICBIAS 的输出电压(常见 1.8V 和 2.85V 两档)都是靠设备树参数和 ACDB 校准数据一起决定的。
MICBIAS 是最容易翻车的地方。驻极体 MIC 要偏置电压和偏置电阻,硅麦(DMIC)要时钟和数据线,两者的电路完全不同。设备树里qcom,cdc-micbias1-mv这类属性写错,现象就是录音一片静音或者只有底噪,怎么调音量都没用。MBHC 则依赖 MIC 线上的分压,插入检测的阈值如果不校准,会出现「插着耳机外放还在响」这种玄学问题。
2.3 软件分层:AudioFlinger、HAL、tinyalsa 到 ASOC
用户空间这一层,AudioFlinger 管音频流和混音线程,往下是厂商 HAL(在hardware/qcom/audio/hal一带),HAL 再往下用 tinyalsa 的pcm_open/pcm_write和 mixer 控件跟内核打交道。内核里是标准 ALSA SoC 框架,但高通做了 FE/BE 拆分:Frontend DAI 对应一条 PCM 逻辑流(比如 deep buffer 播放、voice call),Backend DAI 对应真实的物理接口(SLIMbus 上的 codec 端口、SoundWire 上的功放)。两者之间靠 ADSP 里的 ADM 矩阵连接。
mixer_paths.xml干的事情,本质就是把「哪条 FE」接到「哪条 BE」,中间经过哪几个 mixer、音量设多少。理解了 FE/BE 这层,很多「改了 xml 没反应」的问题就有了解释方向:要么 xml 没生效,要么 FE 和 BE 根本没对上,要么 ADM 矩阵里对应的端口没被 enable。
2.4 代码位置地图:出问题先去哪个目录翻
手册里给了一份代码位置清单,我按排查时会用到的顺序整理成了表。注意内核版本和基线不同,路径会有出入,用find先探一下更稳。
| 目录 | 职责 | 什么时候去翻 |
|---|---|---|
hardware/qcom/audio/hal | Audio HAL,含audio_hw.c、platform 相关代码 | 通路选择、设备切换异常 |
external/tinyalsa | tinymix/tinyplay/tinycap工具 | 手动验证通路和硬件 |
kernel/sound/soc/msm | machine driver,msm8***.c | 声卡注册、DAI link 绑定 |
kernel/sound/soc/msm/qdsp6v2 | FE/BE DAI、AFE/ADM/ASM、voice 驱动 | PCM 打不开、voice 通路问题 |
kernel/sound/soc/codecs | wcd9xxx*.c、wsa881x.c等 codec 驱动 | probe 失败、寄存器读写 |
kernel/drivers/slimbus | SLIMbus 控制器与设备枚举 | 总线不 UP、设备列表为空 |
kernel/arch/arm64/boot/dts | msm*.dtsi、*-cdp.dts等 | 硬件描述、GPIO、上电时序 |
vendor/qcom/proprietary/mm-audio | ACDB 校准相关 | 校准数据加载失败 |
bringup 阶段先摸清这张表,比通读代码有用得多。板子出问题时,你大概率是在「dts 写错」「codec 没 probe」「xml 对不上」这三个坑里打转,而它们分别落在这张表的三行上。
# 列出当前声卡上的全部 mixer 控件,bringup 第一件事是确认控件名和 xml 里写的一致 adb shell tinymix -D 0 # 只看下行通路相关控件,输出太长时用这个收窄 adb shell tinymix -D 0 | grep -iE "RX|SPK|HPH|SLIM|WSA" # 看声卡和 PCM 设备是否枚举出来 adb shell cat /proc/asound/cards adb shell cat /proc/asound/pcm-D 0指定第 0 张声卡,多声卡平台(比如同时有 USB audio)上要先用cards确认编号。tinymix打印的是控件当前值,bringup 时对着mixer_paths.xml逐条核,能提前发现拼写不一致的问题。/proc/asound/pcm里能看到每个 PCM 的 substream 状态,播放时hw_ptr是否在动,是判断「数据到底有没有下去」最快的手段。
3. Bringup 顺序:从 PIL 到声卡注册的六道关卡
3.1 第一关:PIL 与外设固件是否加载成功
Peripheral Image Loader 负责把 ADSP 等子系统的固件从文件系统加载到对应内存并启动。ADSP 没起来,整个音频子系统就是死的,表现是声卡压根不注册、或者注册了但任何 PCM 都打不开。这一关不过,后面全白搭。
# 先看 ADSP 和固件加载有没有报错 adb shell dmesg | grep -iE "pil|adsp|subsys|firmware" | tail -50 # 确认 ADSP 子系统状态,正常应该是 running adb shell cat /sys/kernel/debug/remoteproc/*/state 2>/dev/null adb shell ls /sys/class/remoteproc/ 2>/dev/null不同基线暴露的节点名差异很大,/sys/kernel/debug/remoteproc在新内核上可能已经换成/sys/class/remoteproc。看到firmware request failed或-ENOENT,基本就是分区里固件文件缺失或者路径写错,去查firmware-name属性和实际打包的镜像。看到crash或stop,那问题在更底层的时钟、电源域或者内存分配,不在 audio 本身。
提示:PIL 失败时不要急着改 audio 的 dts,常见根因是固件分区没刷全或者镜像版本和内核不匹配,先把 log 里的文件名和分区里的文件名对齐。
3.2 第二关:SLIMbus / SoundWire 总线是否 UP
总线是 codec 和 SoC 之间唯一的数字通道。SLIMbus 靠 framer 提供时钟,SoundWire 靠 master 提供帧同步,任何一个没起来,总线上的设备就不会被枚举出来。这一步的判断标准很直接:设备列表是不是空的。
# SLIMbus 设备枚举情况,正常能看到 codec 和功放对应的设备节点 adb shell ls /sys/bus/slimbus/devices/ # SoundWire 侧,看 master 和 slave 的状态 adb shell ls /sys/bus/soundwire/devices/ adb shell cat /sys/bus/soundwire/devices/*/status 2>/dev/null # 找不到路径时先探一下总线目录挂在哪儿 adb shell find /sys/bus -maxdepth 2 -iname "*slim*" -o -iname "*soundwire*"设备列表为空有几种典型原因:控制器节点status还是disabled、framer 的时钟源没配(常见是没指定clk或频率不对)、总线的数据线或时钟线上串了不合适的小器件。手册里记录过一个很典型的案例:某平台上 codec 的磁珠选型偏大,直流阻抗把总线电平拉下来,设备时有时无,换了磁珠或者临时短接立刻就好。这类问题用示波器量波形比看 log 快得多。
3.3 第三关:声卡注册与 codec 上电时序、复位
总线通了,接下来看 machine driver 有没有把声卡注册出来。判断方法就是看/proc/asound/cards。空的话,问题一定在 codec 的 probe 阶段,往回翻 log。
# codec 驱动 probe 过程,重点看返回值 adb shell dmesg | grep -iE "wcd9|wsa88|snd_soc|asoc|msm8.*snd" | tail -100 # 声卡注册成功的标志 adb shell cat /proc/asound/cardslog 里如果能看到wcd9335-codec之类的设备名后面跟一个负的错误码,那就是 probe 失败。-ENODEV、-EIO多半是总线通信没通,-EPROBE_DEFER是依赖的 regulator 或时钟还没就绪,可以等一会再看,一直 defer 就是依赖树有问题。
上电时序和复位是这一关的另一半。codec 通常有 reset 引脚,要求在某几路电源稳定之后拉高并保持一段时间,时序错了会出现「log 里 probe 成功但读出来的寄存器全是 0 或全是 0xff」。常见做法是在 dts 里用reset-gpios配合pinctrl,把上电顺序交给驱动管;也有平台在 bootloader 里就把电拉好,那就要确认 bootloader 里的配置和内核 dts 不冲突。
3.4 第四关:GPIO 与外部芯片集成
GPIO 在这一层有两个用途:控制 codec 和功放的使能,以及做耳机插拔这类中断输入。配置错的现象五花八门,但有一个共同点——寄存器读写都正常,就是不出声。
# 看关键 GPIO 当前电平,方向是 in 还是 out adb shell cat /sys/kernel/debug/gpio | grep -iE "spk|pa_|codec|reset|hp_det"输出里能直接看到每个 GPIO 的编号、方向、电平和使用者名字。名字是驱动申请时传的 label,看到unrequested说明没人在用,那多半是 dts 里没写或者 pinctrl 里配成了别的功能。外部功放的 enable 脚经常被漏掉,配置成输出低电平之后喇叭当然一声不响。
集成外部芯片(比如独立的 DSP 或第三方 PA)时要额外确认三件事:供电时序是否和主 codec 一致、I2C/SPI 控制通道能否正常读写、以及它的音频输入是走模拟还是数字。数字接入的话还要在 dts 里补对应的 DAI link,否则机器驱动根本不知道有这么个东西存在。
3.5 第五关:通路配置与软硬件匹配
前四关都过了,声卡在、设备在、电也上好了,还不响,那就是通路没配对。这一步我强烈建议先绕开mixer_paths.xml,用tinymix手动把一条最简通路打开,直接判断是硬件问题还是配置问题。
# 手动打开一条 speaker 下行通路,绕开 xml 验证硬件 adb shell tinymix -D 0 "SLIM_0_RX Channels" One adb shell tinymix -D 0 "RX1 MIX1 INP1" RX1 adb shell tinymix -D 0 "CLASS_H_DSM MUX" DSM_HPHL_RX1 adb shell tinymix -D 0 "RX1 Digital Volume" 84 # 用测试音验证,-D 指定声卡,-d 指定 PCM 设备号 adb shell tinyplay /data/local/tmp/test.wav -D 0 -d 0SLIM_0_RX Channels决定下行通道数,单声道喇叭填One。RX1 MIX1 INP1是把 ADM 矩阵的输出接到哪个 mixer 输入。CLASS_H_DSM MUX选择 DSM 调制走哪路耳放。RX1 Digital Volume是数字音量,0 到 124 左右的范围,84 大概对应 0dB 附近,先给一个中等值避免过载。
手动能出声,说明硬件链路是好的,问题 100% 在 xml 或者 HAL 的设备选择逻辑上;手动也不出声,那就回到 3.3 和 3.4 继续查。这个二分法能省掉大量来回折腾。
软硬件匹配是最后一环,也是最容易被忽略的。同一份 dts 拿到不同硬件版本的板子上,可能出现 codec 型号不一样、功放型号不一样、甚至总线接法都不一样的情况。dts 里的compatible字符串、reg地址、qcom,*系列参数,都要和实际 BOM 对得上。
4. 配置落地:Device Tree、HAL device table 与 mixer_paths 怎么写
4.1 Device Tree:把硬件描述写对
dts 是 bringup 阶段改得最多也最容易改错的文件。codec 节点里每一行属性都会影响 probe 结果,所以改之前先搞清楚当前基线里这一份是给哪个硬件版本的。
/* SLIMbus 控制器,先确保控制器本身是 okay 的 */ &slimbus { status = "okay"; }; /* codec 节点,属性名随基线版本略有差异,以本地驱动为准 */ &wcd9335_codec { status = "okay"; compatible = "qcom,wcd9335-codec"; /* MIC 偏置电压,单位 mV,驻极体 MIC 需要,DMIC 不需要 */ qcom,cdc-micbias1-mv = <1800>; qcom,cdc-micbias2-mv = <1800>; /* codec 主时钟频率,配错会导致采样率整体偏移 */ qcom,cdc-mclk-clk-rate = <9600000>; /* 静态供电,名字必须和 regulator 节点里的定义完全一致 */ qcom,cdc-static-supplies = "cdc-vdd-buck", "cdc-vdd-tx-h"; };qcom,cdc-micbias1-mv只能在驱动支持的档位里选,写了个中间值驱动会直接报错退出。qcom,cdc-mclk-clk-rate要和音频子系统的时钟树对齐,配错的话表现是播放速度不对或者有杂音,而不是完全没声音,所以更容易被忽略。qcom,cdc-static-supplies里的字符串必须和 regulator 节点名字一模一样,差一个字符就是-EPROBE_DEFER无限循环。
4.2 HAL 层:device table 与 audio 相关的系统属性
HAL 里的 device table 负责把「上层要播到哪个设备」映射到「底层用哪条通路」。比如上层说AUDIO_DEVICE_OUT_SPEAKER,HAL 要能对应到 speaker 的那条 path 名字,再去查 xml 拿到完整的控件列表。这张表里漏一个设备,上层切过去就是静音。
系统属性这一层,bringup 时真正要动的通常是音效和语音相关的开关,而不是通路本身。属性名每个基线都不一样,以下是常见的一类:
| 属性 | 作用 | bringup 时怎么处理 |
|---|---|---|
| 音效类型开关 | 选择音效处理方案 | 先关掉,排除音效干扰 |
| 语音降噪开关 | 控制通话降噪 | 通话有杂音时逐个排查 |
| HAC 助听兼容 | 调整听筒频响 | 与主问题无关时开着即可 |
| 录音通道选择 | 指定默认录音设备 | 多 MIC 平台要对准主 MIC |
排查原则是先做减法:把能关的音效全关,确认干声通路通了,再一项项加回来。反过来做的话,永远分不清是通路问题还是音效处理问题。
4.3 mixer_paths.xml:一条通路到底写了什么
xml 的结构是按 path 名字组织的,每个 path 里是一串ctl和value对。这些ctl名字必须和tinymix打印出来的完全一致,包括空格和大小写。
<!-- 对应上层 AUDIO_DEVICE_OUT_SPEAKER 的一条通路 --> <path name="speaker"> <ctl name="SLIM RX1 MUX" value="AIF1_PB" /> <ctl name="SLIM_0_RX Channels" value="One" /> <ctl name="RX1 MIX1 INP1" value="RX1" /> <ctl name="CLASS_H_DSM MUX" value="DSM_HPHL_RX1" /> <ctl name="RX1 Digital Volume" value="84" /> </path>SLIM RX1 MUX的值AIF1_PB指的是这条通路从哪个 FE 端口取数据,改错了会变成「能打开但播的是另一路」。RX1 Digital Volume给的是默认值,实际播放时 HAL 会按音量档位覆盖,所以这里写太小不会导致静音,但写太大容易一上来就削顶。
改完 xml 要确认它真的进了设备上的那个分区。常见翻车是改了源码、编了镜像,但设备上跑的还是 vendor 分区里的旧版本,怎么重启都不生效。
# 确认设备上实际生效的 xml 和本地改的是不是一份 adb shell ls -l /vendor/etc/mixer_paths*.xml adb pull /vendor/etc/mixer_paths.xml ./mixer_paths_on_device.xml diff mixer_paths.xml ./mixer_paths_on_device.xmladb pull下来对比是最省事的验证方式。如果设备上这份和源码不一致,说明镜像没更新或者被 overlay 覆盖了,先把这一步解决,再去怀疑配置逻辑。
4.4 用 adb 验证通路:从 log 里看到端口起停
配置改完,验证不能只听声音。播放的时候抓一把 audio 相关 log,能看到 PCM 有没有打开、端口有没有 start、ADM 矩阵有没有配。
# 抓 AudioFlinger 和 HAL 的关键日志,播放时同步执行 adb logcat -c adb shell tinyplay /data/local/tmp/test.wav -D 0 -d 0 & adb logcat -d -s AudioFlinger:V AudioTrack:V audio_hw_primary:V | head -80AudioFlinger的 tag 能看到 stream 创建和 mixer thread 的调度;audio_hw_primary能看到 HAL 打开了哪条 path。如果 log 里出现pcm_open failed,那是内核侧拒绝,回去看 3.3;如果 HAL 说打开了但没有任何 BE 端口被 start,那问题在 xml 里的 FE/BE 映射。这套日志对照法比盲改参数可靠得多。
5. 避坑实录:声卡不注册、speaker 无声、mic 无输入的排查路径
5.1 声卡不注册:codec 探测到一半就退出
现象:/proc/asound/cards为空,dmesg 里能看到 codec 名字后面跟着一个负返回值,但看不出具体卡在哪一行。
原因:多数是总线通信失败或者依赖资源没就绪。手册里记录过两类:一类是总线上串的磁珠直流阻抗偏大,导致设备枚举时有时无;另一类是多个智能功放挂在同一条总线上,reg地址配重了,两个设备抢同一个 ID。
解决:先用示波器量总线的时钟和数据波形,看电平和边沿是否正常;再核对 dts 里每个 slave 的reg值是否唯一。临时验证可以短接磁珠,如果立刻好转,那问题就锁定了。
# 逐个看总线设备,正常应该能看到 codec 和每个功放各一条 adb shell ls /sys/bus/slimbus/devices/ adb shell ls /sys/bus/soundwire/devices/5.2 speaker 无输出:xml 改了但控件值没变
现象:mixer_paths.xml里明明改了音量,播放时用tinymix看控件值还是旧的。
原因:三个可能——xml 没进设备分区、控件名拼写和实际不一致、或者改的那条 path 根本不是 HAL 实际选中的那条。第三种最隐蔽,因为 path 名字对,但设备选择逻辑走了另一条分支。
解决:先adb pull下来 diff(见 4.3),排掉分区没更新的情况;再用tinymix打印全部控件名,和 xml 里逐条比对大小写和空格;最后在 log 里确认 HAL 实际打开的 path 名字是哪一条。
5.3 mic 无输入:录音全是底噪
现象:录音文件有底噪但没有任何人声,波形几乎是一条直线。
原因:按出现频率排,MICBIAS 电压没配、偏置电阻贴错、ADC 那条通路没在 mixer 里打开、DMIC 的时钟没使能。前两个是硬件,后两个是配置。
解决:先量 MICBIAS 引脚的实际电压,和 dts 里配的档位对一遍;再用tinycap直接录,绕开上层验证。
# 绕开上层直接录音,判断是通路问题还是应用问题 adb shell tinycap /data/local/tmp/mic.wav -D 0 -d 1 -c 1 -r 48000 -b 16参数里-d是 PCM 设备号,录音设备号和播放不一样,用/proc/asound/pcm确认。-c通道数,-r采样率,-b位深。录出来的文件如果是纯静音且完全没有底噪,那更可能是 ADC 通路没打开,而不是 MIC 没信号。
5.4 寄存器读写返回成功但没效果
现象:按手册命令写寄存器,命令返回 0 表示成功,但读回来还是原值或者行为没有任何变化。
原因:codec 内部寄存器大多是分页的,写之前要先写 page 寄存器;另外 SLIMbus 从设备和 SoundWire 从设备的读写接口完全不是一套,用错接口时命令本身不会报错,只是打到了错误的地方。
解决:先读一页已知的 ID 寄存器确认通道是通的,再按「写 page → 写地址 → 写数据」的顺序操作。手册里给的读写命令都是按总线类型分开的,别混着用。
# 读 codec 寄存器:先确认页,再读地址(具体节点名以本地驱动为准) adb shell "echo 0x1 > /sys/kernel/debug/wcd9xxx/reg_page" adb shell "cat /sys/kernel/debug/wcd9xxx/reg_addr" # 智能功放侧走 soundwire,接口和 slimbus 不同 adb shell ls /sys/bus/soundwire/devices/5.5 两个喇叭只响一个
现象:立体声播放时只有一侧有声音,另一侧完全静音,log 里没有任何报错。
原因:多功放方案里每个功放是一个独立的 SoundWire 从设备,reg/BusID 配重或者其中一个没有被正确枚举,都会表现成单边无声。另一种是 xml 里只写了左声道那条 path,右声道没配。
解决:先看总线设备数量和reg值,确认两颗都在;再看 xml 里对应立体声那条 path 是否两条通道都打开了。单边问题二分起来很快,交叉换喇叭和换板子各试一次就能定位是硬件还是配置。
6. ACDB 校准与 log 抓取:把无声问题定位到寄存器级
ACDB 是音频校准数据库,按「设备 ID + 通路」索引一组参数,codec 上电后由 ADSP 把对应数据写进寄存器。新增一个设备(比如换了一颗功放或者改了一路 MIC)时,要申请一个 device ID,再给它建一组 calibration data,否则那条通路用的是默认值,现象可能是音量偏小、频响不对或者干脆不工作。手册里新增设备的流程不复杂:先在工具里创建 device 并分配 ID,再把对应的 dts 和 HAL device table 里的名字对齐,最后写入校准数据。这中间最容易错的是 ID 和名字对不上——工具里叫一个名字,dts 里写另一个,加载时不会报错,就是静默地用默认值。
log 这块,kernel 层的dmesg只能看到驱动级别的信息,真正的通路细节在 QXDM 里。开启 audio 和 voice 的 log code 之后,能看到 AFE 端口什么时候 start、ADM 矩阵怎么配的、每个 PCM 的读写位置。排查无声问题,我一般按「PCM 是否 open → 数据是否 write → AFE 端口是否 start → codec 寄存器是否被写」这四步走,每一步在 log 里都有对应的记录,哪一步断了就停在哪。QXDM 抓下来的日志用 QCAT 离线分析,配合 log code 对照表查事件,比肉眼在 logcat 里翻快得多。
| 观察点 | 在哪看 | 说明 |
|---|---|---|
| PCM substream 状态 | /proc/asound/pcm | hw_ptr 不动说明没数据下去 |
| AFE 端口启停 | QXDM audio log code | 端口没 start 就是通路没配好 |
| codec 寄存器值 | debugfs 或 QXDM | 和校准数据比对,判断 ACDB 是否加载 |
| HAL path 选择 | logcataudio_hw_primary | 确认走的是哪条 xml path |
有个小技巧值得养成:任何一次改动之后,先跑一遍tinyplay加dmesg,把当前状态固化下来,再改下一处。血泪经验是同时改 dts、xml 和属性三处,结果好了不知道是哪一处起的作用,坏了也不知道是哪一处搞的。从那以后我每次碰 audio 配置都强制走一遍「单点改动 + 手动验证 + 记录」的流程,哪怕多花十分钟,也比后面回溯两小时强。这份手册我按上面的顺序重新排过,寄存器速查和排查流程放在一起对着看更顺,需要原件的按你平时的方式取一份就行。希望帮到你。
本文还有配套的精品资源,点击获取