update mic detection logic

This commit is contained in:
Steven Dan
2026-04-29 16:19:14 +08:00
parent c297466a97
commit 7f0eb6b691

View File

@@ -2428,20 +2428,26 @@ void mute_handler(chanend c_mic_det)
p_ctl_mute <: 0xf; p_ctl_mute <: 0xf;
// mic detect: bit1=mic1 (插入=高, 拔出=低), bit2=mic2 (插入=低, 拔出=高) // mic detect: bit1=mic1 (插入=高, 拔出=低), bit2=mic2 (插入=低, 拔出=高)
c_mic_det <: (unsigned)MIC_DET_MUTE;
unsigned det_val; unsigned det_val;
p_ctl_det :> det_val; p_ctl_det :> det_val;
unsigned mic1_in = (det_val >> 1) & 1; // bit1: 1=inserted unsigned mic1_in = (det_val >> 1) & 1; // bit1: 1=inserted
unsigned mic2_in = ((det_val >> 2) & 1) ^ 1; // bit2: 0=inserted, invert unsigned mic2_in = ((det_val >> 2) & 1) ^ 1; // bit2: 0=inserted, invert
unsigned phone_in = ((det_val >> 3) & 1) ^ 1; // bit3: 0=inserted, invert
unsigned any_mic_in = mic1_in || mic2_in; unsigned any_mic_in = mic1_in || mic2_in;
unsigned prev_mic1_in = mic1_in; unsigned prev_mic1_in = mic1_in;
unsigned prev_mic2_in = mic2_in; unsigned prev_mic2_in = mic2_in;
unsigned prev_any_mic_in = any_mic_in; unsigned prev_any_mic_in = any_mic_in;
unsigned prev_phone_in = phone_in;
// 如果开机时全拔出发送mute // 如果开机时全拔出发送mute
if (!any_mic_in) {
c_mic_det <: (unsigned)MIC_DET_MUTE;
}
if (((det_val & 0b1110) == 0b1110) || ((det_val & 0b1110) == 0b1010) || ((det_val & 0b1110) == 0b0010)) {
// 有mic插入恢复mic音量状态
c_mic_det <: (unsigned)MIC_DET_UNMUTE;
debug_printf("mic stable -> unmute\n");
}
timer tmr; timer tmr;
unsigned time; unsigned time;
tmr :> time; tmr :> time;
@@ -2457,14 +2463,16 @@ void mute_handler(chanend c_mic_det)
p_ctl_det :> det_val; p_ctl_det :> det_val;
mic1_in = (det_val >> 1) & 1; mic1_in = (det_val >> 1) & 1;
mic2_in = ((det_val >> 2) & 1) ^ 1; mic2_in = ((det_val >> 2) & 1) ^ 1;
phone_in = ((det_val >> 3) & 1) ^ 1;
any_mic_in = mic1_in || mic2_in; any_mic_in = mic1_in || mic2_in;
// 检测单个mic插拔事件 // 检测单个mic插拔事件
unsigned mic1_changed = (mic1_in != prev_mic1_in); unsigned mic1_changed = (mic1_in != prev_mic1_in);
unsigned mic2_changed = (mic2_in != prev_mic2_in); unsigned mic2_changed = (mic2_in != prev_mic2_in);
unsigned any_changed = mic1_changed || mic2_changed; unsigned any_changed = mic1_changed || mic2_changed;
unsigned phone_changed = (phone_in != prev_phone_in);
if (any_changed) { if (any_changed || phone_changed) {
// 状态变化立即mute mic和DAC防止pop音 // 状态变化立即mute mic和DAC防止pop音
p_ctl_mute <: 0; p_ctl_mute <: 0;
c_mic_det <: (unsigned)MIC_DET_MUTE; c_mic_det <: (unsigned)MIC_DET_MUTE;
@@ -2486,12 +2494,25 @@ void mute_handler(chanend c_mic_det)
p_ctl_det :> det_val; p_ctl_det :> det_val;
mic1_in = (det_val >> 1) & 1; mic1_in = (det_val >> 1) & 1;
mic2_in = ((det_val >> 2) & 1) ^ 1; mic2_in = ((det_val >> 2) & 1) ^ 1;
phone_in = ((det_val >> 3) & 1) ^ 1;
any_mic_in = mic1_in || mic2_in; any_mic_in = mic1_in || mic2_in;
// 恢复DAC状态 // 恢复DAC状态
c_mic_det <: (unsigned)MIC_DET_DAC_UNMUTE; c_mic_det <: (unsigned)MIC_DET_DAC_UNMUTE;
if (any_mic_in) { #if 0
if ((any_mic_in && !phone_in) || (phone_in && mic2_in)) {
// 有mic插入恢复mic音量状态
c_mic_det <: (unsigned)MIC_DET_UNMUTE;
debug_printf("mic stable -> unmute\n");
}
// 全拔出则保持mic mute
delay_milliseconds(200);
#endif
if (((det_val & 0b1110) == 0b1110) || ((det_val & 0b1110) == 0b1010) || ((det_val & 0b1110) == 0b0010)) {
// 有mic插入恢复mic音量状态 // 有mic插入恢复mic音量状态
c_mic_det <: (unsigned)MIC_DET_UNMUTE; c_mic_det <: (unsigned)MIC_DET_UNMUTE;
debug_printf("mic stable -> unmute\n"); debug_printf("mic stable -> unmute\n");
@@ -2501,7 +2522,7 @@ void mute_handler(chanend c_mic_det)
prev_mic1_in = mic1_in; prev_mic1_in = mic1_in;
prev_mic2_in = mic2_in; prev_mic2_in = mic2_in;
prev_any_mic_in = any_mic_in; prev_any_mic_in = any_mic_in;
prev_phone_in = phone_in;
// 重新同步timer // 重新同步timer
tmr :> time; tmr :> time;
time += MIC_DET_POLL_MS * 100000; time += MIC_DET_POLL_MS * 100000;