2. 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

表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

表2 AUDIO_DAC采样率支持情况

AUDIO DAC 工作模式:

AW30N AUDIO 工作模式

DAC

单声道单端DAC

APA

单声道单端APA

单声道差分APA

ALINK

双声道 Alink

表3 AUDIO_DAC工作模式


2.1. 《app_config.c》中的开机默认配置

Audio公共部分和AUDIO DAC包含以下配置:
  1. vcm外挂电容;

  2. 音频系统低压配置;


2.2. 《audio_dac.h》中的开机默认配置

在audio_dac.h的宏定里面主要有以下:

  • 1、选择音频 通过 内置Class-D功放的APA模块 或者 模拟DAC模块输出 或者 Audio_Link模块输出;

"音频输出选择“

音频输出选择

2.2.1. APA工作模式

APA工作模式

工作模式特点

MODE1

支持单端,单端输出性能好

MODE2

支持差分,差分输出性能好

MODE3

暂不支持

工作模式可根据图2.1所示,在《apa.h》文件中的 AUDAC_OUTPUT_MODE 来选择:

"audio apa工作模式选择“

audio apa工作模式选择

APA的驱动方式有:

  1. 差分直推喇叭(推荐使用MODE2)
    该驱动方式对应MODE1、MODE2模式,通过APAP和APAN引脚输出,内置功放。
    "差分直推喇叭示意图“

    差分直推喇叭示意图

  2. 单端隔直推功放(推荐使用MODE1)
    该驱动方式对应MODE1模式,通过APAP、APAN引脚输出推功放(不支持立体声)。
    "单端隔直推功放原理图“

    单端隔直推功放原理图


2.2.2. 模拟DAC工作模式

  1. 单端隔直推功放

    该驱动方式在AW30N通过PA5引脚输出,需要外接功放芯片。 注:部分封装没有引出DAC引脚,不可使用RDAC功能!

    "单端隔直推功放原理图“

    dac单端隔直推功放原理图


2.3. 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 管理框架对应的结构体。

"图5.1 audio dac管理框架“

图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)

2.4. AUDIO DAC相关函数

2.4.1. 函数void dac_mode_init(void)

此函数实现对DAC管理结构体和相关解码参数进行初始化,开机初始化调用一次即可。

2.4.2. 函数void dac_init_api(u32 sr)

此函数实现对DAC硬件资源和相关寄存器进行初始化,此处会根据dac.h文件中宏定义DAC_CURR_MODE的值来选择开启DAC工作模式,开机初始化调用一次即可,其中参数:

1、sr:采样率,具体传参,参考表本章表15.1;

2.4.3. 函数dac_sr_api(u32 sr)

采样率设置函数:

1、sr:采样率,具体传参,参考表本章表15.1;

2.4.4. 函数void dac_off_api(void)

关闭dac数字部分的函数。

2.4.5. 函数u8 dac_vol(char set, u8 vol)

音量设置函数:

1、set:
    ① ‘+’,增大一格数字音量;
    ② ‘-’,减小一个数字音量;
    ③ ‘r’,返回当前数字音量;
    ④ 0,传入0,直接将数字音量设置另一参数vol的值;
2、vol:0-31,当set为0时,直接设置为此音量,最大值为31;
3、返回值:
    当前设置的数字音量值;

2.4.6. 函数 bool dac_mute(bool mute)

静音函数:

1、mute:
① 1,静音;
② 0,解除静音;
2、返回值:
    暂无意义;

2.4.7. 函数 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;

2.4.8. 函数函数bool unregist_dac_channel(void *psound)

将数据流从AUDIO DAC中注销掉:

1、psound:需要注销的sound_out_obj类型的数据流;
2、返回值:
    成功 true;
    失败 false;

2.4.9. 函数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转换;

2.5. AUDIO APA模块特殊函数

2.5.1. 函数void set_apan_output_status(char val)

此函数实现控制APAN引脚输出高/低电平。

1、val:输出电平;
  • 0:低电平;

  • 1:高电平;

2.5.2. 函数void set_apap_output_status(char val)

此函数实现控制APAP引脚输出高/低电平。

1、val:输出电平;
  • 0:低电平;

  • 1:高电平;

2.5.3. 函数void apa_hardware_mute(u8 mute)

此函数实现控制APA硬件mute模块。

1、mute:APA模块mute配置;
  • 1:mute主APA模块;

  • 0:解MUTE;