一、概述
fsl-sai 是 Freescale/NXP i.MX6UL 内核自带的 SAI (Synchronous Audio Interface) 驱动,位于
sound/soc/fsl/fsl_sai.c。它作为 ASoC 框架中的 CPU DAI 驱动,负责配置 I2S 硬件接口和 DMA 传输参数。与我们之前实现的 fake_platform.c(使用 hrtimer 模拟 DMA)不同,fsl-sai 驱动使用真实的硬件 DMA 控制器(SDMA 或 EDMA)进行音频数据传输,这是生产环境中的标准做法。
关键区别:fsl-sai 是 CPU DAI 驱动,不是 Platform 驱动。Platform 层由独立的 dmaengine_pcm 或 imx-pcm-dma 提供。
二、DMA 传输和缓冲区管理
2.1 DMA 初始化流程
fsl-sai 驱动在 probe 阶段注册 DMA 支持:
imx_pcm_dma_init:i.MX 平台专用,支持 SDMA multi-FIFO 模式
devm_snd_dmaengine_pcm_register:通用 dmaengine 框架,适用于 EDMA 等控制器
2.2 DMA 参数配置(hw_params)
在
fsl_sai_hw_params() 中配置 DMA 传输参数:关键参数:
dma_params->addr:SAI 数据寄存器的物理地址(TDR0/RDR0)
dma_params->maxburst:每次 DMA 请求传输的数据量(默认 6 words)
peripheral_config:SDMA 专用配置(multi-FIFO 模式)
2.3 硬件 FIFO 和 Watermark
SAI 硬件提供 FIFO 缓冲区,通过 watermark 触发 DMA 请求:
工作原理:
- TX:当 FIFO 剩余空间 ≤ watermark 时,硬件发出 DMA 请求
- RX:当 FIFO 数据量 ≥ watermark 时,硬件发出 DMA 请求
- DMA 控制器响应请求,自动搬运 maxburst 个字
- DMA 完成后更新缓冲区指针,触发 period_elapsed 回调
三、与 fake_platform.c 的对比
3.1 架构差异
- fsl-sai:CPU DAI 驱动,负责配置 I2S 硬件接口和 DMA 参数
- fake_platform:Platform 驱动,负责 PCM 缓冲区管理和数据传输模拟
在真实系统中,fsl-sai 需要配合独立的 Platform 驱动(如 imx-pcm-dma)使用,两者分工明确。
3.2 DMA 实现对比
fake_platform.c(hrtimer 模拟):
fsl-sai(真实 DMA):
3.3 关键差异总结
驱动角色:fake_platform 是 Platform 驱动,fsl-sai 是 CPU DAI 驱动
数据传输:fake_platform 使用 hrtimer 模拟,fsl-sai 使用硬件 DMA(SDMA/EDMA)
缓冲区管理:fake_platform 手动更新 hw_ptr,fsl-sai 由 DMA 引擎自动更新
CPU 占用:fake_platform 每个 period 触发中断,fsl-sai 仅 DMA 完成时中断,CPU 占用更低
适用场景:fake_platform 用于 QEMU 测试和学习,fsl-sai 用于生产环境
四、fsl-sai 驱动解析
4.1 驱动角色定位
fsl-sai 在 ASoC 三层架构中的定位:
- CPU DAI 驱动:配置 SAI 硬件接口(I2S 格式、时钟、同步模式)
- DMA 参数提供者:通过 snd_soc_dai_init_dma_data 向 Platform 层提供 DMA 配置
- 硬件抽象层:使用 regmap 访问 SAI 寄存器,支持多种 SoC 变体
4.2 关键数据结构
struct fsl_sai 包含:regmap 寄存器访问、时钟管理、DMA 参数(dma_params_tx/rx)、SDMA 配置、同步模式标志等。五、总结
通过对比 fsl-sai 和 fake_platform.c,我们可以清晰地看到真实硬件 DMA 与软件模拟的区别:
- fsl-sai 作为 CPU DAI 驱动,专注于配置 I2S 硬件接口和提供 DMA 参数
- 真实 DMA 由硬件自动完成数据传输,CPU 占用极低,适合生产环境







