Audio
概述
音频部分处理音频的输入输出,即录音和音频播放。不同的音频通路支持不同的音频处理能力,MTT E300 平台主要有如下几种音频通路类型:
- Peri I2S + Audio codec
- Display I2S + Display DPTX
- USB 音频
- 蓝牙音频
- 其它
这一章说明在没有 Audio DSP 介入的情况下,Peri I2S + Audio codec 和 Display I2S + Display DPTX 相关的内容。Peri I2S + Audio codec 音频通路在硬件上,结构通常如下图:

Peri I2S + audio codec 音频通路的中心是外设 audio codec,它集成模数转换器 (ADC) 和数模转换器 (DAC),负责完成物理世界中的模拟信号和 SoC 可以处理的数字信号之间的转换,对于音频播放,它将音频采样转为电压以用于模拟输出,对于录音,它将来自模拟输入的电压信号转为一系列音频采样。Audio codec 通过连接器外接扬声器、耳机、麦克风和数字麦克风等器件,并根据需要驱动这些器件与外部物理世界交互。
功能描述
MTT E300 平台 Linux 系统音频部分软硬件技术栈如下图所示:

Linux 内核音频 ALSA 子系统整体结构如下图:

音频通路
MTT E300 平台 audio codec 与 SoC 之间的连接包括几个部分:
I2S:数字音频接口 (DAI),SoC 的多个GPIO口复用为I2S功能。I2S负责在 SoC 和 audio codec 之间传输音频数据,对于播放,I2S将音频采样数据从 SoC 的DDR搬到 audio codec。对于录音,I2S将音频采样数据从 audio codec 搬到 SoC 的DDR。I2C(可选):SoC 的多个GPIO口复用为I2C总线功能。 SoC 通过I2C总线配置 audio codec,如 audio codec 的内部通路,音量等。是否需要通过I2C总线来配置,因具体的 audio codec 而异,一是对于一些简单的 audio codec,完全不需要配置接口,二是 audio codec 不一定通过I2C来配置,也可能通过SPI之类的总线来传递控制命令。INT(可选):SoC 的单个GPIO口复用为中断接口。 对于支持接入耳机的 audio codec,通过这个中断上报耳机插拔事件。REFCLK(可选):也称为MCLK,或 audio codec 的系统时钟。 audio codec 需要它来工作。SoC 的单个GPIO口复用为MCLK时钟输出。有些 audio codec 也可以使用I2S这样的数字音频接口的BCLK作为它们的时钟,无需 SoC 提供专门的MCLK。通常 audio codec 预期MCLK为BCLK的倍数,通常为采样率的倍数。- 供电(可选):SoC 的多个
GPIO口用来控制为 audio codec 供电。 根据硬件设计来决定是否有需要。具体 audio codec 支持的功能及特性,因板子设计的不同而不同。关于 Peri-I2S,MTT E300 平台共集成 8 个 Peri-I2S 接口,支持对每个I2S接口进行独立控制,其中I2S0和I2S1可以配置为联合模式,支持在TDM模式下传输 8 个声道的 RX 或者 8 个声道的 TX。
Peri-I2S
MTT E300 平台的 Peri-I2S 支持如下特性:
- 支持
I2S2~72 声道 TX 和 2 声道 RX 数据传输; - 支持
I2S0~1在TDM模式和I2S模式下 4 声道 TX 和 4 声道 RX 数据传输; - 支持
I2S0~1在TDM模式下 8 声道 TX 和 8 声道 RX 数据传输; - 支持单个
I2S配置为主模式(Master)和从模式(Slave); - 支持左对齐和右对齐,
PCM短帧和长帧模式; - 支持 16kHz、44.1kHz、48kHz、88.2kHz、96kHz、176.4kHz 和 192kHz 采样频率;
- 支持设备端 16bits、24bits 和 32bits 采样深度(注:12bit、20bit 不支持);
- 支持
I2S传输时钟SCLK固定为 32bit 数据传输; - 支持
TDM模式的固定 32bit 传输; - 支持
I2S0~1在联合模式下共 8 声道 TX 和 8 声道 RX 数据同步传输; - 支持通过
DMA读写 RX 和 TX 数据; - 8 个
I2S共用一个AXI接口的DMA控制器。
MTT E300 平台 Peri-I2S 的一些限制:
- 特定
I2S的 TX 和 RX 共用时钟,TX 和 RX 同时工 作时,TX 和 RX 的参数配置必须完全一致,包括采样率、通道数和采样深度等; I2S不支持实时获取DMA数据传输过程中的读写指针,无法支持应用层基于定时器的数据传输调度,只能支持中断驱动的数据传输;DMA描述符 FIFO 无法复位。
Display I2S + Display DPTX
Display I2S + Display DPTX 音频通路只支持音频播放,不支持录音,在硬件上,结构如下图:

Display I2S + Display DPTX 音频通路类似于 Peri-I2S+极简 audio codec 的情况,Display DPTX 扮演 audio codec 的角色,但无需太多专门的控制,如 I2C,也无需 SoC 处理供电、提供参考时钟,或处理耳机插拔事件中断。MTT E300 平台中,Display I2S 和 Peri-I2S 是不同的 IP,MTT E300 平台共集成 6 个 Display I2S 接口,它们支持的特性如下:
- 采样深度灵活配置,范围从 16bits 至 32bits。
- 支持的采样率范围从 8KHz ~ 192KHz。
各个 Display I2S 接口和各个 Display DPTX 之间的对应关系如下:
| Display I2S | Display DPTX |
|---|---|
| I2S0 和 I2S1 | Display DPTX0 |
| I2S2 | Display DPTX1 |
| I2S3 | Display DPTX2 |
| I2S4 和 I2S5 | Display DPTX3 |
驱动程序提供对硬件能力的子集的支持。
MTT E300 Linux 内核音频设备驱动程序基于 ASoC 框架实现,涉及到的内核文件主要有如下这些:
| 文件路径 | 说明 |
|---|---|
sound/soc/m1000/m1000*i2s*_.csound/soc/m1000/m1000*i2s*_.hsound/soc/m1000/m1000*snd_irq.csound/soc/m1000/m1000_snd_irq.hsound/soc/m1000/m1000_snd_pcm.csound/soc/m1000/m1000_snd_pcm.hsound/soc/m1000/m1000_snd_regs.csound/soc/m1000/m1000_snd_regs.h | Peri I2S 驱动程序实现 |
sound/soc/m1000/m1000_disp_i2s*_.csound/soc/m1000/m1000*disp_i2s*_.h | Display I2S 驱动程序实现 |
sound/soc/m1000/m1000_snd_card_dummy_peri_drv.c | Dummy machine 驱动程序,供实现特定板子的 machine 驱动程序时参考 |
sound/soc/m1000/m1000_snd_card_dptx_drv.c | Display I2S + Display DPTX 音频通路 machine 驱动程序 |
sound/soc/m1000/m1000_snd_card_rt5672_drv.c | 基于 Realtek ALC5672 audio codec 的 machine 驱动程序,供参考 |
sound/soc/codecs/* | 内核主线代码中的 codec 驱动程序 |
Peri I2S 和 Display I2S 驱动程序实现为 ASoC 的 Platform 类驱动程序,codec 驱动程序实现为 ASoC 的 Codec 类驱动程序,声卡实现为 ASoC 的 Machine 类驱动程序。
API 说明
音频设备驱动程序通过 ALSA API 暴露给用户空间程序使用。