.. _AUDIO_DAC章节: AUDIO DAC ========================================= AW30N AUDIO_DAC支持单声道,此DAC支持16bit精度。 各芯片音频性能对比情况如下: =================== ================== ============ ============ 芯片DAC性能对比 AC104N AD16N AW30N =================== ================== ============ ============ Output Swing(空载) 430mVrms 760mVrms 564mVrms SNR 83dB 97dB 93dB DR 82dB 96dB 93dB THD -70dB -82dB -85dB Noise Floor 30uVrms 11uVrms 12uVrms =================== ================== ============ ============ .. centered:: 表1 AUDIO_DAC性能对比 AW30N AUDIO_DAC采样率: +----------+---------------+---------------+ |AW30N AUDIO 采样率支持情况 | +----------+---------------+---------------+ |采样率 |DAC |APA | +==========+===============+===============+ |8000 |yes |null | +----------+---------------+---------------+ |11025 |yes |null | +----------+---------------+---------------+ |12000 |yes |null | +----------+---------------+---------------+ |16000 |yes |null | +----------+---------------+---------------+ |22050 |yes |null | +----------+---------------+---------------+ |24000 |yes |null | +----------+---------------+---------------+ |32000 |yes |yes | +----------+---------------+---------------+ |44100 |yes |yes | +----------+---------------+---------------+ |48000 |yes |yes | +----------+---------------+---------------+ |64000 |yes |null | +----------+---------------+---------------+ |88200 |yes |null | +----------+---------------+---------------+ |96000 |yes |null | +----------+---------------+---------------+ .. centered:: 表2 AUDIO_DAC采样率支持情况 AUDIO DAC 工作模式: +-----------+----------------+-------------+ |AW30N AUDIO 工作模式 | +===========+================+=============+ |DAC |单声道单端DAC | | +-----------+----------------+-------------+ |APA |单声道单端APA |单声道差分APA| +-----------+----------------+-------------+ |ALINK |双声道 Alink | | +-----------+----------------+-------------+ .. centered:: 表3 AUDIO_DAC工作模式 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 《app_config.c》中的开机默认配置 ################################################################ Audio公共部分和AUDIO DAC包含以下配置: 1. vcm外挂电容; 2. 音频系统低压配置; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 《audio_dac.h》中的开机默认配置 ################################################################ 在audio_dac.h的宏定里面主要有以下: - 1、选择音频 通过 内置Class-D功放的APA模块 或者 模拟DAC模块输出 或者 Audio_Link模块输出; .. image:: audio_select_apa_dac.png :alt: "音频输出选择“ :align: center .. centered:: 音频输出选择 APA工作模式 **************************************************************************************************** =================== ================================ APA工作模式 工作模式特点 =================== ================================ MODE1 支持单端,单端输出性能好 MODE2 支持差分,差分输出性能好 MODE3 暂不支持 =================== ================================ 工作模式可根据图2.1所示,在《apa.h》文件中的 **AUDAC_OUTPUT_MODE** 来选择: .. image:: apa_mode_sel.png :alt: "audio apa工作模式选择“ :align: center .. centered:: audio apa工作模式选择 APA的驱动方式有: 1. 差分直推喇叭(推荐使用MODE2) 该驱动方式对应MODE1、MODE2模式,通过APAP和APAN引脚输出,内置功放。 .. image:: ad17_diff.png :alt: "差分直推喇叭示意图“ :align: center .. centered:: 差分直推喇叭示意图 2. 单端隔直推功放(推荐使用MODE1) 该驱动方式对应MODE1模式,通过APAP、APAN引脚输出推功放(不支持立体声)。 .. image:: ad17_single_apa.png :alt: "单端隔直推功放原理图“ :align: center .. centered:: 单端隔直推功放原理图 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 模拟DAC工作模式 **************************************************************************************************** 1. 单端隔直推功放 该驱动方式在AW30N通过PA5引脚输出,需要外接功放芯片。 *注:部分封装没有引出DAC引脚,不可使用RDAC功能!* .. image:: ad18n_rdac.png :alt: "单端隔直推功放原理图“ :align: center .. centered:: dac单端隔直推功放原理图 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUDIO DAC管理架构 ################################ AW30N内置模拟DAC,均支持16bit精度,支持单声道,最高支持96k采样率;DAC固件管理框架同时支持最多2路DAC数据流输出。 AUDIO DAC相关的源代码文件: :: apps/app/bsp/common/audio/audio_dac_api.c apps/app/bsp/cpu/bd49/audio_dac_cpu.c apps/include_lib/audio/audio_dac_api.h apps/include_lib/cpu/bd49/audio_dac.h 下图是Audio DAC 管理框架对应的结构体。 .. image:: ad-5-1-dac-mag.png :alt: "图5.1 audio dac管理框架“ :align: center .. centered:: 图5.1 audio dac管理框架 AUDIO DAC主要有以下函数: :: void dac_mode_init(u16 vol) void dac_init_api(u32 sr) void dac_sr_api(u32 sr) void dac_off_api(void) void fifo_dac_fill(u8 *buf, u32 len, AUDIO_TYPE type) u8 dac_vol(char set, u8 vol) bool dac_mute(bool mute) bool regist_dac_channel(void \*psound_pre, void \*psound_later, void \*kick) bool unregist_dac_channel(void *psound) bool dac_cbuff_active(void *sound_hld) void dac_kick(void *sound_hld, void *pkick) void audio_dac_analog_vol(AUDIO_DAC_ANA_VOL vol_l, AUDIO_DAC_ANA_VOL vol_r) void audio_amux_analog_vol(AUDIO_DAC_AUMX_VOL vol_l, AUDIO_DAC_AUMX_VOL vol_r) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUDIO DAC相关函数 ################################ 函数void dac_mode_init(void) **************************************************************************************************** 此函数实现对DAC管理结构体和相关解码参数进行初始化,开机初始化调用一次即可。 函数void dac_init_api(u32 sr) **************************************************************************************************** 此函数实现对DAC硬件资源和相关寄存器进行初始化,此处会根据dac.h文件中宏定义DAC_CURR_MODE的值来选择开启DAC工作模式,开机初始化调用一次即可,其中参数: :: 1、sr:采样率,具体传参,参考表本章表15.1; 函数dac_sr_api(u32 sr) **************************************************************************************************** 采样率设置函数: :: 1、sr:采样率,具体传参,参考表本章表15.1; 函数void dac_off_api(void) **************************************************************************************************** 关闭dac数字部分的函数。 函数u8 dac_vol(char set, u8 vol) **************************************************************************************************** 音量设置函数: :: 1、set: ① ‘+’,增大一格数字音量; ② ‘-’,减小一个数字音量; ③ ‘r’,返回当前数字音量; ④ 0,传入0,直接将数字音量设置另一参数vol的值; 2、vol:0-31,当set为0时,直接设置为此音量,最大值为31; 3、返回值: 当前设置的数字音量值; 函数 bool dac_mute(bool mute) **************************************************************************************************** 静音函数: :: 1、mute: ① 1,静音; ② 0,解除静音; 2、返回值: 暂无意义; 函数 bool regist_dac_channel(void \*psound_pre, void \*psound_later, void \*kick) **************************************************************************************************** 注册数据流到AUDIO DAC管理框架中: :: 1、psound_pre:sound_out_obj指向的sound数据流,即注册给DAC的前一级sound; 2、psound_later:sound_out_obj指向的sound数据流,即注册给DAC的最后一级sound; 3、kick:触发函数; 4、返回值: 成功 true; 失败 false; 函数函数bool unregist_dac_channel(void \*psound) **************************************************************************************************** 将数据流从AUDIO DAC中注销掉: :: 1、psound:需要注销的sound_out_obj类型的数据流; 2、返回值: 成功 true; 失败 false; 函数void fifo_dac_fill(u8 \*buf, u32 len, AUDIO_TYPE type) **************************************************************************************************** 此函数实现将解码后的音频样点数据经过处理后推给DAC的缓存buf使DAC进行转换,其中参数: :: 1、buf:DAC即将要进行转换的解码样点数据缓存buf; 2、len:该buf的大小,默认为1k个byte,存有512个样点; 3、type: 数据流来源; 该接口实现将解码后的样点数据(存放于dac_mge.sound_later[i]->p_obuf中)经过处理后输出至DAC。DAC支持16bit精度,一个样点为2个byte。其具体操作如下: - ① DAC转换一次后,会在转换结束后调用该接口将新的数据样点传给DAC; - ② 该接口首先会找到正在解码播放的通道,并读取该解码器解码出来的样点buf; - ③ rptr[i]是解码读出的一个原始样点数据,可以读取该数组获得数据; - ④ sp_buf[sp_cnt]是经过音量处理后的样点数据,可以读取该数组获得数据; - ⑤ sp_buf[sp_cnt]中的数据为最终DAC进行转换的样点数据; - ⑥ 待样点数据全部处理完后,启动kick继续进行下一轮DAC转换; AUDIO APA模块特殊函数 ################################ 函数void set_apan_output_status(char val) **************************************************************************************************** 此函数实现控制APAN引脚输出高/低电平。 1、val:输出电平; - 0:低电平; - 1:高电平; 函数void set_apap_output_status(char val) **************************************************************************************************** 此函数实现控制APAP引脚输出高/低电平。 1、val:输出电平; - 0:低电平; - 1:高电平; 函数void apa_hardware_mute(u8 mute) **************************************************************************************************** 此函数实现控制APA硬件mute模块。 1、mute:APA模块mute配置; - 1:mute主APA模块; - 0:解MUTE;