关键流程设计
初始化流程
-
释放 reset 和 clock 信号
-
注册 s 设备
playback 流程
- init 流程
-
初始化 DMA 传输的起始地址,buf_len 以及 period_len
-
注册 hal 层的回调函数
初始化 codec
I2S 模块使用 DMA 传输音频数据,DMA 采用环形链表形式,依次将音频数据传送到硬件。所以需要配置 DMA 传输时的起始地址(即 buffer 地址)以及 len,period_len。在 driver 层驱动,将 len 配置为 period_len 的 4 倍,DMA 每传输 len 长度的数据,触发一次 DMA 中断,通知 CPU 向 TX buffer 中写入数据。
-
- start 流程
-
填充 TX buffer
-
设置 DMA 传输的参数,调用
hal_i2s_playback_start
开始音频数据传输 -
调用 start 启用 codec 芯片
-
使能 PA
为保证 DMA 传输音频数据的连续性,需要在 DMA 开始传输前,先向 buffer 中填充数据。在 playback 的 driver 层驱动,是将 buffer 填充满后,才开始 DMA 的传输。
-
- DMA 中断流程
DMA 每传输完 len 长度的数据后,触发一次 DMA 中断,然后通过 DMA 回调函数的逐级调用,最终调用
rt_audio_tx_complete
对 buffer 进行填充,每次填充 len 长度的音频数据。
record 流程
- init 流程
-
初始化 DMA 传输的起始地址,buf_len 以及 period_len
-
注册 hal 层的回调函数
I2S 模块使用 DMA 传输音频数据,DMA 采用环形链表形式,依次将音频数据传送到硬件。所以需要配置 DMA 传输时的起始地址(即 buffer 地址)以及 len,period_len。在 driver 层驱动,将 len 配置为 period_len 的 2 倍,DMA 每传输 len 长度的数据,触发一次 DMA 中断,通知 CPU 向 pipe 设备写入数据。
-
- start 流程
按照 audio 的框架,在执行
rt_device_open
时,就会调用 start 流程,开始音频的录制,然后再通过rt_device_control
设置音频的格式(采样率,通道数等)。按照这个流程,最开始可能会录制一段不符合设置的音频格式的数据,这显然是不合理的。所以,在 driver 层的驱动实现中,start 流程并未做任何处理,而是在设置完音频格式后才开始音频的录制。 - DMA 中断流程
DMA 每传输完 len 长度的数据后,触发一次 DMA 中断,然后通过 DMA 回调函数的逐级调用,最终调用
rt_audio_rx_done
,将 buffer 的数据写入到 pipe 设备,每次写入 len 长度的音频数据。