0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RK3576音频调试全纪录

jf_44130326 来源:Linux1024 2026-02-02 17:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式设备开发中,音频调试往往是牵一发而动全身的环节——既需要对齐硬件原理图的信号定义,又要适配软件层的codec配置、引脚映射和驱动逻辑。本文基于RK3576平台的实际调试场景,结合原理图关键信息与代码修改记录,拆解ES8388/ES8323 codec音频调试的完整流程,带你解决无声音、MIC不工作、耳机检测失效三大核心问题。

一、调试背景:明确硬件与核心问题

1.硬件基础

wKgZPGkanJmAcdzoAALDPtIKWCo807.png

本次调试的音频硬件架构如下,原理图核心标注需重点关注:

Codec芯片:采用ES8388(主codec)与ES8323(辅助codec),支持耳机输出、MIC输入、线路输入(Line In);

供电要求:原理图标注“the chip can adopt 1.8V poe supply”——Codec芯片支持1.8V供电,需确保电源轨稳定(避免因供电不足导致芯片异常);

接口定义

耳机接口:3-pole3极)设计,支持音频输出(无内置MIC引脚,需单独配置外置MIC或线路输入);

MIC接口:标注“MIC ORT JNO”,对应硬件上的主MIC输入通道;

控制引脚:包含耳机检测(HP_DET)、耳机控制(HP_CON)、线路输入检测(LINEIN_DET)等GPIO引脚。

2.初始问题清单

调试前设备存在三大音频问题,也是本次优化的核心目标:

1.无声音输出:耳机插入后无任何声音,Codec芯片未正确输出音频信号;

2.MIC录音失效:内置MIC无法捕获声音,录音文件为静音或底噪严重;

3.耳机/线路输入检测失效:插入耳机或线路输入设备,系统无任何硬件接入提示。

二、调试核心:硬件原理图与代码修改的对齐

音频调试的关键逻辑是硬件信号定义软件配置映射,以下按“HAL→ Codec配置设备树内核驱动的顺序,拆解每处修改与原理图的对应关系。

模块1TinyALSA HAL层配置(解决采样率不匹配导致的杂音/无声

HAL层是Android音频框架与底层硬件的桥梁,核心修改集中在采样率与音频参数适配。

代码修改(audio_hw.c/audio_hw.h

// 播放与录音的采样率从 48000Hz 改为 44100Hz-staticstructpcm_config pcm_config = {.rate =48000, .period_size =960};+staticstructpcm_config pcm_config = {.rate =44100, .period_size =256};-staticstructpcm_config pcm_config_in = {.rate =48000, .period_size =768};+staticstructpcm_config pcm_config_in = {.rate =44100, .period_size =256};// 默认播放采样率定义同步修改-#defineDEFAULT_PLAYBACK_SAMPLERATE 48000+#defineDEFAULT_PLAYBACK_SAMPLERATE 44100

为什么改?——与硬件codec能力对齐

原理图未明确标注采样率,但ES8388/ES8323芯片对44100Hz采样率的兼容性更好(尤其通话、普通音乐播放场景);

48000Hz采样率与部分音频通路(如MIC输入)的硬件时钟MCLK)不匹配,导致音频数据传输时出现丢帧,表现为无声或杂音;

缩小period_size(从960/768改为256):减少音频缓冲区大小,降低播放延迟,避免因缓冲区溢出导致的声音卡顿。

模块2ES8388 Codec配置(解决耳机无输出、MIC无录音

ES8388是主codec芯片,负责音频信号的编解码,修改集中在输出使能、音量控制、MIC输入通道选择

代码修改(es8388_config.h

// 1. 耳机输出使能:新增 OUT1 Switch 控制,打开耳机输出通道conststructconfig_control es8388_headphone_incall_controls[] = {+  {.ctl_name ="Output 1 Playback Volume", .int_val = {27,27}},// 耳机音量设置(27 为安全值,避免爆音)+  {.ctl_name ="OUT1 Switch", .int_val = {on}},// 使能 OUT1 输出(对应原理图耳机输出引脚)};// 2. MIC 输入配置:调整捕获音量、修正输入通道conststructconfig_control es8388_main_mic_capture_controls[] = {-  {.ctl_name ="Capture Digital Volume", .int_val = {192,192}},// 原音量过高,底噪严重+  {.ctl_name ="Capture Digital Volume", .int_val = {175,175}},// 降低音量,减少底噪-  {.ctl_name ="Left/Right Channel Capture Volume", .int_val = {8,8}},+  {.ctl_name ="Left/Right Channel Capture Volume", .int_val = {3,3}},// 进一步降低通道音量-  {.ctl_name ="Left PGA Mux", .str_val ="DifferentialL"},// 原通道选错,未对应硬件 MIC 引脚+  {.ctl_name ="Left PGA Mux", .str_val ="Line 2L"},// 切换到 Line 2L 通道(对应原理图 MIC 输入引脚)+  {.ctl_name ="Right PGA Mux", .str_val ="Line 2R"},// 右通道同步切换,适配立体声 MIC};

关键对齐:与原理图MIC /耳机接口匹配

OUT1 Switch使能:原理图中耳机输出信号连接到ES8388OUT1引脚,默认未打开该通道,导致耳机无声音;

MIC通道选择:原配置用“DifferentialL”通道,对应原理图的线路输入1Line 1),而实际MIC硬件连接到Line 2通道,导致“MIC插了但没走对应通路

音量调整:原192音量过高,超出MIC拾音范围,导致底噪严重,降至175后底噪消失且录音清晰。

模块3:设备树(DTS)修改(解决耳机/线路输入检测失效

设备树是硬件引脚与软件驱动的映射表,核心修改耳机检测、控制引脚,新增线路输入检测配置,完全对齐原理图引脚定义。

代码修改(rk3576-evb1.dtsi

es8388_sound: es8388-sound {-  hp-det-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_LOW>; // 原引脚与原理图不匹配+  hp-det-gpio = <&gpio2 RK_PA7 GPIO_ACTIVE_LOW>; // 改为原理图标注的耳机检测引脚(GPIO2_PA7)-  spk-con-gpio = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>; // 关闭扬声器控制(未使用)-  hp-con-gpio = <&gpio3 RK_PD6 GPIO_ACTIVE_HIGH>; // 原耳机控制引脚错误+  hp-con-gpio = <&gpio2 RK_PA6 GPIO_ACTIVE_HIGH>; // 改为原理图耳机控制引脚(GPIO2_PA6)+  linedet-gpio = <&gpio2 RK_PB0 IRQ_TYPE_EDGE_BOTH>; // 新增线路输入检测引脚(对应原理图 Line In 检测)  headphone {-    pinctrl-0 = <&hp_det>; // 原仅配置耳机检测引脚+    pinctrl-0 = <&hp_det>,<&linein_det>; // 新增线路输入检测引脚配置  };+  linein_key: linein-key { // 新增线路输入检测节点+    compatible = "linein-key";+    status = "okay";+  };};&pinctrl {  headphone {    hp_det: hp-det {-      rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>;+      rockchip,pins = <2 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>; // 对齐耳机检测引脚    };+    linein_det: linein-det { // 新增线路输入检测引脚配置+      rockchip,pins = <2 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>;+    };  };};// SAI 音频接口:修正数据输出引脚(对应 codec 数据输入)&sai1 {+  rockchip,sai-tx-route = <1 2 0 3>; // 调整 SAI 数据路由-  pinctrl-0 = <&sai1m0_sdo0>; // 原输出引脚错误+  pinctrl-0 = <&sai1m0_sdo2>; // 改为原理图 SAI 数据输出引脚(SDO2)};

为什么改?——引脚映射是检测功能的前提

耳机检测引脚错误:原用GPIO0_PD3,但原理图中耳机检测实际连接到GPIO2_PA7,导致系统无法感知耳机插入;

新增线路输入检测:原理图包含Line In接口,需配置GPIO2_PB0作为检测引脚,并添加对应的pinctrl配置;

SAI引脚修正SAI(串行音频接口)是CPUcodec传输音频数据的通道,原SDO0引脚未对应codecSDI输入,导致数据传输中断,修正为SDO2后音频流正常。

模块4:内核驱动修改(解决“codec初始化失败、检测中断无效

内核驱动负责codec芯片的硬件初始化、中断处理(如耳机插入检测),核心修改集中在ES8323驱动(辅助codec)和多codec管理逻辑。

4.1 ES8323驱动修正(es8323.c

// 1. 初始化寄存器配置:修正 DAC/ADC 供电与工作模式staticstructreg_default es8323_reg_defaults[] = {-  {0x04,0xc0},// 原 DAC 供电关闭+  {0x04,0x30},// 打开 DAC 供电(使能音频输出)-  {0x0a,0x00},// 原 ADC 配置错误+  {0x0a,0xf8},// 正确配置 ADC 采样模式-  {0x0b,0x06},// 原 DAC 模式错误+  {0x0b,0x82},// 正确配置 DAC 输出模式};// 2. 新增调试日志:定位 bias level 切换问题staticintes8323_set_bias_level(...){+  printk("xsc es8323_set_bias_level %drn", level);// 打印 bias 状态(ON/PREPARE/STANDBY/OFF) switch(level) { caseSND_SOC_BIAS_OFF:-    snd_soc_component_write(..., ES8323_DACPOWER,0xC0);// 原关闭 DAC 供电+    snd_soc_component_write(..., ES8323_DACPOWER,0x30);// 保持 DAC 供电(避免待机后无声音)   break;  }}// 3. 修正 probe 函数:初始化关键寄存器staticintes8323_probe(...){+  snd_soc_component_write(component,0x09,0x88);// 使能 ADC 输入+  snd_soc_component_write(component,0x35,0xA0);// 配置 MIC 偏置电压(对应原理图 1.8V 供电)+  es8323_set_bias_level(component, SND_SOC_BIAS_STANDBY);// 初始化为待机模式(而非 OFF)}

4.2codec管理逻辑(rockchip_multicodecs.c

// 1. 新增线路输入检测数据结构structmulticodecs_data {+  intlineinmic_gpio_pin;// 线路输入检测 GPIO+  intlineinmic_irq;// 线路输入中断号+  structdelayed_work lineinmic_handler;// 线路输入检测工作队列};// 2. 线路输入中断处理函数+staticvoidlineinmic_det_func(structwork_struct *work){+  lineinmicgpio_value = gpio_get_value(mc_data->lineinmic_gpio_pin);// 读取检测引脚电平+  // 高电平=未插入,低电平=插入,可根据实际需求调整+}// 3. 初始化线路输入检测staticintrk_multicodecs_probe(...){+  // 从设备树读取线路输入检测引脚+  mc_data->lineinmic_gpio_pin = of_get_named_gpio_flags(np,"linedet-gpio",0, &irq_flags);+  // 申请中断(上升沿+下降沿触发,支持插入/拔出检测)+  ret = devm_request_threaded_irq(..., mc_data->lineinmic_irq, ..., IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING);+  INIT_DEFERRABLE_WORK(&mc_data->lineinmic_handler, lineinmic_det_func);// 初始化工作队列}

关键作用:驱动是硬件功能的使能开关

ES8323供电修正:原驱动在待机(OFF)时关闭DAC供电,导致再次唤醒后codec无供电而无法工作,改为保持供电后解决唤醒无声音问题;

MIC偏置电压:新增0x35寄存器配置(0xA0),为MIC提供1.8V偏置电压(匹配原理图供电),否则MIC无法正常拾音;

线路输入中断:通过中断+工作队列实现线路输入的实时检测,插入/拔出时能及时通知系统,解决检测无响应问题。

三、调试踩坑与解决:5个关键问题的定位逻辑

1.问题1:耳机有声音但MIC无录音

排查:用tinymix工具查看MIC通道是否使能(tinymix | grep Capture),发现“Left PGA Mux”通道为“DifferentialL”

解决:对照原理图确认MIC连接到Line 2通道,修改es8388_config.h中的PGA Mux配置。

1.问题2:耳机插入无检测

排查:用cat /sys/class/gpio/gpioXXX/value读取原检测引脚(GPIO0_PD3)电平,插入耳机后无变化;

解决:查看原理图确认实际引脚为GPIO2_PA7,修改设备树后检测正常。

1.问题3:播放音频有杂音

排查:dmesg | grep pcm发现“underrun”日志(缓冲区欠载),采样率48000Hz时频繁出现;

解决:将采样率改为44100Hz,缩小period_size,减少缓冲区压力。

1.问题4:待机后唤醒无声音

排查:dmesg | grep es8323发现bias level切换到OFF模式,DAC供电被关闭;

解决:修改es8323.cOFF模式的DAC供电配置,保持供电不关闭。

1.问题5:线路输入无响应

排查:设备树未配置linedet-gpio,驱动无对应中断处理;

解决:添加线路输入检测引脚和中断逻辑,初始化工作队列。

四、调试验证:4步确认音频功能正常

1.播放验证

tinyplay /sdcard/test.wav -D 0 -d 0(用tinyplay工具播放测试音频,确认耳机有声音且无杂音);

2.录音验证

tinycap /sdcard/record.wav -D 0 -d 1 -c 2 -r 44100 -b 16(录音后播放,确认MIC拾音清晰);

3.检测验证

插入耳机:cat /sys/class/extcon/extcon0/state查看是否有“headphone”状态;

插入线路输入:cat /sys/class/lineinmic_class/lineinmic_gpio查看是否显示“in”

1.日志验证

dmesg | grep -i audio“error”“underrun”日志,dmesg | grep es8323显示bias level切换正常。

五、总结:RK3576音频调试的3个核心原则

1.硬件优先:所有软件修改必须对齐原理图(引脚、供电、通道),比如耳机检测引脚、MIC输入通道,错误的映射会导致功能完全失效;

2.分层排查:从HAL层(参数适配)→ Codec配置(通道/音量)设备树(引脚映射)内核驱动(初始化/中断),逐层定位,避免跨层调试;

3.日志辅助:在关键函数(如codec probebias level切换、中断处理)添加打印,快速定位哪一步没走通,比如bias切到OFF导致无供电。

音频调试看似复杂,但只要将硬件信号软件配置一一对应,再结合日志排查,就能逐步解决问题。希望本文的调试思路,能为你在RK平台或其他嵌入式设备的音频开发中提供参考。

# RK3576平台音频调试全纪录:从原理图到代码,解决无声音、MIC失效、耳机检测难题


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5209

    文章

    20625

    浏览量

    336767
  • 音频
    +关注

    关注

    31

    文章

    3224

    浏览量

    86278
  • rk3576
    +关注

    关注

    1

    文章

    292

    浏览量

    1668
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于RK3576开发板的PWN使用说明

    RK3576开发板使用PWN教程及Demo
    的头像 发表于 05-07 14:07 2478次阅读
    基于<b class='flag-5'>RK3576</b>开发板的PWN使用说明

    基于RK3576开发板的人脸识别算法

    RK3576开发板展示人脸识别算法例程和API说明
    的头像 发表于 05-07 16:48 2906次阅读
    基于<b class='flag-5'>RK3576</b>开发板的人脸识别算法

    【米尔RK3576开发板评测】带你初步了解米尔RK3576这块开发板

    输出。 8、RK3576还对双屏同显异显支持良好,可驱动商显,工业120HZ 4K HDMI屏,LVDS 1080p屏。 9、自带RECOVERY一键恢复出厂设置,方便测试调试。 10、是定昌目前极具
    发表于 12-18 20:35

    【米尔RK3576开发板评测】+项目名称【米尔RK3576开发板评测】一个视频和你共同认识一下米尔RK3576开发板

    RK3576还对双屏同显异显支持良好,可驱动商显,工业120HZ 4K HDMI屏,LVDS 1080p屏。 9、自带RECOVERY一键恢复出厂设置,方便测试调试。 10、是定昌目前极具价格优势
    发表于 12-18 20:50

    米尔RK3576RK3588怎么选?-看这篇就够了

    4通道以及双DP v1.3嵌入USB 3.1且带有音频和HDCP2.x。 摄像头视频输入对比 RK3576支持最高16MPixel ISP带有HDR和3DNR RK3588配备48M Pixel
    发表于 12-27 11:44

    【米尔RK3576开发板评测】+项目名称值得购买的米尔RK3576开发板

    更多可玩性。 米尔RK3576的扩展板也非常不错。尺寸120x90mm,高度17.8mm 带有3.5mm音频接口,MiniDP,HDMI显示输出接口,两个USB3.0接口,两个千兆网口。 RTC电池
    发表于 01-08 22:59

    RK3576 vs RK3588:为何越来越多的开发者转向RK3576

    瑞芯微(Rockchip)最新发布的 RK3576 一经推出,就吸引了大量原本关注 RK3588 的开发者。RK3588 作为旗舰级芯片,性能固然强大,但 RK3576 凭借其超高的能
    发表于 05-30 08:46

    Mpp支持RK3576

    想问下,https://github.com/rockchip-linux/mpp这里面支持RK3576么,看介绍没有提到说支持RK3576 目前是买了个rk3576的机顶盒,搭载了安卓14,想做安卓视频硬解。
    发表于 06-13 15:35

    【作品合集】米尔RK3576开发板测评

    】米尔RK3576开发板免费试用 作者:EPTmachine【米尔RK3576开发板免费体验】1、开发环境、镜像烧录、QT开发环境搭建以及应用部署 【米尔RK3576开发板免费体验】2、板载麦克风和
    发表于 09-11 10:19

    新品体验 | RK3576开发板

    前言:RK3576作为瑞芯微第二代8nm高性能AIOT平台,一经推出便获得了极大的关注。广州眺望电子科技有限公司是一家专注于嵌入式处理器模组研发与应用的国家高新技术企业,目前公司已推出的相关型号有
    的头像 发表于 11-01 08:08 3375次阅读
    新品体验 | <b class='flag-5'>RK3576</b>开发板

    RK3576单板发布倒计时:RK3399与RK3576对比

    好多人说RK3576RK3399的升级版,某种程度上也可以这么说,RK3576在强大的多媒体功能的基础上,性能和接口都进行了升级 一、工艺 性能 rk3576采用 Rockchip
    的头像 发表于 12-03 16:59 2747次阅读
    <b class='flag-5'>RK3576</b>单板发布倒计时:<b class='flag-5'>RK</b>3399与<b class='flag-5'>RK3576</b>对比

    RK3588与RK3576区别解析

    以下是RK3576RK3588对比: 电鱼电子SBC-RK3576单板 核心性能:RK3576为四核A72@2.2GHz + 四核A53@1.8GHz + M0协处理器,算力 58K
    的头像 发表于 12-17 14:03 4352次阅读
    <b class='flag-5'>RK</b>3588与<b class='flag-5'>RK3576</b>区别解析

    瑞芯微RK3576RK3576S有什么区别,性能参数配置与型号差异解析

    瑞芯微第二代8nm高性能AIOT平台RK3576家族再添新成员-RK3576S,先说结论:相较主型号的RK3576/RK3576J,性能略有缩减,而功耗有所降低。主要应用于商显终端、智
    的头像 发表于 08-14 23:57 2672次阅读
    瑞芯微<b class='flag-5'>RK3576</b>与<b class='flag-5'>RK3576</b>S有什么区别,性能参数配置与型号差异解析

    迅为如何在RK3576上部署YOLOv5;基于RK3576构建智能门禁系统

    迅为如何在RK3576开发板上部署YOLOv5;基于RK3576构建智能门禁系统
    的头像 发表于 11-25 14:06 1952次阅读
    迅为如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>构建智能门禁系统

    迅为RK3576对比RK3568:AI算力与接口的全面跃迁

    迅为RK3576对比RK3568:AI算力与接口的全面跃迁
    的头像 发表于 12-22 15:24 2384次阅读
    迅为<b class='flag-5'>RK3576</b>对比<b class='flag-5'>RK</b>3568:AI算力与接口的全面跃迁