接口设计
5 Jul 2024
Read time: 3 minute(s)
| 函数原型 | static int aic_i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir) |
|---|---|
| 功能说明 | 设置 S 模块输出的 mclk 时钟频率 |
| 参数定义 | dai:指向 dai 的指针 | clk_id:要设置的时钟 id | freq:设置的时钟频率 | dir: unused |
| 返回值 | 0:执行成功 | -EINVAL:参数非法 |
| 注意事项 | - |
| 函数原型 | static int aic_i2s_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) |
|---|---|
| 功能说明 | 设置 S 模块 LRCK 与 BCLK 时钟频率的比率 |
| 参数定义 | dai:指向 dai 的指针 | ratio:需要设置的比率 |
| 返回值 | 0:执行成功 | -EINVAL:参数非法 |
| 注意事项 | - |
| 函数原型 | static int aic_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) |
|---|---|
| 功能说明 | 设置 S 模块的格式 |
| 参数定义 | dai:指向 dai 的指针 | fmt:需要设置的格式 |
| 返回值 | 0:执行成功 | -EINVAL:参数非法 |
| 注意事项 | 通过该函数可以设置的格式有: | 1. I2S 的主从模式 | 2. BCLK 和 LRCK 的极性 | 3. I2S 的数据格式 |
| 函数原型 | static int aic_i2s_set_tdm_slot(struct snd_soc_dai *dai,unsigned int tx_mask, unsigned int rx_mask,int slots, int slot_width) |
|---|---|
| 功能说明 | 设置 S 模块 TDM 模式下的通道个数和宽度 |
| 参数定义 | dai:指向 dai 的指针 | tx_mask:tx slot 的 mask | rx_mask:rx slot 的 mask | slots:设置的通道个数 | slot_width:设置的通道宽度 |
| 返回值 | 0:执行成功 | -EINVAL:参数非法 |
| 注意事项 | - |
| 函数原型 | static int aic_i2s_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) |
|---|---|
| 功能说明 | 设置 S 模块硬件参数 |
| 参数定义 | substream:指向 playback 或 capture 的 substream | params:指向硬件参数指针 | dai:指向 dai 的指针 |
| 返回值 | 0:执行成功 | -EINVAL:参数非法 |
| 注意事项 | 通过该函数,可以设置采样精度,帧率,以及时钟等参数 |
| 函数原型 | static int aic_i2s_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) |
|---|---|
| 功能说明 | I2S 的触发函数 |
| 参数定义 | substream:指向 playback 或 capture 的 substream | cmd:触发的命令 | dai:指向 dai 的指针 |
| 返回值 | 0:执行成功 | -EINVAL:参数非法 |
| 注意事项 | 通过该函数,可以开始或停止音频的播放或录音 |
driver 层接口设计
driver 层可以同时实现 playback 和 record 两个功能,主要根据的是音频数据流的方向进行判别。| 函数原型 | rt_err_t drv_i2s_sound_init(struct rt_audio_device *audio) |
|---|---|
| 功能说明 | i2s 的初始化函数 |
| 参数定义 | audio:指向音频设备的指针 |
| 返回值 | RT_EOK:执行成功 |
| 注意事项 | - |
| 函数原型 | void drv_i2s_sound_buffer_info(struct rt_audio_device *audio, struct rt_audio_buf_info *info) |
|---|---|
| 功能说明 | 获取音频的 buffer 参数 |
| 参数定义 | audio:指向音频设备的指针 info:用于获取 buffer 参数的指针 |
| 返回值 | 无 |
| 注意事项 | - |
| 函数原型 | rt_err_t drv_i2s_sound_start(struct rt_audio_device *audio, int stream) |
|---|---|
| 功能说明 | 开始音频播放 |
| 参数定义 | audio:指向音频设备的指针。 stream:音频数据流方向 |
| 返回值 | RT_EOK:执行成功。 RT_EINVAL:参数非法 |
| 注意事项 | - |
| 函数原型 | rt_err_t drv_i2s_sound_stop(struct rt_audio_device *audio, int stream) |
|---|---|
| 功能说明 | 结束音频播放 |
| 参数定义 | audio:指向音频设备的指针。 stream:音频数据流方向 |
| 返回值 | RT_EOK:执行成功。 -RT_EINVAL:参数非法 |
| 注意事项 | - |
| 函数原型 | rt_err_t drv_i2s_sound_pause(struct rt_audio_device *audio, int enable) |
|---|---|
| 功能说明 | 暂停/恢复音频播放 |
| 参数定义 | audio:指向音频设备的指针。 enable:音频暂停和恢复播放使能位(0 为恢复,非 0 为暂停) |
| 返回值 | RT_EOK:执行成功 |
| 注意事项 | - |
| 函数原型 | rt_err_t drv_i2s_sound_configure(struct rt_audio_device *audio, struct rt_audio_caps *caps) |
|---|---|
| 功能原型 | 音频设备配置接口,用于配置采样格式,采样率,通道数等接口 |
| 参数定义 | audio:指向音频设备的指针 caps:指向配置参数的指针 |
| 返回值 | RT_EOK:执行成功 -RT_ERROR:参数不支持 |
| 注意事项 | - |
| 函数原型 | rt_err_t drv_i2s_sound_getcaps(struct rt_audio_device *audio, struct rt_audio_caps *caps) |
|---|---|
| 功能说明 | 获取音频设备的参数 |
| 参数定义 | audio:指向音频设备的指针 caps:指向配置参数的指针 |
| 返回值 | RT_EOK:执行成功。 -RT_ERROR:参数不支持 |
| 注意事项 | - |
| 函数原型 | rt_size_t drv_i2s_sound_get_playback_avail(struct rt_audio_device *audio) |
|---|---|
| 功能说明 | 获取音频缓存的数据大小 |
| 参数定义 | audio:指向音频设备的指针 |
| 返回值 | 缓存数据的大小 |
| 注意事项 | - |
hal 层接口设计
hal 层接口也是分 playback,record 两部分进行设计,下面以 playback 端的接口进行说明。
| 函数原型 | int hal_i2s_protocol_select(aic_i2s_ctrl *i2s, i2s_protocol_t protocol) |
|---|---|
| 功能说明 | 设置传输协议 |
| 参数定义 | i2s:指向 ctrl 的指针 protocol:传输协议 |
| 返回值 | 0:执行成功。 -EINVAL:参数不支持 |
| 注意事项 | - |
| 函数原型 | int hal_i2s_sample_width_select(aic_i2s_ctrl *i2s, i2s_sample_width_t width) |
|---|---|
| 功能说明 | 设置采样通道的位宽 |
| 参数定义 | i2s:指向 ctrl 的指针 width:通道的位宽 |
| 返回值 | 0:执行成功 |
| 注意事项 | - |
| 函数原型 | int hal_i2s_mclk_set(aic_i2s_ctrl *i2s, i2s_sample_rate_t sample_rate, uint32_t mclk_nfs) |
|---|---|
| 功能说明 | 设置 MCLK 的时钟频率 |
| 参数定义 | i2s:指向 ctrl 的指针 sample_rate:采样率 mclk_nfs:MCLK 的时钟频率 |
| 返回值 | 0:执行成功 -EINVAL:参数不支持 |
| 注意事项 | - |
| 函数原型 | void hal_i2s_polarity_set(aic_i2s_ctrl *i2s, i2s_polarity_t polarity) |
|---|---|
| 功能说明 | 选择 LRCK 的左右通道极性 |
| 参数定义 | i2s:指向 ctrl 的指针 polarity:LRCK 的左右通道极性 |
| 返回值 | 无 |
| 注意事项 | - |
| 函数原型 | int hal_i2s_sclk_set(aic_i2s_ctrl *i2s, i2s_sample_rate_t sample_rate, uint32_t sclk_nfs) |
|---|---|
| 功能说明 | 设置 SCLK/LRCK 的比率 |
| 参数定义 | i2s:指向 ctrl 的指针 sample_rate:采样率 sclk_nfs:需要设置的比率 |
| 返回值 | 0:执行成功 -EINVAL:参数不支持 |
| 注意事项 | - |
| 函数原型 | void hal_i2s_channel_select(aic_i2s_ctrl *i2s, i2s_sound_channel_t channel, i2s_stream_t stream) |
|---|---|
| 功能说明 | I2S 通道数量设置 |
| 参数定义 | i2s:指向 ctrl 的指针 channel:指向 t 的变量,表示要使用的通道 stream:音频数据流的方向 |
| 返回值 | 无 |
| 注意事项 | - |
| 函数原型 | void hal_i2s_playback_start(aic_i2s_ctrl *i2s, i2s_format_t *format) |
|---|---|
| 功能说明 | 开始播放 |
| 参数定义 | i2s:指向 ctrl 的指针 format:指向 t 的指针 |
| 返回值 | 无 |
| 注意事项 | - |
| 函数原型 | void hal_i2s_playback_stop(aic_i2s_ctrl *i2s) |
|---|---|
| 功能说明 | 停止播放 |
| 参数定义 | i2s:指向 ctrl 的指针 |
| 返回值 | 无 |
| 注意事项 | - |
