update codec init in remote
This commit is contained in:
@@ -49,8 +49,10 @@ unsigned g_volume_level = 60, g_saved_volume_level = 60;
|
|||||||
unsigned g_request_volume_set = 0;
|
unsigned g_request_volume_set = 0;
|
||||||
unsigned g_dac_vol = 0xB8;
|
unsigned g_dac_vol = 0xB8;
|
||||||
unsigned g_adc_vol = 0x25;
|
unsigned g_adc_vol = 0x25;
|
||||||
|
// 改动原因:CODEC 在 AudioHwRemote2 内完成初始化后置 1,供其它逻辑确认 NAU88 已就绪。
|
||||||
|
unsigned g_codec_init_done = 0;
|
||||||
unsigned g_adc_loop = 0;
|
unsigned g_adc_loop = 0;
|
||||||
unsigned g_mute_switch = 0; // 改动原因:与g_adc_loop一致,记录MCU回传的静音开关状态并用于HID变化上报(k6 UART在tile0可直接设置)
|
unsigned g_mute_switch = 1; // 改动原因:0=静音(亮红)、1=非静音(灭红);默认1非静音,与LED/按键一致;UART/HID/Flash可覆盖
|
||||||
unsigned g_led_enable = 0;
|
unsigned g_led_enable = 0;
|
||||||
unsigned g_dnr_enable = 1;
|
unsigned g_dnr_enable = 1;
|
||||||
unsigned g_3d_enable = 1;
|
unsigned g_3d_enable = 1;
|
||||||
@@ -241,6 +243,7 @@ void switch_mode_by_c1_mode(unsigned c1_mode, unsigned force_reboot)
|
|||||||
reboot_need = 1;
|
reboot_need = 1;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
#if !BYPASS_UAC1
|
#if !BYPASS_UAC1
|
||||||
SetRoleSwitchFlag(MODE_BYPASS_UAC1);
|
SetRoleSwitchFlag(MODE_BYPASS_UAC1);
|
||||||
@@ -248,7 +251,7 @@ void switch_mode_by_c1_mode(unsigned c1_mode, unsigned force_reboot)
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif // UAC1_MODE == 1
|
||||||
|
|
||||||
debug_printf("switch_mode_by_c1_mode: reboot_need = %d, force_reboot = %d\n", reboot_need, force_reboot);
|
debug_printf("switch_mode_by_c1_mode: reboot_need = %d, force_reboot = %d\n", reboot_need, force_reboot);
|
||||||
debug_printf("switch_mode_by_c1_mode: c1_mode = %d\n", c1_mode);
|
debug_printf("switch_mode_by_c1_mode: c1_mode = %d\n", c1_mode);
|
||||||
@@ -443,28 +446,6 @@ uint8_t samp_support(unsigned samFreq)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void codec_init(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Setup CODEC
|
|
||||||
*/
|
|
||||||
uint16_t addr = 0, val;
|
|
||||||
for (int i = 0; i < sizeof(nau88c22_registers) / sizeof(nau88c22_registers[0]); i++) {
|
|
||||||
addr = nau88c22_registers[i][1];
|
|
||||||
val = (nau88c22_registers[i][2] << 8) | nau88c22_registers[i][3];
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, addr, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ADCL PGA default setting
|
|
||||||
if(NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE == NAU88L21_PGA_GAIN_REG_MAX_VALUE)
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x007E, (NAU88L21_PGA_GAIN_REG_MAX_VALUE-1) << 8);
|
|
||||||
else
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x007E, NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE << 8);
|
|
||||||
|
|
||||||
debug_printf("Codec init finished\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void dac_volume(signed level, client interface i2c_master_if i2c)
|
void dac_volume(signed level, client interface i2c_master_if i2c)
|
||||||
{
|
{
|
||||||
// 1dB/步: level 范围 -28 ~ 0,对应寄存器 0xcf-28=0xb3 ~ 0xcf
|
// 1dB/步: level 范围 -28 ~ 0,对应寄存器 0xcf-28=0xb3 ~ 0xcf
|
||||||
@@ -498,6 +479,47 @@ void mic_volume(unsigned level, client interface i2c_master_if i2c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 改动原因:CODEC 初始化改在 AudioHwRemote2 的 I2C 线程内执行(原 AudioHwInit 经 channel 转发易与主循环竞态);
|
||||||
|
// 写完寄存器表及 0x0003/0x002B/0x002C 后,立即把 Flash 恢复的 DAC 音量与 mic mute 写入芯片。
|
||||||
|
static void codec_init_on_i2c(client interface i2c_master_if i2c)
|
||||||
|
{
|
||||||
|
uint16_t addr = 0, val;
|
||||||
|
unsigned boot_dac_vol, boot_mute_switch, boot_adc_vol;
|
||||||
|
unsigned boot_dac_reg, boot_effective_adc_vol;
|
||||||
|
|
||||||
|
for (int i = 0; i < sizeof(nau88c22_registers) / sizeof(nau88c22_registers[0]); i++) {
|
||||||
|
addr = nau88c22_registers[i][1];
|
||||||
|
val = (nau88c22_registers[i][2] << 8) | nau88c22_registers[i][3];
|
||||||
|
NAU88C22_REGWRITE(addr, val, i2c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ADCL PGA default setting
|
||||||
|
if (NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE == NAU88L21_PGA_GAIN_REG_MAX_VALUE)
|
||||||
|
NAU88C22_REGWRITE(0x007E, (NAU88L21_PGA_GAIN_REG_MAX_VALUE - 1) << 8, i2c);
|
||||||
|
else
|
||||||
|
NAU88C22_REGWRITE(0x007E, NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE << 8, i2c);
|
||||||
|
|
||||||
|
// 改动原因:原 AudioHwInit 在 codec_init 之后的附加寄存器写,一并挪到本线程直接 I2C 写。
|
||||||
|
NAU88C22_REGWRITE(0x0003, 0x0053, i2c);
|
||||||
|
NAU88C22_REGWRITE(0x002B, 0x4002, i2c);
|
||||||
|
NAU88C22_REGWRITE(0x002C, 0x0082, i2c);
|
||||||
|
|
||||||
|
GET_SHARED_GLOBAL(boot_dac_vol, g_dac_vol);
|
||||||
|
GET_SHARED_GLOBAL(boot_mute_switch, g_mute_switch);
|
||||||
|
GET_SHARED_GLOBAL(boot_adc_vol, g_adc_vol);
|
||||||
|
|
||||||
|
boot_dac_reg = boot_dac_vol & 0xff;
|
||||||
|
NAU88C22_REGWRITE(0x0034, ((boot_dac_reg << 8) | boot_dac_reg), i2c);
|
||||||
|
|
||||||
|
// 改动原因:与定时器路径一致——g_mute_switch==0 为静音,否则用 g_adc_vol。
|
||||||
|
boot_effective_adc_vol = (boot_mute_switch == 0) ? 0 : boot_adc_vol;
|
||||||
|
mic_volume(boot_effective_adc_vol, i2c);
|
||||||
|
|
||||||
|
SET_SHARED_GLOBAL(g_codec_init_done, 1);
|
||||||
|
debug_printf("Codec init on AudioHwRemote2 done: dac=0x%x adc_eff=%d mute=%d\n",
|
||||||
|
boot_dac_reg, boot_effective_adc_vol, boot_mute_switch);
|
||||||
|
}
|
||||||
|
|
||||||
void save_value(unsigned char * unsafe path, unsigned char value);
|
void save_value(unsigned char * unsafe path, unsigned char value);
|
||||||
unsigned char load_value(unsigned char * unsafe path);
|
unsigned char load_value(unsigned char * unsafe path);
|
||||||
#define C1_MODE_INFO_PATH "c1_mode"
|
#define C1_MODE_INFO_PATH "c1_mode"
|
||||||
@@ -613,8 +635,6 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
|
|||||||
else
|
else
|
||||||
init_dac_vol = loaded_dac_vol;
|
init_dac_vol = loaded_dac_vol;
|
||||||
SET_SHARED_GLOBAL(g_dac_vol, init_dac_vol);
|
SET_SHARED_GLOBAL(g_dac_vol, init_dac_vol);
|
||||||
// 改动原因:强制首轮定时器路径执行 NAU88C22 写音量(含 mute=0 时 old_dac_vol 初值也为 0 的情况)。
|
|
||||||
old_dac_vol = ~init_dac_vol;
|
|
||||||
dac_vol_persist_snapshot = init_dac_vol;
|
dac_vol_persist_snapshot = init_dac_vol;
|
||||||
dac_vol_persist_deadline = 0;
|
dac_vol_persist_deadline = 0;
|
||||||
}
|
}
|
||||||
@@ -648,7 +668,22 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
|
|||||||
i_c1_led_ctrl.set_mic_dnr_state(init_dnr_for_led);
|
i_c1_led_ctrl.set_mic_dnr_state(init_dnr_for_led);
|
||||||
last_mute_switch_for_led = init_mute_for_led;
|
last_mute_switch_for_led = init_mute_for_led;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 改动原因:等待并行 AudioHwInit 完成 MCLK/PLL(约 100ms+10ms)后再初始化 CODEC,避免上电时序不足。
|
||||||
|
delay_milliseconds(110);
|
||||||
|
codec_init_on_i2c(i2c);
|
||||||
|
{
|
||||||
|
unsigned boot_dac_vol, boot_mute_switch, boot_adc_vol;
|
||||||
|
unsigned boot_effective_adc_vol;
|
||||||
|
GET_SHARED_GLOBAL(boot_dac_vol, g_dac_vol);
|
||||||
|
GET_SHARED_GLOBAL(boot_mute_switch, g_mute_switch);
|
||||||
|
GET_SHARED_GLOBAL(boot_adc_vol, g_adc_vol);
|
||||||
|
old_dac_vol = boot_dac_vol;
|
||||||
|
old_dac_jack_force_mute = 0;
|
||||||
|
boot_effective_adc_vol = (boot_mute_switch == 0) ? 0 : boot_adc_vol;
|
||||||
|
old_adc_vol = boot_effective_adc_vol;
|
||||||
|
}
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
select
|
select
|
||||||
@@ -827,8 +862,9 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
|
|||||||
i_c1_led_ctrl.set_mic_mute_state(mute_switch);
|
i_c1_led_ctrl.set_mic_mute_state(mute_switch);
|
||||||
last_mute_switch_for_led = mute_switch;
|
last_mute_switch_for_led = mute_switch;
|
||||||
}
|
}
|
||||||
// 改动原因:MIC 物理拔出时 mic_jack_adc_mute 强制 ADC 静音;插入 500ms 内仍保持静音,之后恢复 g_mute_switch 与 g_adc_vol 决定的电平(不触碰 LED 条件 mute_switch)。
|
// 改动原因:MIC 物理拔出时 mic_jack_adc_mute 强制 ADC 静音;插入 500ms 后按 g_mute_switch 恢复:
|
||||||
unsigned effective_adc_vol = mic_jack_adc_mute ? 0 : ((mute_switch != 0) ? 0 : adc_vol);
|
// g_mute_switch==0 静音→effective_adc_vol=0;==1 非静音→用 g_adc_vol。此前误写 mute_switch!=0 导致与按键/LED 相反。
|
||||||
|
unsigned effective_adc_vol = mic_jack_adc_mute ? 0 : ((mute_switch == 0) ? 0 : adc_vol);
|
||||||
|
|
||||||
// 改动原因:耳机拔出或 MIC 插/拔防 pop 时写 C1_DAC_MUTE(不改 g_dac_vol);各事件满 500ms 或互斥清除后按 g_dac_vol 写回 0x0034。
|
// 改动原因:耳机拔出或 MIC 插/拔防 pop 时写 C1_DAC_MUTE(不改 g_dac_vol);各事件满 500ms 或互斥清除后按 g_dac_vol 写回 0x0034。
|
||||||
{
|
{
|
||||||
@@ -905,10 +941,13 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
|
|||||||
if (current_mute_switch == 0)
|
if (current_mute_switch == 0)
|
||||||
{
|
{
|
||||||
mic_volume(0, i2c);
|
mic_volume(0, i2c);
|
||||||
|
// 改动原因:同步 old_adc_vol,避免定时器下一轮仍按旧值误判或与按键写入冲突。
|
||||||
|
old_adc_vol = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mic_volume(effective_adc_vol, i2c);
|
mic_volume(effective_adc_vol, i2c);
|
||||||
|
old_adc_vol = effective_adc_vol;
|
||||||
}
|
}
|
||||||
SET_SHARED_GLOBAL(g_mute_switch, current_mute_switch);
|
SET_SHARED_GLOBAL(g_mute_switch, current_mute_switch);
|
||||||
// 改动原因:静音状态变化后立即保存到Flash,保证断电后恢复正确的静音灯状态。
|
// 改动原因:静音状态变化后立即保存到Flash,保证断电后恢复正确的静音灯状态。
|
||||||
@@ -1610,6 +1649,7 @@ void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led
|
|||||||
* use a channel to communicate CODEC reg read/writes to a remote core */
|
* use a channel to communicate CODEC reg read/writes to a remote core */
|
||||||
void AudioHwInit()
|
void AudioHwInit()
|
||||||
{
|
{
|
||||||
|
set_gpio(P_GPIO_MUTE, MUTE);
|
||||||
debug_printf("AudioHwInit\n");
|
debug_printf("AudioHwInit\n");
|
||||||
delay_milliseconds(100);
|
delay_milliseconds(100);
|
||||||
|
|
||||||
@@ -1629,18 +1669,12 @@ void AudioHwInit()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set_gpio(P_GPIO_MUTE, MUTE);
|
|
||||||
debug_printf("mute_dac ======== \n");
|
|
||||||
|
|
||||||
delay_milliseconds(10);
|
delay_milliseconds(10);
|
||||||
|
|
||||||
codec_init();
|
// 改动原因:NAU88 CODEC 寄存器初始化已移至 AudioHwRemote2(codec_init_on_i2c),
|
||||||
|
// 此处仅配置 MCLK/PLL;音量与 mic mute 在 Remote2 完成 init 后立即写入。
|
||||||
debug_printf("AudioHwInit completed\n");
|
debug_printf("AudioHwInit completed (codec init in AudioHwRemote2)\n");
|
||||||
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x0053);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4002);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void unmute_dac(void)
|
void unmute_dac(void)
|
||||||
@@ -1887,39 +1921,6 @@ void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode,
|
|||||||
sw_pll_fixed_clock(MCLK_48);
|
sw_pll_fixed_clock(MCLK_48);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (samFreq)
|
|
||||||
{
|
|
||||||
case 192000:
|
|
||||||
case 176400:
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x00D0);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4000);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082);
|
|
||||||
break;
|
|
||||||
case 96000:
|
|
||||||
case 88200:
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x0092);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4001);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082);
|
|
||||||
break;
|
|
||||||
case 44100:
|
|
||||||
case 48000:
|
|
||||||
default:
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x0053);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4002);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (led_count == 0)
|
|
||||||
{
|
|
||||||
led_count = 1;
|
|
||||||
}
|
|
||||||
else if (led_count == 1)
|
|
||||||
{
|
|
||||||
led_count = 2;
|
|
||||||
// SET_SHARED_GLOBAL(g_update_led, 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioHwConfig_UnMute(void)
|
void AudioHwConfig_UnMute(void)
|
||||||
|
|||||||
@@ -49,8 +49,10 @@ unsigned g_volume_level = 60, g_saved_volume_level = 60;
|
|||||||
unsigned g_request_volume_set = 0;
|
unsigned g_request_volume_set = 0;
|
||||||
unsigned g_dac_vol = 0xB8;
|
unsigned g_dac_vol = 0xB8;
|
||||||
unsigned g_adc_vol = 0x25;
|
unsigned g_adc_vol = 0x25;
|
||||||
|
// 改动原因:CODEC 在 AudioHwRemote2 内完成初始化后置 1,供其它逻辑确认 NAU88 已就绪。
|
||||||
|
unsigned g_codec_init_done = 0;
|
||||||
unsigned g_adc_loop = 0;
|
unsigned g_adc_loop = 0;
|
||||||
unsigned g_mute_switch = 0; // 改动原因:与g_adc_loop一致,记录MCU回传的静音开关状态并用于HID变化上报(k6 UART在tile0可直接设置)
|
unsigned g_mute_switch = 1; // 改动原因:0=静音(亮红)、1=非静音(灭红);默认1非静音,与LED/按键一致;UART/HID/Flash可覆盖
|
||||||
unsigned g_led_enable = 0;
|
unsigned g_led_enable = 0;
|
||||||
unsigned g_dnr_enable = 1;
|
unsigned g_dnr_enable = 1;
|
||||||
unsigned g_3d_enable = 1;
|
unsigned g_3d_enable = 1;
|
||||||
@@ -239,8 +241,9 @@ void switch_mode_by_c1_mode(unsigned c1_mode, unsigned force_reboot)
|
|||||||
#if !FPS_UAC1
|
#if !FPS_UAC1
|
||||||
SetRoleSwitchFlag(MODE_FPS_UAC1);
|
SetRoleSwitchFlag(MODE_FPS_UAC1);
|
||||||
reboot_need = 1;
|
reboot_need = 1;
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
#if !BYPASS_UAC1
|
#if !BYPASS_UAC1
|
||||||
SetRoleSwitchFlag(MODE_BYPASS_UAC1);
|
SetRoleSwitchFlag(MODE_BYPASS_UAC1);
|
||||||
@@ -443,28 +446,6 @@ uint8_t samp_support(unsigned samFreq)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void codec_init(void)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Setup CODEC
|
|
||||||
*/
|
|
||||||
uint16_t addr = 0, val;
|
|
||||||
for (int i = 0; i < sizeof(nau88c22_registers) / sizeof(nau88c22_registers[0]); i++) {
|
|
||||||
addr = nau88c22_registers[i][1];
|
|
||||||
val = (nau88c22_registers[i][2] << 8) | nau88c22_registers[i][3];
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, addr, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ADCL PGA default setting
|
|
||||||
if(NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE == NAU88L21_PGA_GAIN_REG_MAX_VALUE)
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x007E, (NAU88L21_PGA_GAIN_REG_MAX_VALUE-1) << 8);
|
|
||||||
else
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x007E, NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE << 8);
|
|
||||||
|
|
||||||
debug_printf("Codec init finished\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void dac_volume(signed level, client interface i2c_master_if i2c)
|
void dac_volume(signed level, client interface i2c_master_if i2c)
|
||||||
{
|
{
|
||||||
// 1dB/步: level 范围 -28 ~ 0,对应寄存器 0xcf-28=0xb3 ~ 0xcf
|
// 1dB/步: level 范围 -28 ~ 0,对应寄存器 0xcf-28=0xb3 ~ 0xcf
|
||||||
@@ -498,6 +479,47 @@ void mic_volume(unsigned level, client interface i2c_master_if i2c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 改动原因:CODEC 初始化改在 AudioHwRemote2 的 I2C 线程内执行(原 AudioHwInit 经 channel 转发易与主循环竞态);
|
||||||
|
// 写完寄存器表及 0x0003/0x002B/0x002C 后,立即把 Flash 恢复的 DAC 音量与 mic mute 写入芯片。
|
||||||
|
static void codec_init_on_i2c(client interface i2c_master_if i2c)
|
||||||
|
{
|
||||||
|
uint16_t addr = 0, val;
|
||||||
|
unsigned boot_dac_vol, boot_mute_switch, boot_adc_vol;
|
||||||
|
unsigned boot_dac_reg, boot_effective_adc_vol;
|
||||||
|
|
||||||
|
for (int i = 0; i < sizeof(nau88c22_registers) / sizeof(nau88c22_registers[0]); i++) {
|
||||||
|
addr = nau88c22_registers[i][1];
|
||||||
|
val = (nau88c22_registers[i][2] << 8) | nau88c22_registers[i][3];
|
||||||
|
NAU88C22_REGWRITE(addr, val, i2c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ADCL PGA default setting
|
||||||
|
if (NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE == NAU88L21_PGA_GAIN_REG_MAX_VALUE)
|
||||||
|
NAU88C22_REGWRITE(0x007E, (NAU88L21_PGA_GAIN_REG_MAX_VALUE - 1) << 8, i2c);
|
||||||
|
else
|
||||||
|
NAU88C22_REGWRITE(0x007E, NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE << 8, i2c);
|
||||||
|
|
||||||
|
// 改动原因:原 AudioHwInit 在 codec_init 之后的附加寄存器写,一并挪到本线程直接 I2C 写。
|
||||||
|
NAU88C22_REGWRITE(0x0003, 0x0053, i2c);
|
||||||
|
NAU88C22_REGWRITE(0x002B, 0x4002, i2c);
|
||||||
|
NAU88C22_REGWRITE(0x002C, 0x0082, i2c);
|
||||||
|
|
||||||
|
GET_SHARED_GLOBAL(boot_dac_vol, g_dac_vol);
|
||||||
|
GET_SHARED_GLOBAL(boot_mute_switch, g_mute_switch);
|
||||||
|
GET_SHARED_GLOBAL(boot_adc_vol, g_adc_vol);
|
||||||
|
|
||||||
|
boot_dac_reg = boot_dac_vol & 0xff;
|
||||||
|
NAU88C22_REGWRITE(0x0034, ((boot_dac_reg << 8) | boot_dac_reg), i2c);
|
||||||
|
|
||||||
|
// 改动原因:与定时器路径一致——g_mute_switch==0 为静音,否则用 g_adc_vol。
|
||||||
|
boot_effective_adc_vol = (boot_mute_switch == 0) ? 0 : boot_adc_vol;
|
||||||
|
mic_volume(boot_effective_adc_vol, i2c);
|
||||||
|
|
||||||
|
SET_SHARED_GLOBAL(g_codec_init_done, 1);
|
||||||
|
debug_printf("Codec init on AudioHwRemote2 done: dac=0x%x adc_eff=%d mute=%d\n",
|
||||||
|
boot_dac_reg, boot_effective_adc_vol, boot_mute_switch);
|
||||||
|
}
|
||||||
|
|
||||||
void save_value(unsigned char * unsafe path, unsigned char value);
|
void save_value(unsigned char * unsafe path, unsigned char value);
|
||||||
unsigned char load_value(unsigned char * unsafe path);
|
unsigned char load_value(unsigned char * unsafe path);
|
||||||
#define C1_MODE_INFO_PATH "c1_mode"
|
#define C1_MODE_INFO_PATH "c1_mode"
|
||||||
@@ -616,8 +638,6 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
|
|||||||
else
|
else
|
||||||
init_dac_vol = loaded_dac_vol;
|
init_dac_vol = loaded_dac_vol;
|
||||||
SET_SHARED_GLOBAL(g_dac_vol, init_dac_vol);
|
SET_SHARED_GLOBAL(g_dac_vol, init_dac_vol);
|
||||||
// 改动原因:强制首轮定时器路径执行 NAU88C22 写音量(含 mute=0 时 old_dac_vol 初值也为 0 的情况)。
|
|
||||||
old_dac_vol = ~init_dac_vol;
|
|
||||||
dac_vol_persist_snapshot = init_dac_vol;
|
dac_vol_persist_snapshot = init_dac_vol;
|
||||||
dac_vol_persist_deadline = 0;
|
dac_vol_persist_deadline = 0;
|
||||||
}
|
}
|
||||||
@@ -651,7 +671,22 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
|
|||||||
i_c1_led_ctrl.set_mic_dnr_state(init_dnr_for_led);
|
i_c1_led_ctrl.set_mic_dnr_state(init_dnr_for_led);
|
||||||
last_mute_switch_for_led = init_mute_for_led;
|
last_mute_switch_for_led = init_mute_for_led;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 改动原因:等待并行 AudioHwInit 完成 MCLK/PLL(约 100ms+10ms)后再初始化 CODEC,避免上电时序不足。
|
||||||
|
delay_milliseconds(110);
|
||||||
|
codec_init_on_i2c(i2c);
|
||||||
|
{
|
||||||
|
unsigned boot_dac_vol, boot_mute_switch, boot_adc_vol;
|
||||||
|
unsigned boot_effective_adc_vol;
|
||||||
|
GET_SHARED_GLOBAL(boot_dac_vol, g_dac_vol);
|
||||||
|
GET_SHARED_GLOBAL(boot_mute_switch, g_mute_switch);
|
||||||
|
GET_SHARED_GLOBAL(boot_adc_vol, g_adc_vol);
|
||||||
|
old_dac_vol = boot_dac_vol;
|
||||||
|
old_dac_jack_force_mute = 0;
|
||||||
|
boot_effective_adc_vol = (boot_mute_switch == 0) ? 0 : boot_adc_vol;
|
||||||
|
old_adc_vol = boot_effective_adc_vol;
|
||||||
|
}
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
select
|
select
|
||||||
@@ -830,8 +865,9 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
|
|||||||
i_c1_led_ctrl.set_mic_mute_state(mute_switch);
|
i_c1_led_ctrl.set_mic_mute_state(mute_switch);
|
||||||
last_mute_switch_for_led = mute_switch;
|
last_mute_switch_for_led = mute_switch;
|
||||||
}
|
}
|
||||||
// 改动原因:MIC 物理拔出时 mic_jack_adc_mute 强制 ADC 静音;插入 500ms 内仍保持静音,之后恢复 g_mute_switch 与 g_adc_vol 决定的电平(不触碰 LED 条件 mute_switch)。
|
// 改动原因:MIC 物理拔出时 mic_jack_adc_mute 强制 ADC 静音;插入 500ms 后按 g_mute_switch 恢复:
|
||||||
unsigned effective_adc_vol = mic_jack_adc_mute ? 0 : ((mute_switch != 0) ? 0 : adc_vol);
|
// g_mute_switch==0 静音→effective_adc_vol=0;==1 非静音→用 g_adc_vol。此前误写 mute_switch!=0 导致与按键/LED 相反。
|
||||||
|
unsigned effective_adc_vol = mic_jack_adc_mute ? 0 : ((mute_switch == 0) ? 0 : adc_vol);
|
||||||
|
|
||||||
// 改动原因:耳机拔出或 MIC 插/拔防 pop 时写 C1_DAC_MUTE(不改 g_dac_vol);各事件满 500ms 或互斥清除后按 g_dac_vol 写回 0x0034。
|
// 改动原因:耳机拔出或 MIC 插/拔防 pop 时写 C1_DAC_MUTE(不改 g_dac_vol);各事件满 500ms 或互斥清除后按 g_dac_vol 写回 0x0034。
|
||||||
{
|
{
|
||||||
@@ -908,10 +944,13 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
|
|||||||
if (current_mute_switch == 0)
|
if (current_mute_switch == 0)
|
||||||
{
|
{
|
||||||
mic_volume(0, i2c);
|
mic_volume(0, i2c);
|
||||||
|
// 改动原因:同步 old_adc_vol,避免定时器下一轮仍按旧值误判或与按键写入冲突。
|
||||||
|
old_adc_vol = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mic_volume(effective_adc_vol, i2c);
|
mic_volume(effective_adc_vol, i2c);
|
||||||
|
old_adc_vol = effective_adc_vol;
|
||||||
}
|
}
|
||||||
SET_SHARED_GLOBAL(g_mute_switch, current_mute_switch);
|
SET_SHARED_GLOBAL(g_mute_switch, current_mute_switch);
|
||||||
// 改动原因:静音状态变化后立即保存到Flash,保证断电后恢复正确的静音灯状态。
|
// 改动原因:静音状态变化后立即保存到Flash,保证断电后恢复正确的静音灯状态。
|
||||||
@@ -1613,6 +1652,7 @@ void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led
|
|||||||
* use a channel to communicate CODEC reg read/writes to a remote core */
|
* use a channel to communicate CODEC reg read/writes to a remote core */
|
||||||
void AudioHwInit()
|
void AudioHwInit()
|
||||||
{
|
{
|
||||||
|
set_gpio(P_GPIO_MUTE, MUTE);
|
||||||
debug_printf("AudioHwInit\n");
|
debug_printf("AudioHwInit\n");
|
||||||
delay_milliseconds(100);
|
delay_milliseconds(100);
|
||||||
|
|
||||||
@@ -1632,18 +1672,12 @@ void AudioHwInit()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set_gpio(P_GPIO_MUTE, MUTE);
|
|
||||||
debug_printf("mute_dac ======== \n");
|
|
||||||
|
|
||||||
delay_milliseconds(10);
|
delay_milliseconds(10);
|
||||||
|
|
||||||
codec_init();
|
// 改动原因:NAU88 CODEC 寄存器初始化已移至 AudioHwRemote2(codec_init_on_i2c),
|
||||||
|
// 此处仅配置 MCLK/PLL;音量与 mic mute 在 Remote2 完成 init 后立即写入。
|
||||||
debug_printf("AudioHwInit completed\n");
|
debug_printf("AudioHwInit completed (codec init in AudioHwRemote2)\n");
|
||||||
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x0053);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4002);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void unmute_dac(void)
|
void unmute_dac(void)
|
||||||
@@ -1890,39 +1924,6 @@ void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode,
|
|||||||
sw_pll_fixed_clock(MCLK_48);
|
sw_pll_fixed_clock(MCLK_48);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (samFreq)
|
|
||||||
{
|
|
||||||
case 192000:
|
|
||||||
case 176400:
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x00D0);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4000);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082);
|
|
||||||
break;
|
|
||||||
case 96000:
|
|
||||||
case 88200:
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x0092);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4001);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082);
|
|
||||||
break;
|
|
||||||
case 44100:
|
|
||||||
case 48000:
|
|
||||||
default:
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x0003, 0x0053);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002B, 0x4002);
|
|
||||||
CODEC_REGWRITE(NAU88_I2C_DEVICE_ADDR, 0x002C, 0x0082);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (led_count == 0)
|
|
||||||
{
|
|
||||||
led_count = 1;
|
|
||||||
}
|
|
||||||
else if (led_count == 1)
|
|
||||||
{
|
|
||||||
led_count = 2;
|
|
||||||
// SET_SHARED_GLOBAL(g_update_led, 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioHwConfig_UnMute(void)
|
void AudioHwConfig_UnMute(void)
|
||||||
|
|||||||
Reference in New Issue
Block a user