fix pop noise of switch modes

This commit is contained in:
Steven Dan
2026-05-25 17:26:42 +08:00
parent 6d6bde92b5
commit ffa8f388f0
3 changed files with 77 additions and 12 deletions

View File

@@ -73,7 +73,7 @@ set(APP_COMPILER_FLAGS_fact ${SW_FACT_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
# 改动原因FPS71 独立 UAC2 固件;Windows 下 g_3d_fps=2 时加载(去掉 F3_F4
# 改动原因FPS71 独立 UAC2 固件;不做 Win 检测;由 game_uac1(Win+FPS71) RoleSwitch 跳入
set(APP_COMPILER_FLAGS_fps71_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2
-DMIN_FREQ=48000
@@ -110,8 +110,8 @@ set(APP_COMPILER_FLAGS_game_uac1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DAUDIO_CLASS=1
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DMCLK_441=512*44100
-DMCLK_48=512*48000
-DMCLK_441=1024*44100
-DMCLK_48=1024*48000
-DUAC1_MODE=1
-DF5_MUSIC_UAC1=1
-DUSE_EX3D

View File

@@ -107,6 +107,43 @@ unsigned g_request_factory_reset = 0;
/* 改动原因HTR3236 bringup 须在 codec_init 完成之后执行,避免与 NAU88 I2C 抢线/阻塞 */
unsigned g_audiohw_codec_init_done = 0;
/* 改动原因p_ctl_mute 经 tile1 控制功放;低=静音、高=放音(与 jok ui_app 一致) */
#define TX1_AMP_CTL_MUTE_VAL 0u
#define TX1_AMP_CTL_UNMUTE_VAL 1u
unsigned g_tx1_ctl_mute_pending = 0;
unsigned g_tx1_ctl_mute_value = TX1_AMP_CTL_MUTE_VAL;
static void tx1_amp_ctl_mute_queue(unsigned value)
{
SET_SHARED_GLOBAL(g_tx1_ctl_mute_value, value);
SET_SHARED_GLOBAL(g_tx1_ctl_mute_pending, 1);
}
static void tx1_amp_ctl_mute_flush(client interface tx1_led_if led_if)
{
unsigned pending, value;
GET_SHARED_GLOBAL(pending, g_tx1_ctl_mute_pending);
if (pending) {
GET_SHARED_GLOBAL(value, g_tx1_ctl_mute_value);
led_if.set_mute(value);
SET_SHARED_GLOBAL(g_tx1_ctl_mute_pending, 0);
}
}
static void tx1_amp_ctl_mute_force(client interface tx1_led_if led_if, unsigned value)
{
led_if.set_mute(value);
SET_SHARED_GLOBAL(g_tx1_ctl_mute_value, value);
SET_SHARED_GLOBAL(g_tx1_ctl_mute_pending, 0);
}
/* 改动原因RoleSwitch 重启前拉低 p_ctl_muteHID/eq 与 AudioHwRemote 不同核,用 pending+延时等待 flush */
static void tx1_amp_mute_before_reboot(void)
{
tx1_amp_ctl_mute_queue(TX1_AMP_CTL_MUTE_VAL);
delay_milliseconds(80);
}
// CODEC I2C lines
on tile[0]: port p_scl = PORT_I2C_SCL;
on tile[0]: port p_sda = PORT_I2C_SDA;
@@ -239,7 +276,7 @@ void switch_mode_by_c1_mode(unsigned game_mode, unsigned force_reboot)
return;
}
SetRoleSwitchFlag(TX1_ROLE_GAME_UAC1);
delay_milliseconds(20);
tx1_amp_mute_before_reboot();
device_reboot();
while (1);
return;
@@ -265,8 +302,8 @@ void switch_mode_by_c1_mode(unsigned game_mode, unsigned force_reboot)
if (reboot_need)
{
/* 改动原因:game_uac1 按键切到 FPS71 且已判定为 Win 时RoleSwitch 后必须重启才进入 fps71_uac2 */
delay_milliseconds(20);
/* 改动原因:切固件前先功放静音,减轻 RoleSwitch 重启 pop */
tx1_amp_mute_before_reboot();
device_reboot();
while (1);
}
@@ -785,13 +822,21 @@ unsigned char load_value(unsigned char * unsafe path);
* 改动原因:与 jok on_game_short_press 一致——更新 g_3d_fps、g_tx1_azimuth_mode
* 供 tile1 ex3d_task 轮询下发 EX3Dpersist=1 时写入 LFSGAME 键/需记忆时)。
*/
static void tx1_sync_game_mode_state(unsigned mode, unsigned persist)
static void tx1_sync_game_mode_state(unsigned mode, unsigned persist,
client interface tx1_led_if led_if)
{
unsigned azimuth = TX1_AZIMUTH_MODE_FPS;
if (mode > 3) {
mode = 0;
}
if (persist) {
/* 改动原因GAME 键/HID 切档前先拉低 p_ctl_mute避免 EX3D/固件切换 pop */
tx1_amp_ctl_mute_force(led_if, TX1_AMP_CTL_MUTE_VAL);
delay_milliseconds(50);
}
switch (mode) {
case GAME_MODE_3A:
azimuth = TX1_AZIMUTH_MODE_3A;
@@ -811,6 +856,9 @@ static void tx1_sync_game_mode_state(unsigned mode, unsigned persist)
tx1_save_game_mode((unsigned char)mode);
/* 改动原因GAME 键 persist——game_uac1 仅 Win+FPS71 重启进 fps71fps71 切到非 FPS71 重启回 game_uac1 */
switch_mode_by_c1_mode(mode, 0);
/* 未 RoleSwitch 重启则恢复放音 */
delay_milliseconds(30);
tx1_amp_ctl_mute_force(led_if, TX1_AMP_CTL_UNMUTE_VAL);
}
}
@@ -988,10 +1036,13 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
/* 改动原因:仅预拉 SDB完整 bringup 在 codec_init 完成后执行(见 tmr 分支) */
led_if.init();
/* 改动原因:开机即拉低 p_ctl_mutecodec/HTR3236/音量/Win 检测完成后再在 tmr 里拉高 */
tx1_amp_ctl_mute_force(led_if, TX1_AMP_CTL_MUTE_VAL);
tx1_htr3236_sdb_enable(led_if);
htr3236_init(&htr3236_dev, HTR3236_ADDR_GND);
unsigned htr3236_bringup_done = 0;
unsigned tx1_amp_unmuted_after_boot = 0;
// TX1 button previous state (active low: 0=pressed, 1=released)
unsigned prev_fps = 1, prev_game = 1, prev_mic = 1;
@@ -1035,7 +1086,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
{
unsigned char saved_gm = tx1_load_game_mode();
game_mode = (tx1_game_mode_t)saved_gm;
tx1_sync_game_mode_state((unsigned)game_mode, 0);
tx1_sync_game_mode_state((unsigned)game_mode, 0, led_if);
gpio_leds_dirty = 1;
debug_printf("TX1: Loaded game_mode from flash: %u\n", (unsigned)game_mode);
}
@@ -1049,6 +1100,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
GET_SHARED_GLOBAL(boot_game_mode, g_3d_fps);
debug_printf("WIN_OS_DETECTION host_os=%d g_3d_fps=%d\n", host_os, boot_game_mode);
if (host_os == OS_WIN && boot_game_mode == GAME_MODE_FPS71) {
/* 改动原因:开机 Win+FPS71 切 fps71 前已静音switch_mode 内会 reboot */
switch_mode_by_c1_mode(boot_game_mode, 0);
} else {
debug_printf("stay on game_uac1 (no fps71 role switch)\n");
@@ -1120,6 +1172,8 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
unsigned dac_vol, adc_vol, dac_mode, new_dac_mode;
unsigned codec_init_done;
tx1_amp_ctl_mute_flush(led_if);
/* 改动原因codec_init 经 chan 在本任务处理;完成后再做 HTR3236避免假成功 */
if (!htr3236_bringup_done) {
GET_SHARED_GLOBAL(codec_init_done, g_audiohw_codec_init_done);
@@ -1130,6 +1184,14 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
}
}
/* 改动原因codec + HTR3236 + 开机流程结束后拉高 p_ctl_mute 放音 */
if (htr3236_bringup_done && !tx1_amp_unmuted_after_boot) {
delay_milliseconds(20);
tx1_amp_ctl_mute_force(led_if, TX1_AMP_CTL_UNMUTE_VAL);
tx1_amp_unmuted_after_boot = 1;
debug_printf("TX1: AMP ctl_mute unmute after boot config\n");
}
now = get_reference_time();
GET_SHARED_GLOBAL(unmute_dac_state, g_unmute_dac_state);
@@ -1799,7 +1861,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
* 其余(非 Win 下 FPS71、UAC1 下其它档)仅改 g_3d_fps不重启。 */
game_mode = (game_mode + 1) % 4;
gpio_leds_dirty = 1;
tx1_sync_game_mode_state((unsigned)game_mode, 1);
tx1_sync_game_mode_state((unsigned)game_mode, 1, led_if);
debug_printf("TX1: GAME short press - game_mode=%d saved\n", game_mode);
}
}

View File

@@ -14,6 +14,9 @@ on tile[1]: out port p_led_d4_d7_d6 = PORT_LED_D4_7_6; // 4D: bit3=D4, bit2=D7,
on tile[1]: out port p_htr3236_sdb = PORT_HTR3236_SDB;
// 改动原因:与 jok.xn / xu316_qf60.xn 中 PORT_CTL_MUTE 一致
on tile[1]: out port p_ctl_mute = PORT_CTL_MUTE;
/* 改动原因:与 jok ui_app 一致——p_ctl_mute 拉低=功放静音,拉高=放音;切换模式/开机先低后高可抑制 pop */
#define TX1_AMP_GPIO_MUTE 0
#define TX1_AMP_GPIO_UNMUTE 1
// tile[1] LED helper task - controls tile[1] GPIO LED ports
// Receives commands via tx1_led_if interface from AudioHwRemote2 on tile[0]
@@ -34,7 +37,7 @@ void tx1_led_helper_task(server interface tx1_led_if led_if)
p_led_d4_d7_d6 <: 0xF;
/* 改动原因:上电即拉高 SDB与 jok tile1_io_control_task 一致;勿长期拉低否则 I2C 配置无效 */
p_htr3236_sdb <: 1;
p_ctl_mute <: 1; // Muted initially
p_ctl_mute <: TX1_AMP_GPIO_MUTE; /* 改动原因:上电先拉低静音,等 tile0 codec/RGB 配置完再拉高 */
while (1)
{
@@ -105,7 +108,7 @@ void tx1_led_helper_task(server interface tx1_led_if led_if)
break;
case led_if.set_mute(unsigned value):
//p_ctl_mute <: value;
p_ctl_mute <: value;
break;
case led_if.init(void):
@@ -115,7 +118,7 @@ void tx1_led_helper_task(server interface tx1_led_if led_if)
p_led_d5 <: 1;
p_led_d4_d7_d6 <: 0xF;
p_htr3236_sdb <: 1; // Enable HTR3236
//p_ctl_mute <: 1; // Muted
p_ctl_mute <: TX1_AMP_GPIO_MUTE;
d1_state = 1; d2_state = 1; d3_state = 0xF;
d5_state = 1; d4_d7_d6_state = 0xF;
break;