rk3588 适配音频解码芯片 es8388

rk3588 适配音频解码芯片 es8388

在 RK3588 这种高性能 SoC 平台上,选择 ES8388 作为音频解码芯片(Audio Codec)是一个非常经典且平衡的选择。这种组合在嵌入式开发、单板计算机(如 Orange Pi, Rock 5B 等)以及工业控制领域非常常见。使用 ES8388 的主要优点:

1. 成本效益极高 (Cost-Effectiveness)

ES8388 是一款国产(苏州顺芯)的高性能、低功耗立体声音频 Codec。

  • 低单价: 相比于瑞昱(Realtek)或德州仪器(TI)的同类芯片,ES8388 的采购成本极具竞争力。
  • 外围电路简单: 它的集成度高,需要的电容、电阻等被动器件较少,能有效降低整体 BOM 成本。

2. 成熟的驱动支持 (Driver Maturity)

由于 ES8388 在 Rockchip 平台(从 RK3288, RK3399 到现在的 RK3588)上已经使用了多年,其驱动程序极其稳定:

  • 原生支持: Rockchip 的 SDK(Linux 内核、Android)中已经包含了完善的 ES8388 驱动。
  • 调试门槛低: 开发者在配置 Device Tree (DTS) 时,可以直接参考官方示例,基本能实现"开箱即用",极大缩短了研发周期。

3. 接口匹配度高 (Interface Compatibility)

ES8388 的硬件接口与 RK3588 的音频控制器完美对齐:

  • I2S/PCM: 支持标准的 I2S 接口,能够轻松处理多采样率的音频数据。
  • I2C 控制: 通过标准的 I2C 接口进行寄存器配置,逻辑清晰。
  • 录播一体: 具备 2 通道 ADC(录音)和 2 通道 DAC(播放),正好满足大多数通用设备对接耳机、麦克风的需求。

4. 功耗控制出色 (Low Power Consumption)

RK3588 虽然性能强劲,但在移动设备或嵌入式网关中,功耗依然是关键指标。

  • ES8388 设计初衷即包含便携式应用,具备多种省电模式(Power Management)。
  • 在非活动状态下,可以按模块关闭模拟/数字电路,非常适合对散热和续航有要求的 RK3588 终端。

5. 功能实用,覆盖主流需求

对于大多数 RK3588 的应用场景(如 AI 盒子、边缘计算服务器、商显屏),ES8388 提供的功能已经足够:

  • 支持多重模拟增益调节: 方便适配不同灵敏度的麦克风。
  • 内置混音器: 支持灵活的音频路径路由。

作者:炭烤毛蛋 ,点击博主了解更多。


文章目录

  • [rk3588 适配音频解码芯片 es8388](#rk3588 适配音频解码芯片 es8388)
      • [1. 成本效益极高 (Cost-Effectiveness)](#1. 成本效益极高 (Cost-Effectiveness))
      • [2. 成熟的驱动支持 (Driver Maturity)](#2. 成熟的驱动支持 (Driver Maturity))
      • [3. 接口匹配度高 (Interface Compatibility)](#3. 接口匹配度高 (Interface Compatibility))
      • [4. 功耗控制出色 (Low Power Consumption)](#4. 功耗控制出色 (Low Power Consumption))
      • [5. 功能实用,覆盖主流需求](#5. 功能实用,覆盖主流需求)
  • [1. rk3588 es8388 原理图](#1. rk3588 es8388 原理图)
    • [1.1 ES8388 核心原理图](#1.1 ES8388 核心原理图)
    • [1.2 ES8388 HP](#1.2 ES8388 HP)
      • [1.2.1 耳机供电](#1.2.1 耳机供电)
      • [1.2.2 耳机关键元件](#1.2.2 耳机关键元件)
    • [1.3 ES8388 电源汇总](#1.3 ES8388 电源汇总)
    • [1.4 es8388 电源流向图](#1.4 es8388 电源流向图)
  • [2. rk3588 es8388 内核配置](#2. rk3588 es8388 内核配置)
    • [2.1 RK3588 ↔ ES8388](#2.1 RK3588 ↔ ES8388)
      • [2.1.1🔌 RK3588 ↔ ES8388 物理连接示意图](#2.1.1🔌 RK3588 ↔ ES8388 物理连接示意图)
      • [2.1.2 RK3588 ↔ ES8388 音频数据通道 (I2S 总线)](#2.1.2 RK3588 ↔ ES8388 音频数据通道 (I2S 总线))
      • [2.1.3 RK3588 ↔ ES8388 控制配置通道 (I2C 总线)](#2.1.3 RK3588 ↔ ES8388 控制配置通道 (I2C 总线))
      • [2.1.4 RK3588 ↔ ES8388 同步基准主时钟(MCLK)](#2.1.4 RK3588 ↔ ES8388 同步基准主时钟(MCLK))
      • [2.1.5 RK3588 ↔ ES8388 辅助控制信号 (GPIO to CE)](#2.1.5 RK3588 ↔ ES8388 辅助控制信号 (GPIO to CE))
      • [2.1.6 模拟音频输入/输出](#2.1.6 模拟音频输入/输出)
    • [2.2 rk3588 ES8388 内核设备树](#2.2 rk3588 ES8388 内核设备树)
  • [3. rk3588 es8388 HAL 配置](#3. rk3588 es8388 HAL 配置)
  • 结语

1. rk3588 es8388 原理图

1.1 ES8388 核心原理图

根据 ES8388 的原理图,对 ES8388 音频编解码器及其相关电路的供电方案进行分析。

1.1.1 ES8388 核心供电网络

从第一张原理图可以看出,ES8388 使用了三组主要的电源网络:

网络标签 典型电压 作用域 对应ES8388引脚(推测)
VCCA1V8_CDDEC 1.8V 数字核心 / 数字IO 电源(DVDD) 引脚 2 (DVDD) 或 3 (PVDD)
VCCA3V3_CDDEC 3.3V 数字IO / 模拟电源(AVDD) 引脚 17 (AVDD)
AVDD3V3_CDDEC 3.3V 模拟电源(AVDD) 引脚 17 (AVDD)

注意:AVDD3V3_CDDECVCCA3V3_CDDEC 可能是同一网络的不同命名,或者通过磁珠/电阻单点连接。原理图中两者同时出现,通常表示模拟和数字 3.3V 分开走线,最终在芯片附近汇合。

1.1.2 电源去耦与滤波电路

1) 1.8V 电源(VCCA1V8_CDDEC)
  • 去耦电容
    • C176(4.7µF,X5R,16V)------ 大容量储能,滤除低频纹波
    • C156(100nF,X5R,16V)------ 滤除中高频噪声
    • C127(100nF,X5R,16V)------ 靠近芯片引脚放置
  • 布局特点:大小电容并联,覆盖宽频段干扰。
2) 3.3V 模拟电源(AVDD3V3_CDDEC / VCCA3V3_CDDEC)
  • 去耦电容
    • C153(4.7µF,X5R,10V)
    • C145(100nF,X5R,10V)
    • 另外在芯片 Analog supply 区域附近还标注了 C133C161 等多个电容(值未完全给出,推测为 100nF 或 1µF)
  • 隔离电阻R113(4.7Ω,5%)------ 通常用作 RC 低通滤波电源隔离,与电容组成 π 型滤波,防止数字噪声窜入模拟电源。

1.2 ES8388 HP

1.2.1 耳机供电

耳机部分原理图主要围绕耳机座(CTIA 标准)和检测电路,涉及以下供电:

网络 电压 用途
VCCA3V3_CODECO 3.3V 为耳机放大器或检测电路提供电源
VCC_1V8_S0 1.8V 为电平转换、MOSFET 栅极控制或上拉提供逻辑电压

1.2.2 耳机关键元件

  • HP_DET_L :耳机插入检测信号,通过电阻 R134(100kΩ)上拉至 VCC_1V8_S0,默认高电平;插入时被耳机插座的机械开关拉低,产生中断。
  • MIC 偏置 :麦克风偏置电压通常由 ES8388 内部提供(MICBIAS),无需外部供电。图中未直接显示,但通过 INPPHONEMIC 网络连接至芯片。
  • 输出耦合LOUT1ROUT1 通过电容 C193(22µF)、C202(22µF)耦合到耳机座,这些电容的耐压(6.3V或10V)高于音频交流摆幅,正常工作。
  • ESD 保护Q22Q233(WNM2016-3 / WMM2016-3)可能是 低电容 TVS 二极管阵列MOSFET 开关 ,用于耳机接口的静电保护和信号切换。其供电由 VCC_1V8_S0 提供。

1.3 ES8388 电源汇总

电源轨 电压 主要负载 去耦方式 备注
VCCA1V8_CDDEC 1.8V ES8388 数字核心 4.7µF + 100nF 低噪声,避免与模拟地耦合
VCCA3V3_CDDEC 3.3V ES8388 数字IO 未明确(可能与模拟共用) 建议加磁珠与模拟电源隔离
AVDD3V3_CDDEC 3.3V ES8388 模拟电路(ADC/DAC/PLL) 4.7µF + 100nF + 4.7Ω RC 关键:需极低纹波,建议 LC 或 π 型滤波
VCCA3V3_CODECO 3.3V 耳机检测、外部开关 100nF(C209) 可与 AVDD 同源,但需单独滤波
VCC_1V8_S0 1.8V 上拉电阻、MOSFET 逻辑 100nF(C200) 可由系统 1.8V LDO 提供

1.4 es8388 电源流向图

复制代码
系统电源
   ├─ 1.8V LDO ──┬─ VCCA1V8_CDDEC ──→ ES8388 DVDD/PVDD
   │             └─ VCC_1V8_S0   ──→ 耳机检测上拉、ESD保护逻辑
   └─ 3.3V LDO ──┬─ AVDD3V3_CDDEC ──(4.7Ω+4.7µF+100nF)──→ ES8388 AVDD
                 └─ VCCA3V3_CODECO ──(100nF)──→ 耳机座供电、检测电路

2. rk3588 es8388 内核配置

ES8388 典型工作流程

  1. 系统启动:RK3588 通过 I2C 总线配置 ES8388 的寄存器,设置采样率、数据格式、音频通路(例如将麦克风输入路由到 ADC,将 DAC 输出路由到耳机)。
  2. 播放音乐:RK3588 通过 I2S 总线持续发送 PCM 音频数据;ES8388 接收后转换为模拟信号输出。
  3. 调节音量:用户滑动音量条 → RK3588 通过 I2C 总线写入 ES8388 的音量控制寄存器,实时改变放大增益。
  4. 切换场景:插入耳机 → RK3588 检测到 GPIO 中断 → 通过 I2C 总线重新配置 ES8388 的输出路由(关闭扬声器、开启耳机放大器)。

🧠 I2S I2C 两条总线如何协同工作?

总线 职责 数据方向 数据量 实时性要求
I2S 传输音频数据 双向全双工 高(每秒几兆位) 极高(必须连续)
I2C 传输控制命令 主→从(读写) 低(字节级) 低(可容忍毫秒级延迟)
两条总线各司其职,互不干扰,共同实现了完整且灵活的音频系统。

2.1 RK3588 ↔ ES8388

2.1.1🔌 RK3588 ↔ ES8388 物理连接示意图

ES8388 音频编解码器
RK3588 SoC
I2S 总线

(含BCLK/LRCK/SDO/SDI)
I2C 总线

(含SCL/SDA)
MCLK 主时钟
GPIO → CE
I2S 控制器

(音频数据接口)
I2C 控制器

(音频控制接口)
通用输入输出
主时钟输出
I2S 从接口

(音频数据收发)
I2C 从接口

(寄存器配置)
控制使能引脚
主时钟输入
模拟音频输入/输出

麦克风/扬声器/耳机
麦克风
扬声器/耳机

在这个物理连接图中,我们将 I2SI2C 分别视为两条独立且完整的总线,不再拆分成具体的信号线(如BCLK、LRCK、SDO、SDI 或 SCL、SDA)。这样更便于理解两个芯片之间的"接口级"关系。

2.1.2 RK3588 ↔ ES8388 音频数据通道 (I2S 总线)

  • 角色定位 :RK3588 作为 I2S 主设备(Master) ,ES8388 作为 I2S 从设备(Slave)
  • 传输内容:数字音频流(PCM 数据)。
  • 方向双向全双工
    • 播放方向:RK3588 → ES8388(DAC 数据,用于扬声器/耳机)
    • 录音方向:ES8388 → RK3588(ADC 数据,来自麦克风)
  • 物理实现 :在硬件设计上,I2S 总线实际由 4 条独立信号线 组成,但在本图抽象为一条总线:
    • SCLK(位时钟):由 RK3588 产生,同步每个数据位。
    • LRCK(左右声道时钟):由 RK3588 产生,指示当前数据属于左声道还是右声道。
    • SDO(数据输出):RK3588 播放数据输出到 ES8388。
    • SDI(数据输入):ES8388 录音数据输入到 RK3588。
  • 典型参数:采样率 8kHz ~ 192kHz,位深度 16bit/24bit/32bit,BCLK 频率 = 采样率 × 位深 × 通道数。

2.1.3 RK3588 ↔ ES8388 控制配置通道 (I2C 总线)

  • 角色定位 :RK3588 作为 I2C 主设备 ,ES8388 作为 I2C 从设备
  • 传输内容:控制命令和状态信息(如音量调节、音频通路切换、工作模式设置、寄存器读写)。
  • 方向双向半双工(RK3588 发起读写操作,ES8388 响应)。
  • 物理实现 :由 2 条信号线 组成,本图抽象为一条总线:
    • SCL(串行时钟):由 RK3588 产生。
    • SDA(串行数据):双向数据线。
  • I2C 设备地址 :ES8388 的 I2C 从地址通常为 0x100x11 ,具体取决于 CE 引脚电平或硬件设计。
  • 典型速率:100 kHz(标准模式)或 400 kHz(快速模式),足以满足音频控制命令的低频需求。

2.1.4 RK3588 ↔ ES8388 同步基准主时钟(MCLK)

  • 连接 :RK3588 的 MCLK_OUT → ES8388 的 MCLK_IN
  • 作用:为 ES8388 提供精准的时钟基准,用于内部 PLL 生成采样时钟和 I2S 位时钟。
  • 频率:通常是采样率的 256 倍或 384 倍(例如 48kHz 采样率时,MCLK = 12.288MHz 或 24.576MHz)。
  • 必要性:没有稳定的 MCLK,ES8388 无法正确采样或转换音频数据。

2.1.5 RK3588 ↔ ES8388 辅助控制信号 (GPIO to CE)

  • 连接 :RK3588 的一个通用 GPIO 引脚 → ES8388 的 CE(芯片使能/控制接口选择)。
  • 功能
    • 决定控制接口模式:CE 为低电平时,ES8388 工作于 I2C 模式;CE 为高电平时工作于 SPI 模式。在 RK3588 平台中,通常将 CE 拉低以使用 I2C 控制。
    • 可能影响 I2C 地址:部分设计中,CE 的电平还会影响 I2C 从地址的最低有效位。
  • 实现:RK3588 在系统初始化时通过 GPIO 输出固定电平,将 ES8388 锁定为 I2C 模式。

2.1.6 模拟音频输入/输出

  • 输入(录音) :ES8388 的 LIN1/LIN2RIN1/RIN2 引脚连接麦克风(单声道或立体声)。
  • 输出(播放) :ES8388 的 LOUT1/LOUT2ROUT1/ROUT2 引脚连接扬声器功放或耳机插孔。

模拟部分不属于数字总线,但它们是音频数据的最终目的地和来源。

2.2 rk3588 ES8388 内核设备树

废话不多说,接下来是内核设备树配置。

bash 复制代码
/ {
	es8388_sound: es8388-sound {
		status = "okay";
		compatible = "rockchip,multicodecs-card";
		rockchip,card-name = "rockchip-es8388";
		hp-det-gpio = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>;
		io-channels = <&saradc 3>;
		io-channel-names = "adc-detect";
		keyup-threshold-microvolt = <1800000>;
		poll-interval = <100>;
		spk-con-gpio = <&gpio1 RK_PD3 GPIO_ACTIVE_HIGH>;
		hp-con-gpio = <&gpio1 RK_PD2 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 = <&i2s0_8ch>;
		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>;
		};
	};
};

&i2c7 {
	status = "okay";
	es8388: es8388@11 {
		status = "okay";
		#sound-dai-cells = <0>;
		compatible = "everest,es8388", "everest,es8323";
		reg = <0x11>;
		clocks = <&mclkout_i2s0>;
		clock-names = "mclk";
		assigned-clocks = <&mclkout_i2s0>;
		assigned-clock-rates = <12288000>;
		pinctrl-names = "default";
		pinctrl-0 = <&i2s0_mclk>;
	};
};

&i2s0_8ch {
	status = "okay";
	pinctrl-0 = <&i2s0_lrck
		     &i2s0_sclk
		     &i2s0_sdi0
		     &i2s0_sdo0>;
};

&pinctrl {
	headphone {
		hp_det: hp-det {
			rockchip,pins = <1 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};
};

编译后重新刷入固件,可以看到已经注册的声卡。

bash 复制代码
cat /proc/asound/cards
 0 [rockchipes8388c]: simple-card - rockchip,es8388-codec
                      rockchip,es8388-codec

3. rk3588 es8388 HAL 配置

Android 系统如果尚未配置 ES8388 音频解码芯片,需要在声卡列表增加 es8388 声卡选项。

bash 复制代码
diff --git a/tinyalsa_hal/audio_hw.c b/tinyalsa_hal/audio_hw.c
index 0033bf3..cc98f34 100644
--- a/tinyalsa_hal/audio_hw.c
+++ b/tinyalsa_hal/audio_hw.c
@@ -291,7 +291,6 @@ struct dev_proc_info SPEAKER_OUT_NAME[] = /* add codes& dai name here*/
     {"rockchipcx2072x", NULL,},
     {"rockchipes8316c", NULL,},
     {"rockchipes8323c", NULL,},
+    {"rockchipes8388c", NULL,},
     {"rockchipes8396c", NULL,},
     {"rockchiprk", NULL, },
     {"rockchiprk809co", NULL,},

然后设置对应的音频路由,将 Android audio service 转换为 jason 配置,再经 HAL 传递到内核驱动。es8388 音频路由配置文件路径如下:

hardware/rockchip/audio/tinyalsa_hal/codec_config/es8388_config.h

结语

不枉博主详细讲解,欢迎订阅博主--炭烤毛蛋

相关推荐
孤岛站岗2 小时前
WAN:万象视频,开源视频生成的新标杆
开源·音视频
AI2512242 小时前
AI生视频主流工具功能及生成技术原理解析
人工智能·音视频
路溪非溪3 小时前
Linux中Netlink简介和使用总结
linux·网络·arm开发·驱动开发
reasonsummer3 小时前
【教学类-160-01】20260408 AI视频培训-练习1“豆包AI视频”
人工智能·音视频
颜大哦3 小时前
文字转音频,视频
音视频
Bohemian—Rhapsody3 小时前
麒麟v10-arm架构部署rabbitmq
arm开发·架构·rabbitmq
古译汉书11 小时前
【IoT死磕系列】Day 9:架构一台“自动驾驶物流车”,看8种协议如何协同作战
网络·arm开发·单片机·物联网·tcp/ip·架构·自动驾驶
路溪非溪16 小时前
Linux中gpio子系统的现代接口
linux·arm开发·驱动开发
senijusene17 小时前
IMX6ULL 平台 I2C 总线:从硬件原理到裸机驱动
c语言·arm开发·驱动开发