20260311解决瑞芯微原厂RK3576的Android14刷入乐晓电子的K7开发板后耳机无声的问题【DTS】

20260311解决瑞芯微原厂RK3576的Android14刷入乐晓电子的K7开发板后耳机无声的问题【DTS】

2026/3/11 13:03

缘起:RK3576耳机无声排查

RK3576的原厂Android14,适配 乐晓电子的开发板K7

  1. 修改设备树(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 来匹配逻辑。

相关推荐
南棱笑笑生11 小时前
20260310让瑞芯微原厂RK3576的Android14刷入乐晓电子的K7开发板时禁止休眠+锁屏
rockchip
南棱笑笑生13 小时前
20260310解决瑞芯微原厂RK3576的Android14刷入乐晓电子的K7开发板后适配ADB连接
数据库·rockchip
南棱笑笑生1 个月前
20260127让天启AIO-3576Q38开发板跑Rockchip瑞芯微原厂的Buildroot【linux-6.1内核】【使用天启Firefly的DTS】
linux·运维·elasticsearch·rockchip
proware1 个月前
qt与egl的那些事儿
qt·rockchip·3588·egl
南棱笑笑生2 个月前
20260123让天启AIO-3576Q38开发板在天启Android14下打包Chromium浏览器
rockchip
南棱笑笑生2 个月前
20260123让天启AIO-3576Q38开发板在天启Buildroot下读写TF卡
linux·运维·服务器·rockchip
南棱笑笑生2 个月前
20260123让天启AIO-3576Q38开发板在天启Buildroot下适配摄像头模块8ms1m【预览】
java·前端·数据库·rockchip
南棱笑笑生2 个月前
20260116让天启AIO-3576Q38开发板在天启Android14下适配摄像头模块8ms1m为4K录像
rockchip
南棱笑笑生2 个月前
20260116让天启AIO-3576Q38开发板在天启Android14下适配摄像头模块8ms1m为8M拍照
rockchip