mode switch

This commit is contained in:
Steven Dan
2026-05-25 17:13:13 +08:00
parent fadd5e4f54
commit c6d46b4bce
4 changed files with 58 additions and 51 deletions

View File

@@ -107,43 +107,41 @@ set(APP_COMPILER_FLAGS_fps71_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
# 改动原因BYPASS/FPS20/3A 合并 UAC1Win 检测仅本目标(参照 fosi_c1 fps_uac1 / c1_lp # 改动原因BYPASS/FPS20/3A 合并 UAC1Win 检测仅本目标(参照 fosi_c1 fps_uac1 / c1_lp
set(APP_COMPILER_FLAGS_game_uac1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 set(APP_COMPILER_FLAGS_game_uac1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2 -DI2S_CHANS_ADC=2
-DAUDIO_CLASS=1
-DMIN_FREQ=48000 -DMIN_FREQ=48000
#-DAUDIO_CLASS=1
-DUAC1_MODE=1
-DMAX_FREQ=48000 -DMAX_FREQ=48000
-DWINDOWS_OS_DESCRIPTOR_SUPPORT -DMCLK_441=512*44100
-DWIN_OS_DETECTION=1 -DMCLK_48=512*48000
-DUSE_EX3D=1 -DUAC1_MODE=1
-DF5_MUSIC_UAC1=1
-DUSE_EX3D
-DMIXER=0 -DMIXER=0
-DUAC2_MODE=1 #-ldnr_11ms
-ldnr_50ms #-DDNR_ENABLE=1
-llib_ex3d_all -llib_ex3d_all
-DEQ_EN=1 -DEQ_EN=1
-DFPS_GAME_UAC1=1
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=24
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=24
-DINPUT_FORMAT_COUNT=1
-DOUTPUT_FORMAT_COUNT=1
-DWIN_OS_DETECTION=1
-DEX3D_SF_NUM=3 -DEX3D_SF_NUM=3
-DNUM_USB_CHAN_OUT=8 -DNUM_USB_CHAN_OUT=8
-DNUM_USB_CHAN_OUT_FS=2
-DNUM_USB_CHAN_IN=2 -DNUM_USB_CHAN_IN=2
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=24
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=24
-DWIN_OS_DETECTION=1
-DINPUT_FORMAT_COUNT=1
-DOUTPUT_FORMAT_COUNT=1
-DNUM_EX3D_CHAN_OUT=2 -DNUM_EX3D_CHAN_OUT=2
-DEX3D_SF_NUM=3
-DMIN_VOLUME=0xE000 -DMIN_VOLUME=0xE000
-DINPUT_VOLUME_CONTROL=1 -DINPUT_VOLUME_CONTROL=0
-DOUTPUT_VOLUME_CONTROL=1 -DOUTPUT_VOLUME_CONTROL=0
-DDEBUG_MEMORY_LOG_ENABLED=1 -DDEBUG_MEMORY_LOG_ENABLED=1
-DHID_CONTROLS_UAC1=1 -DXUA_DFU_EN=0
#-DXUA_DFU_EN=1
-DHID_DFU_EN=1 -DHID_DFU_EN=1
-DHID_CONTROLS_UAC1=1
-DIR_SWITCHING_MODE -DIR_SWITCHING_MODE
-DHID_CONTROLS=1) -DHID_CONTROLS=1)
LINK_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/../../lib_dnr/lib_dnr ${CMAKE_CURRENT_LIST_DIR}/../../lib_ex3d/lib_ex3d/lib) LINK_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/../../lib_dnr/lib_dnr ${CMAKE_CURRENT_LIST_DIR}/../../lib_ex3d/lib_ex3d/lib)
set(APP_INCLUDES src src/core src/extensions ../shared/) set(APP_INCLUDES src src/core src/extensions ../shared/)

View File

@@ -216,18 +216,35 @@ static unsigned tx1_wait_host_os_detection(void)
#endif #endif
/** /**
* 改动原因:两套固件——FPS71 UAC2仅 UAC1 上 Win 检测为 Win 且 g_3d_fps=2与合并 UAC1。 * 改动原因:两套固件分工——
* game_uac1仅 Win 检测 + g_3d_fps=FPS71 时跳到 fps71_uac2其它档不重启
* fps71_uac2不做 Win 检测;仅按键/HID 切到非 FPS71 时回 game_uac1 并重启。
* @param game_mode g_3d_fps0=BYPASS 1=FPS20 2=FPS71 3=3A * @param game_mode g_3d_fps0=BYPASS 1=FPS20 2=FPS71 3=3A
* @param force_reboot 保留兼容,未使用
*/ */
void switch_mode_by_c1_mode(unsigned game_mode, unsigned force_reboot) void switch_mode_by_c1_mode(unsigned game_mode, unsigned force_reboot)
{ {
unsigned reboot_need = 0; unsigned reboot_need = 0;
unsigned want_fps71_uac2 = 0; unsigned want_fps71_uac2 = 0;
(void)force_reboot;
if (game_mode > 3) { if (game_mode > 3) {
game_mode = 0; game_mode = 0;
} }
#if defined(FPS71_UAC2)
/* 改动原因fps71 固件不参与 Windows 判断;已是 FPS71 档则直接返回 */
if (game_mode == GAME_MODE_FPS71) {
return;
}
SetRoleSwitchFlag(TX1_ROLE_GAME_UAC1);
delay_milliseconds(20);
device_reboot();
while (1);
return;
#endif
#if defined(WIN_OS_DETECTION) #if defined(WIN_OS_DETECTION)
{ {
unsigned host_os; unsigned host_os;
@@ -236,27 +253,19 @@ void switch_mode_by_c1_mode(unsigned game_mode, unsigned force_reboot)
want_fps71_uac2 = 1; want_fps71_uac2 = 1;
} }
} }
#elif defined(FPS71_UAC2)
/* 改动原因OS 检测只在 game_uac1FPS71 固件切离 FPS71 档则回 UAC1 */
want_fps71_uac2 = (game_mode == GAME_MODE_FPS71) ? 1u : 0u;
#else #else
(void)game_mode; (void)game_mode;
#endif #endif
if (want_fps71_uac2) { if (want_fps71_uac2) {
#if !FPS71_UAC2
SetRoleSwitchFlag(TX1_ROLE_FPS71_UAC2); SetRoleSwitchFlag(TX1_ROLE_FPS71_UAC2);
reboot_need = 1; reboot_need = 1;
#endif
} else {
#if !FPS_GAME_UAC1
SetRoleSwitchFlag(TX1_ROLE_GAME_UAC1);
reboot_need = 1;
#endif
} }
/* game_uac1 且非 (Win+FPS71)不切换、不重启EX3D 由 tile1 按 g_3d_fps 处理 */
if (reboot_need || force_reboot) if (reboot_need)
{ {
/* 改动原因game_uac1 按键切到 FPS71 且已判定为 Win 时RoleSwitch 后必须重启才进入 fps71_uac2 */
delay_milliseconds(20); delay_milliseconds(20);
device_reboot(); device_reboot();
while (1); while (1);
@@ -800,15 +809,8 @@ static void tx1_sync_game_mode_state(unsigned mode, unsigned persist)
tx1_azimuth_clear_all_decay(); tx1_azimuth_clear_all_decay();
if (persist) { if (persist) {
tx1_save_game_mode((unsigned char)mode); tx1_save_game_mode((unsigned char)mode);
#if defined(WIN_OS_DETECTION) /* 改动原因GAME 键 persist——game_uac1 仅 Win+FPS71 重启进 fps71fps71 切到非 FPS71 重启回 game_uac1 */
/* 改动原因UAC1 固件内已检测过 OSWin 才在 FPS71↔UAC1 间换固件 */
switch_mode_by_c1_mode(mode, 0); switch_mode_by_c1_mode(mode, 0);
#elif defined(FPS71_UAC2)
/* 改动原因FPS71 固件无 Win 检测,离开 FPS71 必回 game_uac1 */
if (mode != GAME_MODE_FPS71) {
switch_mode_by_c1_mode(mode, 0);
}
#endif
} }
} }
@@ -1039,21 +1041,22 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
} }
#if defined(WIN_OS_DETECTION) #if defined(WIN_OS_DETECTION)
/* 改动原因:与 fosi_c1_lp 相同——仅 UAC1 固件、定时器已启动后延时轮询,再按 OS+模式切固件 */ /* 改动原因:简化——轮询 OS 后仅 Win 且 Flash 恢复的档位为 FPS71 时才 RoleSwitch 到 fps71_uac2
* 其它档位留在 game_uac1不重启EX3D 由 tile1 按 g_3d_fps 处理)。 */
host_os = tx1_wait_host_os_detection(); host_os = tx1_wait_host_os_detection();
{ {
unsigned boot_game_mode; unsigned boot_game_mode;
GET_SHARED_GLOBAL(boot_game_mode, g_3d_fps); 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); debug_printf("WIN_OS_DETECTION host_os=%d g_3d_fps=%d\n", host_os, boot_game_mode);
if (host_os == OS_WIN) { if (host_os == OS_WIN && boot_game_mode == GAME_MODE_FPS71) {
switch_mode_by_c1_mode(boot_game_mode, 1);
} else {
switch_mode_by_c1_mode(boot_game_mode, 0); switch_mode_by_c1_mode(boot_game_mode, 0);
} else {
debug_printf("stay on game_uac1 (no fps71 role switch)\n");
} }
} }
#elif defined(FPS71_UAC2) #elif defined(FPS71_UAC2)
/* 改动原因:FPS71 固件不做 Win 检测;由 game_uac1 检测后 RoleSwitch 跳入 */ /* 改动原因:fps71 开机不做 Win 检测、不 switch_mode仅 GAME 键切到非 FPS71 时重启回 game_uac1 */
debug_printf("FPS71_UAC2 boot g_3d_fps=%u\n", (unsigned)game_mode); debug_printf("FPS71_UAC2 boot g_3d_fps=%u (no OS detect, no auto switch)\n", (unsigned)game_mode);
#else #else
debug_printf("game_uac1 no WIN_OS_DETECTION build\n"); debug_printf("game_uac1 no WIN_OS_DETECTION build\n");
#endif #endif
@@ -1789,7 +1792,11 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli
game_long_fired = 0; game_long_fired = 0;
} else { } else {
if (!game_long_fired && (now - game_press_time) < 1000000000ull) { if (!game_long_fired && (now - game_press_time) < 1000000000ull) {
/* 改动原因:与 jok on_game_short_press 一致;写 Flash 并同步 tile1 EX3D */ /* 改动原因:与 jok on_game_short_press 一致;写 Flash 并同步 tile1 EX3D
* 固件切换switch_mode_by_c1_mode
* game_uac1 + Windows + 新档位=FPS71 → 重启进 fps71_uac2
* fps71_uac2 + 新档位≠FPS71 → 重启回 game_uac1
* 其余(非 Win 下 FPS71、UAC1 下其它档)仅改 g_3d_fps不重启。 */
game_mode = (game_mode + 1) % 4; game_mode = (game_mode + 1) % 4;
gpio_leds_dirty = 1; gpio_leds_dirty = 1;
tx1_sync_game_mode_state((unsigned)game_mode, 1); tx1_sync_game_mode_state((unsigned)game_mode, 1);

View File

@@ -795,7 +795,7 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) {
} }
tx1_save_game_mode((unsigned char)mapped); tx1_save_game_mode((unsigned char)mapped);
SET_SHARED_GLOBAL(g_request_game_mode, (unsigned)-1); SET_SHARED_GLOBAL(g_request_game_mode, (unsigned)-1);
/* 改动原因HID 0xA4 后 switch_mode 内判断 OS——仅 Win+FPS71 切 UAC2非 Win 只改 tile1 算法 */ /* 改动原因HID 0xA4——game_uac1 仅 Win+FPS71 切固件fps71 仅 mapped!=FPS71 时回 UAC1 重启 */
switch_mode_by_c1_mode(mapped, 0); switch_mode_by_c1_mode(mapped, 0);
SET_SHARED_GLOBAL(g_tx1_ex3d_resync_req, 1); SET_SHARED_GLOBAL(g_tx1_ex3d_resync_req, 1);

View File

@@ -13,8 +13,10 @@
#include "roleswitchflag.h" #include "roleswitchflag.h"
/* /*
* 改动原因:两套固件——FPS71 UAC2 + 合并 UAC1BYPASS/FPS20/3A 由 g_3d_fps 在 tile1 选算法)。 * 改动原因:两套固件——
* Windows 且 g_3d_fps=2 时加载 upgrade1否则加载 upgrade2。 * game_uac1(upgrade2)Win 检测后仅 g_3d_fps=FPS71 时跳 upgrade1其它档留 UAC1
* fps71_uac2(upgrade1):不做 Win 检测;仅按键/HID 切离 FPS71 时回 upgrade2。
* BYPASS/FPS20/3A 在 game_uac1 上由 tile1 按 g_3d_fps 选算法。
*/ */
#define TX1_ROLE_FPS71_UAC2 COAX_IN_FLAG /* upgrade 1 -DFPS71_UAC2=1 */ #define TX1_ROLE_FPS71_UAC2 COAX_IN_FLAG /* upgrade 1 -DFPS71_UAC2=1 */
#define TX1_ROLE_GAME_UAC1 USB_IN_FLAG /* upgrade 2 -DFPS_GAME_UAC1=1 */ #define TX1_ROLE_GAME_UAC1 USB_IN_FLAG /* upgrade 2 -DFPS_GAME_UAC1=1 */