Edit online

I2S 架构设计

2 Dec 2024
Read time: 1 minute(s)

内核中音频采用 ALSA 驱动框架,该框架管理所有与音频相关的软件与硬件,I2S 的驱动设计需要遵循该框架的基本要求。ALSA 音频框架将底层的硬件驱动分为三个部分:machine、pltform 与 codec。三者的关系如下图所示:


design_12

ALSA 框架将底层划分为三部分后,使得 platform 和 codec 的驱动实现变得更加简单,二者只专注于实现自己的功能代码,由 machine 驱动来实现 platform 和 codec 的耦合,二者依靠 dai 和 codec_dai 进行数据传输。platform 驱动的主要作用是完成音频数据的管理,最终通过 SOC 的数字音频接口(cpu_dai)把音频数据传送给 codec 进行播放或将 codec 采集的音频数据存储到内存中。

在具体的实现上,ALSA 将 platform 驱动(platform 可以简单理解为 SOC 端的驱动)分为两部分:实现音频数据传输和管理的 DMA 驱动和 CPU DAI 的驱动。且 ALSA 框架中已实现了 DMA 对音频数据管理部分的驱动 代码,所以 S 的驱动只需要实现 CPU DAI 部分的驱动,音频数据管理部分只需要指定数据传输的起始地址或目的地址,以及传输位宽即可。

CPU DAI 驱动

在驱动实现上,无论是 codec 还是 platform,ALSA 将它们统一划分为 component 和 dai,所以,就要相应的实现 driver 和 driver。 然后调用 component 进行统一注册。snd_soc_component_driver 主要是注册与 dapm 相关的音频控件等信息,snd_soc_dai_driver 主要是注册数字音频接口 S 或 PCM 等的信息及底层操作函数。

由于在 platform 端,主要是 S 接口和 DMA 的传输配置,不存在音频控件,所以 DAI 的驱动主要是实现 driver。包括指定 S 接口支持的通道数、采样率、支持的数据格式,以及对 S 配置和控制的回调函数集合 snd_soc_dai_ops 的实现

音频 DMA 驱动

ALSA 架构中,对 DMA 的一些配置和传输的函数已经由 ALSA 框架实现,所以这部分驱动实现只需要指定 playback 和 capture 中 DMA 传输的地址以及传输的位宽,然后调用 register 进行注册即可。