output low for 100ms when insertion

This commit is contained in:
Steven Dan
2026-04-11 12:44:36 +08:00
parent f6e4dd55ab
commit 6678d21d9d

View File

@@ -156,7 +156,7 @@ port p_sda = PORT_I2C_SDA;
//out port p_htr3235_sdb = PORT_HTR3236_SDB; /* 连接到HTR3236的SDB引脚用于控制其电源状态 */ //out port p_htr3235_sdb = PORT_HTR3236_SDB; /* 连接到HTR3236的SDB引脚用于控制其电源状态 */
out port p_ctl_mute = PORT_CTL_MUTE; out port p_ctl_mute = PORT_CTL_MUTE;
in port p_ctl_det = PORT_CTL_DET; port p_ctl_det = PORT_CTL_DET;
/* Board setup for XU316 MC Audio (1v1) */ /* Board setup for XU316 MC Audio (1v1) */
@@ -2150,25 +2150,28 @@ void mute_handler(chanend c_mic_det)
mic2_in = ((det_val >> 2) & 1) ^ 1; mic2_in = ((det_val >> 2) & 1) ^ 1;
any_mic_in = mic1_in || mic2_in; any_mic_in = mic1_in || mic2_in;
// 检测单个mic插事件(从拔出变为插入) // 检测单个mic插事件
unsigned mic1_inserted = (mic1_in && !prev_mic1_in); unsigned mic1_changed = (mic1_in != prev_mic1_in);
unsigned mic2_inserted = (mic2_in && !prev_mic2_in); unsigned mic2_changed = (mic2_in != prev_mic2_in);
unsigned any_inserted = mic1_inserted || mic2_inserted; unsigned any_changed = mic1_changed || mic2_changed;
unsigned state_changed = (any_mic_in != prev_any_mic_in) || any_inserted;
if (state_changed) { if (any_changed) {
// 状态变化立即mute mic防止pop音 // 状态变化立即mute mic和DAC防止pop音
p_ctl_mute <: 0;
c_mic_det <: (unsigned)MIC_DET_MUTE; c_mic_det <: (unsigned)MIC_DET_MUTE;
// c_mic_det <: (unsigned)MIC_DET_DAC_MUTE;
// 如果有mic插入同时mute DAC防pop // 配置ADC
if (any_inserted) { //c_mic_det <: (unsigned)MIC_DET_REINIT_CODEC;
c_mic_det <: (unsigned)MIC_DET_DAC_MUTE; p_ctl_det <: 0;
} delay_milliseconds(100);
debug_printf("mic det change: mic1=%d mic2=%d inserted=%d -> mute\n", mic1_in, mic2_in, any_inserted); //debug_printf("mic det change: mic1=%d mic2=%d -> mute all & reconfig\n", mic1_in, mic2_in);
p_ctl_det :> det_val;
// 等1s让插拔稳定 // 等1s让插拔稳定
delay_milliseconds(1000); delay_milliseconds(900);
p_ctl_mute <: 0xf;
// 重新读取稳定状态 // 重新读取稳定状态
p_ctl_det :> det_val; p_ctl_det :> det_val;
@@ -2176,17 +2179,15 @@ void mute_handler(chanend c_mic_det)
mic2_in = ((det_val >> 2) & 1) ^ 1; mic2_in = ((det_val >> 2) & 1) ^ 1;
any_mic_in = mic1_in || mic2_in; any_mic_in = mic1_in || mic2_in;
// 恢复DAC插入时的临时mute已满1s // 恢复DAC状态
if (any_inserted) { c_mic_det <: (unsigned)MIC_DET_DAC_UNMUTE;
c_mic_det <: (unsigned)MIC_DET_DAC_UNMUTE;
}
if (any_mic_in) { if (any_mic_in) {
// 有mic插入恢复mic音量 // 有mic插入恢复mic音量状态
c_mic_det <: (unsigned)MIC_DET_UNMUTE; c_mic_det <: (unsigned)MIC_DET_UNMUTE;
debug_printf("mic stable inserted -> unmute\n"); debug_printf("mic stable -> unmute\n");
} }
// 全拔出则保持mic mute不发UNMUTE // 全拔出则保持mic mute
prev_mic1_in = mic1_in; prev_mic1_in = mic1_in;
prev_mic2_in = mic2_in; prev_mic2_in = mic2_in;