Audio
介绍Audio的功能和使用方法。
模块介绍
Audio 模块包含 2 路 I2S 接口和 1 路 HDMI 音频接口。
功能介绍
系统基于 ALSA(Advanced Linux Sound Architecture)音频架构,整体框架如下:
ALSA音频框架可以分为以下几个层次:
-
ALSA Library
向应用程序上提供统一的 API 接口,应用程序可调用 alsa-lib 接口实现音频播放、录制和控制。现在提供了两套基本的库。而 Android 系统通常使用 tinyalsa 作为简化的 ALSA 库。 -
ALSA Core ALSA 核心层,向上提供 PCM、CTL、MIDI、TIMER 等逻辑设备接口,向下驱动底层硬件(如 I2S、DMA、Codec)。
-
ASoC Core (ALSA System on Chip)
ALSA 的标准框架,ASoC 是 ALSA 的 SoC 驱动框架核心部分,提供音频设备驱动的通用接口与数据结构。 -
Hardware Driver
音频硬件驱动主要由三部分组成:Machine、Platform 和 Codec。它们共同提供 ALSA 驱动接口(ALSA Driver API)以及音频设备的初始化和运行流程。这部分内容由驱动开发人员具体实现,功能较为底层。-
Machine(板级驱动):通常指一款具体的开发板,集成了特定外设,为 CPU 和 Codec 提供运行载体。由于硬件配置不同,Machine 驱动几乎无法复用。它的主要作用是将 Platform 驱动与 Codec 驱动关联起来,并完成与具体板卡相关的初始化工作。例如,可以通过
snd_soc_dai_link
指定要使用的 Platform 驱动、SoC 端的 DAI(Digital Audio Interface)接口、对应的 Codec 驱动及其 DAI 接口,同时还会处理一些和硬件设 计紧密相关的逻辑。 -
Platform(平台驱动):通常指某款 SoC 平台,包含 I2S、AC97 等音频接口,具备音频所需的时钟、DMA 等资源。Platform 驱动仅与特定 SoC 相关,负责实现 SoC 的 DMA 传输和 DAI 接口逻辑。它与 Machine 无关,因此可以被多个 Machine 驱动复用。得益于这种抽象设计,同一款 SoC 可在不同的开发板上直接复用 Platform 驱动而无需修改。
-
Codec(编解码器驱动):Codec 芯片通常集成了 I2S 接口、D/A(数模转换)、A/D(模数转换)、混音器(Mixer)、功放(PA)等模块,支持多种输入(如麦克风 Mic、线路输入 Line-in、I2S、PCM)和输出(如耳机、喇叭、听筒、线路输出 Line-out)。一般通过 I2C 与 SoC 通信进行控制。Codec 驱动仅与具体的 Codec 芯片相关,和 SoC 或 Machine 无关,也具有较高的复用性。同一个 Codec 驱动可以在多个不同的 Machine 上使用。
-
音频方案介绍
K1 目前支持两种音频声卡方案:
-
方案一:通过 HDMI 接口进行音频输出,仅支持播放;
-
方案二:I2S0 配合外接的 I2C 接口 Codec 芯片 ES8326B,支持音频的播放与录制功能。
源码结构介绍
I2S / HDMIAUDIO 控制器驱动代码在 sound/soc/spacemit
目录下:
sound/soc/spacemit
├── Kconfig
├── Makefile
├── spacemit-dummy-codec.c #dummy codec,配合hdmiaudio创建声卡
├── spacemit-snd-card.c #声卡驱动
├── spacemit-snd-i2s.c #i2s驱动
├── spacemit-snd-i2s.h
├── spacemit-snd-pcm-dma.c #platform驱动,主要是pcm相关
├── spacemit-snd-sspa.c #hdmiaudio驱动
├── spacemit-snd-sspa.h
Codec ES8326B 驱动代码在 sound/soc/codec
目录下:
sound/soc/codec
├── es8326.c
├── es8326.h
I2S
关键特性
- 支持 48kHz 采样率,16bit 采样深度,双声道
- 支持播放和录制功能
- 支持全双工工作模式