音频驱动程序包括两层:用于 I2S 的硬件访问层 (HAL) 和用于 RT-Thread 的适配层。
硬件访问层提供用于访问 I2S 外设寄存器的基本 API。 有关详细信息,请参阅 I2S 的 API 文档。
适配层提供对 RT-Thread 驱动框架的支持。 用户可以使用 RT-Thread POSIX 驱动程序接口进行音频编程。 请参阅 RT-Thread 驱动程序的 API 文档。
主要功能包括:
- 麦克风设备和扬声器设备支持
- 用于音频捕获和播放的 DMA
- 音频捕获转储工具支持并保存在 PC 中
- 两路I2S硬件支持,其中I2S1只用来输入, I2S2 既支持输入也支持输出
驱动配置
音频设备使用 I2S 作为传输。 可以使用 menuconfig 工具为每个项目选择外设和 DMA 支持配置的实例,通常保存在 C 头文件中。 默认情况下,配置保存为 rtconfig.h。
以下示例显示在一个项目头文件中定义的标志,该项目使用支持 DMA 和 RT 音频的麦克风设备:
#define BSP_USING_DMA 1
#define RT_USING_AUDIO 1
#define BSP_USING_I2S 1
#define BSP_ENABLE_I2S_MIC 1
#define BSP_ENABLE_I2S_CODEC 1
配置完成后,用户需要在所有需要访问驱动程序的源代码中包含头文件。
使用音频驱动程序
适配器层注册 RT-Thread 请求的硬件支持功能,并使用 I2S HAL 实现这些功能。 I2S HAL 的 API 详见 I2S 。
对于使用 RT-Thread 麦克风设备进行音频捕获的用户,可以使用以下代码作为示例:
uint8_t g_pipe_data[512];
rt_device_t g_mic = rt_device_find("i2s1");
rt_err_t err = rt_device_open(g_mic, RT_DEVICE_FLAG_RDONLY);
struct rt_audio_caps caps;
caps.main_type = AUDIO_TYPE_INPUT;
caps.sub_type = AUDIO_DSP_SAMPLERATE;
caps.udata.value =16000;
rt_device_control(g_mic, AUDIO_CTL_CONFIGURE, &caps);;
int stream = 1;
rt_device_set_rx_indicate(g_mic, audio_rx_ind);
rt_device_control(g_mic, AUDIO_CTL_START, &stream);
...
rt_err_t audio_rx_ind(rt_device_t dev, rt_size_t size)
{
}
对于使用 RT-Thread 喇叭/耳机设备进行音频播放的用户,可以使用以下代码作为示例:
uint8_t g_pipe_data[512];
rt_device_t g_i2s = rt_device_find("i2s2");
rt_err_t err = rt_device_open(g_i2s, RT_DEVICE_FLAG_RDWR);
struct rt_audio_caps caps;
caps.main_type = AUDIO_TYPE_INPUT;
caps.sub_type = AUDIO_DSP_SAMPLERATE;
caps.udata.value =16000;
rt_device_control(g_i2s, AUDIO_CTL_CONFIGURE, &caps);;
int stream = 0;
rt_device_set_tx_complete(g_i2s, audio_tx_done);
rt_device_control(g_i2s, AUDIO_CTL_START, &stream);
...
rt_err_t audio_tx_done(rt_device_t dev, void *buffer)
{
}