update codec init in remote

This commit is contained in:
Steven Dan
2026-05-22 23:20:47 +08:00
parent e365053994
commit c62f83a3b8
2 changed files with 144 additions and 142 deletions

View File

@@ -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 寄存器初始化已移至 AudioHwRemote2codec_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)

View File

@@ -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 寄存器初始化已移至 AudioHwRemote2codec_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)