Edit online

关键流程设计

初始化流程

AudioCodec 模块的初始化流程如下:

  1. 初始化 audio 模块时钟频率

  2. 释放 clock 和 reset 信号

  3. 注册音频设备,playback 端注册为 sound0 设备,DMIC 注册为 dmic0 设备,AMIC 注册为 amic0 设备

playback 流程

  • init 流程
    1. 初始化 DMA 传输的起始地址,buf_len 以及 period_len

    2. 注册 hal 层的回调函数

      audio 模块使用 DMA 传输音频数据,DMA 采用环形链表形式,依次将音频数据传送到硬件。所以需要配置 DMA 传输时的起始地址(即 buffer 地址)以及 len,period_len。在 driver 层驱动,将 len 配置为 period_len 的 4 倍,DMA 每传输 len 长度的数据,触发一次 DMA 中断,通知 CPU 向 TX buffer 中写入数据。

  • start 流程
    1. 根据 menuconfig 配置音频通路

    2. 填充 TX buffer

    3. 设置 DMA 传输的参数,调用 hal_audio_playback_start 开始音频数据传输

    4. 使能 PA

      为保证 DMA 传输音频数据的连续性,需要在 DMA 开始传输前,先向 buffer 中填充数据。在 playback 的 driver 层驱动,是将 buffer 填充满后,才开始 DMA 的传输。

DMA 每传输完 len 长度的数据后,触发一次 DMA 中断,然后通过 DMA 回调函数的逐级调用,最终调用 rt_audio_tx_complete 对 buffer 进行填充,每次填充 len 长度的音频数据。record 流程如下:
  • init 流程
    1. 初始化 DMA 传输的起始地址,buf_len 以及 period_len

    2. 注册 hal 层的回调函数

      audio 模块使用 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 长度的音频数据。