update os detection

This commit is contained in:
Steven Dan
2026-01-18 11:17:04 +08:00
parent 8416e609e4
commit d5e586871f
5 changed files with 169 additions and 138 deletions

View File

@@ -76,8 +76,9 @@ set(APP_COMPILER_FLAGS_ex3d_UAC1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DINPUT_VOLUME_CONTROL=0 -DINPUT_VOLUME_CONTROL=0
-DUAC1_MODE=1 -DUAC1_MODE=1
-DOUTPUT_VOLUME_CONTROL=0 -DOUTPUT_VOLUME_CONTROL=0
-DXUA_DFU_EN=0
-DSTEREO_2K -DSTEREO_2K
-DHID_CONTROLS=1) -DHID_CONTROLS=0)
set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2

View File

@@ -1 +1 @@
xflash bin/factory/fact.xe --loader loader.o --upgrade 4 bin\ex3d_UAC1\app_usb_aud_phaten_gs_ex3d_UAC1.xe --upgrade 2 bin/ex3d_stereo_2k/app_usb_aud_phaten_gs_ex3d_stereo_2k.xe --upgrade 1 bin\ex3d_71_game\app_usb_aud_phaten_gs_ex3d_71_game.xe --upgrade 3 bin\ex3d_stereo_8k\app_usb_aud_phaten_gs_ex3d_stereo_8k.xe -o %1 xflash bin/factory/fact.xe --loader loader.o --upgrade 2 bin\ex3d_UAC1\app_usb_aud_phaten_gs_ex3d_UAC1.xe --upgrade 4 bin/ex3d_stereo_2k/app_usb_aud_phaten_gs_ex3d_stereo_2k.xe --upgrade 1 bin\ex3d_71_game\app_usb_aud_phaten_gs_ex3d_71_game.xe --upgrade 3 bin\ex3d_stereo_8k\app_usb_aud_phaten_gs_ex3d_stereo_8k.xe -o %1

View File

@@ -1,2 +1,2 @@
xflash --factory-version 15.3 --target-file src/core/PHATEN_GS.xn --upgrade 4 bin\ex3d_UAC1\app_usb_aud_phaten_gs_ex3d_UAC1.xe --upgrade 2 bin/ex3d_stereo_2k/app_usb_aud_phaten_gs_ex3d_stereo_2k.xe --upgrade 1 bin\ex3d_71_game\app_usb_aud_phaten_gs_ex3d_71_game.xe --upgrade 3 bin\ex3d_stereo_8k\app_usb_aud_phaten_gs_ex3d_stereo_8k.xe -o %1 xflash --factory-version 15.3 --target-file src/core/PHATEN_GS.xn --upgrade 2 bin\ex3d_UAC1\app_usb_aud_phaten_gs_ex3d_UAC1.xe --upgrade 4 bin/ex3d_stereo_2k/app_usb_aud_phaten_gs_ex3d_stereo_2k.xe --upgrade 1 bin\ex3d_71_game\app_usb_aud_phaten_gs_ex3d_71_game.xe --upgrade 3 bin\ex3d_stereo_8k\app_usb_aud_phaten_gs_ex3d_stereo_8k.xe -o %1

View File

@@ -212,6 +212,12 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi
sampsFromAudioToUsb[1] = sampsFromUsbToAudio[1]; sampsFromAudioToUsb[1] = sampsFromUsbToAudio[1];
} }
#ifndef HID_MAX_DATA_BYTES
#define HID_MAX_DATA_BYTES ( 64 )
#endif
unsigned hidSendData[HID_MAX_DATA_BYTES / 4];
#if (HID_CONTROLS == 1) #if (HID_CONTROLS == 1)
#include "user_hid.h" #include "user_hid.h"
static unsigned char lastHidData; static unsigned char lastHidData;
@@ -252,7 +258,6 @@ typedef enum {
#define CMD_CLR_FWD_TO_2ND_DEV(item) ((item) & ~0x0800) #define CMD_CLR_FWD_TO_2ND_DEV(item) ((item) & ~0x0800)
#define CMD_MASK (~(CMD_SET(0)|CMD_GET(0)|CMD_PARAM(0)|CMD_FWD(0)|CMD_FWD_TO_2ND_DEV(0))) #define CMD_MASK (~(CMD_SET(0)|CMD_GET(0)|CMD_PARAM(0)|CMD_FWD(0)|CMD_FWD_TO_2ND_DEV(0)))
#define CMD_ITEM(cmd) ((cmd) & CMD_MASK) #define CMD_ITEM(cmd) ((cmd) & CMD_MASK)
unsigned hidSendData[HID_MAX_DATA_BYTES / 4];
void UserHIDInit(void) { void UserHIDInit(void) {
return; return;
@@ -714,10 +719,10 @@ void update_button(unsigned char b)
#define BLUE_LED_PIN 0 // 3D LED (蓝色LED) - bit 0 of leds2_val, 0b11111110 #define BLUE_LED_PIN 0 // 3D LED (蓝色LED) - bit 0 of leds2_val, 0b11111110
// 改动原因定义模式切换标志值用于在SPATIAL_GAME、STEREO_8K、STEREO_2K、UAC1之间循环切换 // 改动原因定义模式切换标志值用于在SPATIAL_GAME、STEREO_8K、STEREO_2K、UAC1之间循环切换
#define MODE_STEREO_2K USB_IN_FLAG // 2 STEREO_2K模式标志 #define MODE_STEREO_2K UAC1_IN_FLAG // 4 STEREO_2K模式标志
#define MODE_SPATIAL_GAME COAX_IN_FLAG //1 SPATIAL_GAME模式标志 #define MODE_SPATIAL_GAME COAX_IN_FLAG //1 SPATIAL_GAME模式标志
#define MODE_STEREO_8K OPT_IN_FLAG // 3 STEREO_8K模式标志 #define MODE_STEREO_8K OPT_IN_FLAG // 3 STEREO_8K模式标志
#define MODE_UAC1 UAC1_IN_FLAG // 4 UAC1模式标志 #define MODE_UAC1 USB_IN_FLAG // 2 UAC1模式标志
//Tile 1 //Tile 1
void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData, chanend_t c_uac_vol) void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData, chanend_t c_uac_vol)
@@ -780,6 +785,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
port_out(p_leds, leds1_val); port_out(p_leds, leds1_val);
port_out(p_leds2, leds2_val); port_out(p_leds2, leds2_val);
debug_printf("LED init: default OFF state, waiting for mode from button_task\n"); debug_printf("LED init: default OFF state, waiting for mode from button_task\n");
// delay_milliseconds(200);
uint32_t last_status = port_in(p_keys); uint32_t last_status = port_in(p_keys);
hwtimer_set_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL); hwtimer_set_trigger_time(timer, hwtimer_get_time(timer) + KEY_POLLING_INTERVAL);
while (1) { while (1) {
@@ -884,10 +890,12 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
RcvData[i] = chan_in_byte(c_hidRcvData); RcvData[i] = chan_in_byte(c_hidRcvData);
} }
if(RcvData[0] == 0x01) { // REPORT ID 1 if(RcvData[0] == 0x01) { // REPORT ID 1
#if (HID_CONTROLS == 1)
hid_receive_task_in_c(RcvData, SendData); hid_receive_task_in_c(RcvData, SendData);
for(int i=0; i<(HID_MAX_DATA_BYTES / 4) ;i++) { for(int i=0; i<(HID_MAX_DATA_BYTES / 4) ;i++) {
chan_out_word(c_hidSendData, SendData[i]); chan_out_word(c_hidSendData, SendData[i]);
} }
#endif
} }
} }
continue; continue;
@@ -929,7 +937,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
if (press_hold_cnt > 0) { if (press_hold_cnt > 0) {
// 改动原因短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K // 改动原因短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K
// 循环切换0→1→2→3→0 // 循环切换0→1→2→3→0
#if 0 #if UAC1_MODE
unsigned old_mode = current_mode_local; unsigned old_mode = current_mode_local;
current_mode_local = (current_mode_local + 1) % 4; // 循环切换 0→1→2→3→0 current_mode_local = (current_mode_local + 1) % 4; // 循环切换 0→1→2→3→0
debug_printf("Short press: switching mode from %d to %d\n", old_mode, current_mode_local); debug_printf("Short press: switching mode from %d to %d\n", old_mode, current_mode_local);
@@ -978,8 +986,9 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
port_out(p_leds, leds1_val); port_out(p_leds, leds1_val);
#endif #endif
unsigned endData[1] = {0xffffffff}; unsigned endData[1] = {0xffffffff};
debug_printf("endData[0]: %d\n", endData[0]); debug_printf("endData[0]: %d %d\n", endData[0], current_mode_local);
chan_out_word(c_hidSendData, endData[0]); chan_out_word(c_hidSendData, endData[0]);
chan_out_word(c_hidSendData, current_mode_local);
} }
} }
} else { } else {
@@ -1062,9 +1071,8 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
static unsigned isMute = 0; static unsigned isMute = 0;
uint8_t tmp = 0; uint8_t tmp = 0;
#if (HID_CONTROLS == 1)
unsigned hidData0; unsigned hidData0;
#endif
unsigned ex3d_key_verified; unsigned ex3d_key_verified;
delay_milliseconds(300); delay_milliseconds(300);
debug_printf("button task start\n"); debug_printf("button task start\n");
@@ -1101,19 +1109,24 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
debug_printf("Saved game_mode to flash: %d\n", saved_mode); debug_printf("Saved game_mode to flash: %d\n", saved_mode);
} }
#endif #endif
printf("host_os: %d\n", host_os);
if (host_os == OS_OTHERS) { #if 0
if ((host_os == OS_OTHERS) || (host_os == 0)) {
// 改动原因检测到非Windows系统切换到UAC1模式 // 改动原因检测到非Windows系统切换到UAC1模式
debug_printf("Detected non-Windows OS (OS_OTHERS), switching to UAC1 mode\n"); #if !UAC1_MODE
printf("Detected non-Windows OS (OS_OTHERS), switching to UAC1 mode\n");
SetRoleSwitchFlag(MODE_UAC1); SetRoleSwitchFlag(MODE_UAC1);
debug_printf("Set role switch flag: 0x%04X (UAC1), device will restart\n", MODE_UAC1); debug_printf("Set role switch flag: 0x%04X (UAC1), device will restart\n", MODE_UAC1);
// 设备会重启,退出函数 // 设备会重启,退出函数
device_reboot(); device_reboot();
while(1); while(1);
#endif
} }
else { #endif
debug_printf("Detected Windows OS (OS_WIN)\n");
#if UAC1_MODE == 1 #if UAC1_MODE == 1
if (host_os == OS_WIN) {
printf("Detected Windows OS (OS_WIN) saved_mode: %d\n", saved_mode);
{ {
@@ -1122,13 +1135,13 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
SetRoleSwitchFlag(MODE_STEREO_2K); SetRoleSwitchFlag(MODE_STEREO_2K);
break; break;
case 1: case 1:
SetRoleSwitchFlag(MODE_SPATIAL_GAME); SetRoleSwitchFlag(MODE_STEREO_2K);
break; break;
case 2: case 2:
SetRoleSwitchFlag(MODE_STEREO_8K); SetRoleSwitchFlag(MODE_SPATIAL_GAME);
break; break;
case 3: case 3:
SetRoleSwitchFlag(MODE_STEREO_2K); SetRoleSwitchFlag(MODE_STEREO_8K);
break; break;
default: default:
SetRoleSwitchFlag(MODE_STEREO_2K); SetRoleSwitchFlag(MODE_STEREO_2K);
@@ -1136,9 +1149,11 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
} }
debug_printf("Switch to saved mode: %d, device will restart.\n", saved_mode); debug_printf("Switch to saved mode: %d, device will restart.\n", saved_mode);
delay_milliseconds(200); delay_milliseconds(200);
//device_reboot(); device_reboot();
//while (1); while (1);
} }
}
#endif #endif
#if defined(STEREO_2K) #if defined(STEREO_2K)
@@ -1159,8 +1174,6 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
} }
#endif #endif
}
g_windows_detect_done = 1; g_windows_detect_done = 1;
// 改动原因更新全局变量g_game_mode为保存的模式值 // 改动原因更新全局变量g_game_mode为保存的模式值
@@ -1205,15 +1218,13 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
// 改动原因收到0xffffffff后循环切换模式并保存到flash然后设置切换标志 // 改动原因收到0xffffffff后循环切换模式并保存到flash然后设置切换标志
// 注意UAC1模式下不会收到此命令hid_button_task不发送 // 注意UAC1模式下不会收到此命令hid_button_task不发送
// 读取当前g_game_mode值 // 读取当前g_game_mode值
unsigned current_mode; unsigned current_mode = chan_in_word(c_hidSendData);
GET_SHARED_GLOBAL(current_mode, g_game_mode);
// 改动原因Windows模式下只循环切换0→1→2→3→0不包括UAC1模式4 // 改动原因Windows模式下只循环切换0→1→2→3→0不包括UAC1模式4
// 循环切换模式0(STEREO_2K) -> 1(SPATIAL_GAME) -> 2(STEREO_8K) -> 3(无音效) -> 0 // 循环切换模式0(STEREO_2K) -> 1(SPATIAL_GAME) -> 2(STEREO_8K) -> 3(无音效) -> 0
unsigned new_mode; unsigned new_mode;
unsigned mode_flag; unsigned mode_flag;
debug_printf("current_mode: %d\n", current_mode); debug_printf("current_mode: %d\n", current_mode);
#if UAC1_MODE != 1
if (current_mode == 0) { if (current_mode == 0) {
// 当前是STEREO_2K切换到STEREO_2K // 当前是STEREO_2K切换到STEREO_2K
new_mode = 1; new_mode = 1;
@@ -1240,20 +1251,37 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
unsigned char path[] = "game_mode"; unsigned char path[] = "game_mode";
save_value(path, (unsigned char)new_mode); save_value(path, (unsigned char)new_mode);
debug_printf("Saved game_mode %d to flash\n", new_mode); debug_printf("Saved game_mode %d to flash\n", new_mode);
delay_milliseconds(20);
debug_printf("Set role switch flag: 0x%04X\n", mode_flag); // 改动原因判断是否需要切换固件mode 0和mode 1都使用STEREO_2K固件不需要reboot
// 设置角色切换标志,触发模式切换 // 只有在需要切换固件时才reboot同一固件内的模式切换如0<->1只更新模式和算法状态
#if !UAC1_MODE
if (new_mode != 1) {
// 改动原因需要切换固件执行reboot
debug_printf("Set role switch flag: 0x%04X, switching firmware, rebooting...\n", mode_flag);
SetRoleSwitchFlag(mode_flag); SetRoleSwitchFlag(mode_flag);
delay_milliseconds(20); delay_milliseconds(20);
device_reboot(); device_reboot();
while (1); while (1);
} else {
// 改动原因不需要切换固件只更新模式和算法状态如mode 0<->1切换不reboot
debug_printf("Same firmware mode (0x%04X), updating mode and algorithm state without reboot\n", mode_flag);
SET_SHARED_GLOBAL(g_game_mode, new_mode);
// 改动原因通过channel发送新的audio_mode给hid_button_task更新LED和算法状态
chan_out_byte(cc_mic_level, 0xFC); // 音频模式传输命令
chan_out_byte(cc_mic_level, new_mode); // 音频模式值
debug_printf("Sent audio_mode %d to hid_button_task via cc_mic_level channel\n", new_mode);
}
#endif #endif
break; break;
} }
#if (HID_CONTROLS == 1)
for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) { for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) {
reportData[i] = chan_in_word(c_hidSendData); reportData[i] = chan_in_word(c_hidSendData);
} }
hidSetChangePending(1); hidSetChangePending(1);
#endif
continue; continue;
} }
event_polling: event_polling:
@@ -1305,6 +1333,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
debug_printf("MUTE: muted\n"); debug_printf("MUTE: muted\n");
} }
break; break;
#if (HID_CONTROLS == 1)
case KEY_PLAY_VOL_DN: case KEY_PLAY_VOL_DN:
// 改动原因处理播放音量减按键发送HID控制命令 // 改动原因处理播放音量减按键发送HID控制命令
if ((curr_ctrl_keys & KEY_PLAY_VOL_DN) == 0) { if ((curr_ctrl_keys & KEY_PLAY_VOL_DN) == 0) {
@@ -1318,6 +1347,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
update_button(HID_CONTROL_VOLUP); // 更新HID报告 update_button(HID_CONTROL_VOLUP); // 更新HID报告
} }
break; break;
#endif
default: default:
break; break;
} }

View File

@@ -102,6 +102,7 @@ extern void key_receiver(chanend c_key);
#define USER_MAIN_CORES on tile[1]: {\ #define USER_MAIN_CORES on tile[1]: {\
par\ par\
{\ {\
hid_button_task(cc_mic_level, c_hidRcvData, c_hidSendData, c_uac_vol);\
ex3d_task();\ ex3d_task();\
par(int i=0;i<DSP_WORKER_COUNT;i++) dsp_worker_tile(c_dsp_to_ex3d[i], i);\ par(int i=0;i<DSP_WORKER_COUNT;i++) dsp_worker_tile(c_dsp_to_ex3d[i], i);\
unsafe\ unsafe\
@@ -111,7 +112,6 @@ extern void key_receiver(chanend c_key);
for(int i=0;i<DSP_WORKER_COUNT;i++)\ for(int i=0;i<DSP_WORKER_COUNT;i++)\
uc_dsp_to_ex3d[i] = (chanend) c_dsp_to_ex3d[i];\ uc_dsp_to_ex3d[i] = (chanend) c_dsp_to_ex3d[i];\
}\ }\
hid_button_task(cc_mic_level, c_hidRcvData, c_hidSendData, c_uac_vol);\
}\ }\
}\ }\
on tile[0]: {\ on tile[0]: {\