137 lines
3.4 KiB
C
137 lines
3.4 KiB
C
#include "include.h"
|
||
#include "bsp_dac.h"
|
||
#include "app_variable.h"
|
||
uint8_t cfg_spk_mute_en = LOUDSPEAKER_MUTE_EN;
|
||
const u8 *dac_dvol_table;
|
||
|
||
AT(.rodata.dac)
|
||
const u16 dig_vol_tbl[61] = {
|
||
DIG_N0DB, DIG_N1DB, DIG_N2DB, DIG_N3DB, DIG_N4DB, DIG_N5DB, DIG_N6DB, DIG_N7DB,
|
||
DIG_N8DB, DIG_N9DB, DIG_N10DB, DIG_N11DB, DIG_N12DB, DIG_N13DB, DIG_N14DB, DIG_N15DB,
|
||
DIG_N16DB, DIG_N17DB, DIG_N18DB, DIG_N19DB, DIG_N20DB, DIG_N21DB, DIG_N22DB, DIG_N23DB,
|
||
DIG_N24DB, DIG_N25DB, DIG_N26DB, DIG_N27DB, DIG_N28DB, DIG_N29DB, DIG_N30DB, DIG_N31DB,
|
||
DIG_N32DB, DIG_N33DB, DIG_N34DB, DIG_N35DB, DIG_N36DB, DIG_N37DB, DIG_N38DB, DIG_N39DB,
|
||
DIG_N40DB, DIG_N41DB, DIG_N42DB, DIG_N43DB, DIG_N44DB, DIG_N45DB, DIG_N46DB, DIG_N47DB,
|
||
DIG_N48DB, DIG_N49DB, DIG_N50DB, DIG_N51DB, DIG_N52DB, DIG_N53DB, DIG_N54DB, DIG_N55DB,
|
||
DIG_N56DB, DIG_N57DB, DIG_N58DB, DIG_N59DB, DIG_N60DB,
|
||
};
|
||
|
||
AT(.rodata.dac)
|
||
const u8 dac_dvol_tbl_16[16 + 1] = {
|
||
60, 43, 32, 26, 24, 22, 20, 18, 16,
|
||
14, 12, 10, 8, 6, 4, 2, 0,
|
||
};
|
||
|
||
AT(.rodata.dac)
|
||
const u8 dac_dvol_tbl_32[32 + 1] = {
|
||
60, 50, 43, 38, 35, 30, 28, 26,
|
||
24, 23, 22, 21, 20, 19, 18, 17,
|
||
16, 15, 14, 13, 12, 11, 10, 9,
|
||
8, 7, 6, 5, 4, 3, 2, 1, 0,
|
||
};
|
||
|
||
AT(.text.bsp.dac)
|
||
void bsp_change_volume(u8 vol)
|
||
{
|
||
u8 level = 0;
|
||
|
||
if (vol <= VOL_MAX) {
|
||
level = dac_dvol_table[vol] + sys_cb.gain_offset;
|
||
if (level > 60) {
|
||
level = 60;
|
||
}
|
||
dac_set_dvol(dig_vol_tbl[level]);
|
||
}
|
||
}
|
||
|
||
AT(.text.bsp.dac)
|
||
bool bsp_set_volume(u8 vol)
|
||
{
|
||
|
||
bsp_change_volume(vol);
|
||
if (vol == SysVariable.vol) {
|
||
// gui_box_show_vol();
|
||
return false;
|
||
}
|
||
|
||
if (vol <= VOL_MAX) {
|
||
SysVariable.vol = vol;
|
||
// gui_box_show_vol();
|
||
// param_sys_vol_write();
|
||
sys_cb.cm_times = 0;
|
||
sys_cb.cm_vol_change = 1;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
AT(.com_text.dac)
|
||
void dac_set_mute_callback(u8 mute_flag)
|
||
{
|
||
if (mute_flag) {
|
||
bsp_loudspeaker_mute();
|
||
} else {
|
||
if (!sys_cb.mute) {
|
||
bsp_loudspeaker_unmute();
|
||
//DAC延时淡入,防止UNMUTE时间太短导致喇叭声音不全的问题
|
||
dac_unmute_set_delay(LOUDSPEAKER_UNMUTE_DELAY);
|
||
}
|
||
}
|
||
}
|
||
|
||
AT(.text.bsp.dac)
|
||
u8 bsp_volume_inc(u8 vol)
|
||
{
|
||
vol++;
|
||
if(vol > VOL_MAX)
|
||
vol = VOL_MAX;
|
||
return vol;
|
||
}
|
||
|
||
AT(.text.bsp.dac)
|
||
u8 bsp_volume_dec(u8 vol)
|
||
{
|
||
if(vol > 0)
|
||
vol--;
|
||
return vol;
|
||
}
|
||
|
||
AT(.text.dac)
|
||
void dac_set_anl_offset(u8 bt_call_flag)
|
||
{
|
||
if (bt_call_flag) {
|
||
sys_cb.gain_offset = BT_CALL_MAX_GAIN;
|
||
} else {
|
||
sys_cb.gain_offset = DAC_MAX_GAIN;
|
||
}
|
||
}
|
||
|
||
AT(.text.bsp.dac)
|
||
static void dac_set_vol_table(u8 vol_max)
|
||
{
|
||
if (vol_max == 16) {
|
||
dac_dvol_table = dac_dvol_tbl_16;
|
||
} else {
|
||
dac_dvol_table = dac_dvol_tbl_32;
|
||
}
|
||
}
|
||
|
||
AT(.text.bsp.dac)
|
||
void dac_init(void)
|
||
{
|
||
dac_set_vol_table(xcfg_cb.vol_max);
|
||
dac_set_anl_offset(0);
|
||
// printf("[%s] vol_max:%d, offset: %d\n", __func__, xcfg_cb.vol_max, sys_cb.gain_offset);
|
||
|
||
dac_obuf_init();
|
||
dac_power_on();
|
||
#if (DAC_OUT_SPR == DAC_OUT_48K)
|
||
DACDIGCON0 |= BIT(1); //dac out sample 48K
|
||
#endif
|
||
plugin_music_eq();
|
||
|
||
#if DAC_DNR_EN
|
||
dac_dnr_init(2, 0x18, 90, 0x10);
|
||
#endif
|
||
}
|
||
|