I2S 架构设计
4 Dec 2024
Read time: 1 minute(s)
RT-Thread 音频框架
RT-Thread 定义了一套音频框架,driver 层的驱动就是为了对接该音频框架。该框架在录音端和播放端采用了两种不同的机制,现对录音端和播放端的框架进行简单说明。
如上图所示,应用层读取的音频数据写入到内存池的 block 中,并用数据队列对内存池的 block 数据进行管理。从数据队列中依次取出音频数据,写入到 TX buffer 中,TX buffer 在原理上是一个环形缓冲区,最后通过 DMA 将音频数据写入到硬件的 TXFIFO 中。所以,playback 端的 driver 层驱动主要是负责 TX buffer 环形缓冲区的管理,及时写入音频数据,并用 DMA 搬运到硬件。
如上图所示,RT-Thread 音频框架在录音端的设计与播放端不同。在录音端框架虚拟了一个 pipe 设备,其实就是一个 ringbuffer,读写 pipe 设备就是对 ringbuffer 的读写。driver 层驱动负责管理一个 RX buffer,RX buffer 在逻辑上也是一个环形缓冲区。DMA 负责将 MIC 端接收到的数据搬运到 RX buffer,再通过写 pipe 设备将音频数据写入到 pipe 的 ringbuffer 中。应用层代码则通过 rt_device_read 每次从 pipe 设备中读取音频数据,再将音频数据写入到 wav 文件。
注:
与 audio 不同的是,i2s 还需要实现 codec 芯片的驱动设计才能完成音频的播放和录音功能