20260311解决瑞芯微原厂RK3576的Android14刷入乐晓电子的K7开发板后耳机无声的问题【DTS】
2026/3/11 13:03
缘起:RK3576耳机无声排查
RK3576的原厂Android14,适配 乐晓电子的开发板K7
- 修改设备树(DTS)配置
除了驱动,设备树中的音频路由配置也很重要。查看你的设备树文件(通常在kernel/arch/arm64/boot/dts/rockchip/下对应的.dts文件):
dts
&es8388 {
status = "okay";
#sound-dai-cells = <0>;
};
&sound {
compatible = "rockchip,audio";
model = "rockchip-es8388";
rockchip,audio-routing =
"Headphone", "LOUT1", /* 耳机输出路由到左通道 */
"Headphone", "ROUT1", /* 耳机输出路由到右通道 */
"Speaker", "SPKOUT", /* 扬声器输出(如果有) */
"MIC1", "Main Mic", /* 主麦克风 */
"MIC2", "Headset Mic"; /* 耳机麦克风 */
/* 确保 I2S 通道数正确 */
rockchip,i2s-controller = <&i2s0>;
rockchip,pinctrl-names = "default";
rockchip,pinctrl-0 = <&i2s0_mclk &i2s0_sclk &i2s0_lrck &i2s0_sdi &i2s0_sdo0>;
};
关键检查点:
rockchip,audio-routing 中必须包含 "Headphone", "LOUT1" 和 "Headphone", "ROUT1"
I2S通道数配置(默认应为1,对应单数据线)

直接将K7的buildroot中的DTS的es8388声卡部分搬过来!
Y:\k7_rk3576-linux_20251021\kernel-6.1\arch\arm64\boot\dts\rockchip\rk3576-kickpi-k7.dtsi
Y:\orig_RK3576+Android14\kernel-6.1\arch\arm64\boot\dts\rockchip\rk3576-evb1.dtsi
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
*
*/
#include <dt-bindings/usb/pd.h>
#include "rk3576-evb.dtsi"
#include "rk3576-rk806.dtsi"
/ {
es8388_sound: es8388-sound {
status = "okay";
compatible = "rockchip,multicodecs-card";
rockchip,card-name = "rockchip-es8388";
hp-det-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_LOW>;
io-channels = <&saradc 3>;
io-channel-names = "adc-detect";
keyup-threshold-microvolt = <1800000>;
poll-interval = <100>;
spk-con-gpio = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>;
hp-con-gpio = <&gpio3 RK_PD6 GPIO_ACTIVE_HIGH>;
rockchip,pre-power-on-delay-ms = <30>;
rockchip,post-power-down-delay-ms = <40>;
rockchip,format = "i2s";
rockchip,mclk-fs = <256>;
rockchip,cpu = <&sai1>;
rockchip,codec = <&es8388>;
rockchip,audio-routing =
"Headphone", "LOUT1",
"Headphone", "ROUT1",
"Speaker", "LOUT2",
"Speaker", "ROUT2",
"Headphone", "Headphone Power",
"Headphone", "Headphone Power",
"Speaker", "Speaker Power",
"Speaker", "Speaker Power",
"LINPUT1", "Main Mic",
"LINPUT2", "Main Mic",
"RINPUT1", "Headset Mic",
"RINPUT2", "Headset Mic";
pinctrl-names = "default";
pinctrl-0 = <&hp_det>;
play-pause-key {
label = "playpause";
linux,code = <KEY_PLAYPAUSE>;
press-threshold-microvolt = <2000>;
};
};
修改为:
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
*
*/
#include <dt-bindings/usb/pd.h>
#include "rk3576-evb.dtsi"
#include "rk3576-rk806.dtsi"
/ {
es8388_sound: es8388-sound {
status = "okay";
compatible = "rockchip,multicodecs-card";
rockchip,card-name = "rockchip-es8388";
hp-det-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>;
io-channels = <&saradc 3>;
io-channel-names = "adc-detect";
keyup-threshold-microvolt = <1800000>;
poll-interval = <100>;
spk-con-gpio = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>;
//hp-con-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>;
rockchip,pre-power-on-delay-ms = <30>;
rockchip,post-power-down-delay-ms = <40>;
rockchip,format = "i2s";
rockchip,mclk-fs = <256>;
rockchip,cpu = <&sai1>;
rockchip,codec = <&es8388>;
rockchip,audio-routing =
"Headphone", "LOUT1",
"Headphone", "ROUT1",
"Speaker", "LOUT2",
"Speaker", "ROUT2",
//"Headphone", "Headphone Power",
//"Headphone", "Headphone Power",
"Speaker", "Speaker Power",
"Speaker", "Speaker Power",
"LINPUT1", "Main Mic",
"LINPUT2", "Main Mic",
"RINPUT1", "Headset Mic",
"RINPUT2", "Headset Mic";
pinctrl-names = "default";
pinctrl-0 = <&hp_det>;
play-pause-key {
label = "playpause";
linux,code = <KEY_PLAYPAUSE>;
press-threshold-microvolt = <2000>;
};
};

GPIO0_D3_d HP_DET_L [37]


EVB1

解析:
RK3576 Android14 DTS解析
RK3576的Android14的DTS代码块,请 解析一下
/ {
es8388_sound: es8388-sound {
status = "okay";
compatible = "rockchip,multicodecs-card";
rockchip,card-name = "rockchip-es8388";
hp-det-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>;
io-channels = <&saradc 3>;
io-channel-names = "adc-detect";
keyup-threshold-microvolt = <1800000>;
poll-interval = <100>;
spk-con-gpio = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>;
//hp-con-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>;
rockchip,pre-power-on-delay-ms = <30>;
rockchip,post-power-down-delay-ms = <40>;
rockchip,format = "i2s";
rockchip,mclk-fs = <256>;
rockchip,cpu = <&sai1>;
rockchip,codec = <&es8388>;
rockchip,audio-routing =
"Headphone", "LOUT1",
"Headphone", "ROUT1",
"Speaker", "LOUT2",
"Speaker", "ROUT2",
//"Headphone", "Headphone Power",
//"Headphone", "Headphone Power",
"Speaker", "Speaker Power",
"Speaker", "Speaker Power",
"LINPUT1", "Main Mic",
"LINPUT2", "Main Mic",
"RINPUT1", "Headset Mic",
"RINPUT2", "Headset Mic";
pinctrl-names = "default";
pinctrl-0 = <&hp_det>;
play-pause-key {
label = "playpause";
linux,code = <KEY_PLAYPAUSE>;
press-threshold-microvolt = <2000>;
};
};
我们被问到:"RK3576的Android14的DTS代码块,请 解析一下"。给出了一个设备树源文件片段,描述了一个名为es8388_sound的节点。需要解析这个DTS代码块。需要解释各个属性,以及它们在音频子系统中的作用。可能还需要说明这是针对Rockchip RK3576平台的,Android 14的音频设备树配置。
我们将以中文回答,逐步解析每个属性和其含义,以及整体的作用。同时注意注释部分和可能的用途。
需要说明:这是描述音频编解码器(ES8388)及其与SoC(通过SAI1)的连接,包括耳机检测、扬声器控制、音频路由、按键处理等。
我们还应提到这些属性如何影响音频驱动行为,以及可能的硬件连接。
注意:有一些被注释掉的行,我们也可以提一下。
解析要清晰、有条理。
该DTS代码块是为Rockchip RK3576平台在Android 14环境下配置音频子系统的设备树节点,具体定义了ES8388音频编解码器(Codec)的绑定信息。下面逐项解析其含义:
节点名称与状态
es8388_sound: es8388-sound:节点标签为es8388_sound,名称是es8388-sound,通常表示一个音频声卡设备。
status = "okay":启用该设备。
兼容性与基础配置
compatible = "rockchip,multicodecs-card":指定驱动兼容性,表明这是一个多编解码器声卡(虽然这里只用了ES8388一个Codec),Rockchip平台使用此字符串匹配对应的ASoC(ALSA System on Chip)声卡驱动。
rockchip,card-name = "rockchip-es8388":定义声卡名称,将在系统中显示,如/proc/asound/cards。
硬件连接与控制
hp-det-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>:耳机插入检测GPIO,连接到GPIO0的PD3引脚,高电平有效。驱动可通过此引脚判断耳机是否插入。
io-channels = <&saradc 3>:引用ADC通道3(SARADC),用于检测耳机按键或插头类型(如OMTP/CTIA)。通过读取ADC电压值来识别按键动作。
io-channel-names = "adc-detect":指定该ADC通道的用途名称,方便驱动获取。
keyup-threshold-microvolt = <1800000>:按键抬起时的电压阈值(微伏),当ADC检测值高于此值时认为无按键按下。
poll-interval = <100>:轮询间隔(毫秒),用于定期读取ADC值检测按键(若使用中断则无需轮询)。
spk-con-gpio = <&gpio2 RK_PB1 GPIO_ACTIVE_HIGH>:扬声器使能控制GPIO,连接到GPIO2的PB1,高电平开启扬声器功放。
//hp-con-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>:被注释掉的耳机电源控制GPIO,可能硬件未使用或改用其他方式。
音频时序与接口
rockchip,pre-power-on-delay-ms = <30>:上电前延迟30ms,确保电源稳定。
rockchip,post-power-down-delay-ms = <40>:下电后延迟40ms,避免瞬间冲击。
rockchip,format = "i2s":音频总线格式为I2S。
rockchip,mclk-fs = <256>:主时钟频率与采样率的倍数,即MCLK = 256 * fs,常见值。
rockchip,cpu = <&sai1>:指向CPU侧的I2S控制器(SAI1,即Serial Audio Interface 1),负责音频数据传输。
rockchip,codec = <&es8388>:指向外部音频编解码器节点(ES8388),该节点应在DTS其他部分定义,包含其I2C地址、时钟等信息。
音频路由
rockchip,audio-routing:定义音频路径连接,将DAPM(Dynamic Audio Power Management)组件连接起来。格式为"源端", "目的端"。这里包含:
耳机输出路径:LOUT1和ROUT1连接到"Headphone"。
扬声器输出路径:LOUT2和ROUT2连接到"Speaker"。
电源域:为扬声器供电("Speaker Power"出现两次,可能对应左右声道电源)。
麦克风输入:左线路输入(LINPUT1/2)连接到主麦克风("Main Mic"),右线路输入(RINPUT1/2)连接到耳机麦克风("Headset Mic")。这通常用于区分内部麦克风和耳机麦克风。
引脚控制
pinctrl-names = "default":引脚控制状态名称。
pinctrl-0 = <&hp_det>:默认状态下应用hp_det引脚配置(应在别处定义,将GPIO0_PD3复用为普通GPIO用于检测)。
按键子节点
play-pause-key:定义通过ADC检测的播放/暂停按键。
label = "playpause":按键标签。
linux,code = <KEY_PLAYPAUSE>:上报的Linux输入事件码,对应播放/暂停键。
press-threshold-microvolt = <2000>:按键按下时的电压阈值,当ADC值低于此阈值时认为按键按下(通常与keyup-threshold配合判断)。
总结
该DTS节点完整配置了一个基于ES8388的音频声卡,实现了:
耳机插拔检测(GPIO)
耳机按键识别(ADC)
扬声器硬件使能(GPIO)
I2S数字音频接口连接
音频路径路由(播放、录音)
电源管理时序
输入设备上报(用于媒体键)
在RK3576 + Android 14系统中,该节点会被Linux内核的ASoC框架解析,驱动(如rockchip_multicodecs.c和es8388.c)根据这些配置初始化硬件并创建ALSA声卡设备,上层应用即可通过标准音频接口进行播放和录音。
这个配置,耳机插入前GPIO3D3为高还是低?
插入后呢?
我们被问到"耳机插入前GPIO3D3为高还是低?插入后呢?"。但注意DTS代码中耳机检测引脚是hp-det-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>;,这是GPIO0的PD3,不是GPIO3D3。可能提问者误写了。所以我们要基于给定的配置分析。
解析:hp-det-gpio使用了GPIO0 PD3,指定了GPIO_ACTIVE_HIGH。这通常表示当检测到耳机插入时,该GPIO引脚变为高电平(active high)。但我们需要确认插孔类型。常见耳机插孔检测机制:通常有一个机械开关,插入时会使引脚接地或拉高。GPIO_ACTIVE_HIGH 意味着驱动认为"插入"状态对应的GPIO电平为高。硬件设计可能是:未插入时引脚为低(如内部下拉或悬空),插入时开关连接到高电平(如VCC),所以插入后变为高。但也不一定,也可能硬件设计为插入后接地(低电平),但驱动通过GPIO_ACTIVE_HIGH属性取反逻辑。通常GPIO_ACTIVE_HIGH表示物理高电平表示"激活"状态,即插入有效。
所以:
耳机插入前:根据硬件设计,如果未插入时开关断开,引脚可能被内部或外部电阻拉低(或悬空,需外部上拉/下拉)。由于驱动标注了ACTIVE_HIGH,驱动会在检测到高电平时认为插入。因此通常未插入时是低电平。
插入后:变为高电平。
但还需考虑可能存在上拉或下拉电阻。一般地,若ACTIVE_HIGH,则插入后引脚应为高。所以回答:插入前低,插入后高。
但提问者说"GPIO3D3",而实际是GPIO0_PD3,可能是个笔误。我们可指出这一点。
我们需给出答案,并说明基于DTS配置的解释。
根据设备树配置,耳机检测使用的是 hp-det-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_HIGH>;,即 GPIO0 的 PD3 引脚,不是 GPIO3D3(可能是笔误)。
GPIO_ACTIVE_HIGH 表示该引脚高电平有效,即当耳机插入时,驱动期望检测到高电平。
因此硬件设计上,未插入耳机时引脚应为低电平(例如内部下拉或外部拉低),插入后开关将引脚拉高,变为高电平。
结论:
插入前:低电平
插入后:高电平
若硬件实际电路相反(插入后为低),则需调整设备树中的 GPIO_ACTIVE_HIGH 为 GPIO_ACTIVE_LOW 来匹配逻辑。

