basic working

This commit is contained in:
Steven Dan
2026-01-13 23:32:14 +08:00
parent 304110859e
commit 1e84c57f3f
5 changed files with 110 additions and 328 deletions

View File

@@ -89,7 +89,7 @@ set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DMIXER=0
-DAIZIP_DNR=0 #-ldnr_50ms
-llib_ex3d_stereo_2k
-DNUM_USB_CHAN_OUT=2
-DNUM_USB_CHAN_OUT=8
-DNUM_USB_CHAN_IN=0
-DEQ_EN=1
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
@@ -105,16 +105,15 @@ set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DHID_CONTROLS=1)
set(APP_COMPILER_FLAGS_ex3d_stereo_8k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
-DI2S_CHANS_ADC=2
-DAUDIO_CLASS=1
-DI2S_CHANS_ADC=0
-DMIN_FREQ=48000
-DMAX_FREQ=48000
-DUSE_EX3D
-DMIXER=0
-DAIZIP_DNR=0 #-ldnr_50ms
-llib_ex3d_stereo_8k
-DNUM_USB_CHAN_OUT=2
-DNUM_USB_CHAN_IN=2
-DNUM_USB_CHAN_OUT=8
-DNUM_USB_CHAN_IN=0
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
-DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=16
-DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16

View File

@@ -1 +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
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_71_movie\app_usb_aud_phaten_gs_ex3d_71_movie.xe -o %1

View File

@@ -1,2 +1,2 @@
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
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_71_movie\app_usb_aud_phaten_gs_ex3d_71_movie.xe -o %1

View File

@@ -1,4 +1,5 @@
#define DEBUG_PRINT_ENABLE 0
#define DEBUG_PRINT_ENABLE 1
#include <platform.h>
#include <xs1.h>
#include <stdlib.h>
@@ -41,8 +42,13 @@ enum { OS_WIN = 1, OS_OTHERS = 2 };
extern unsigned g_uac_vol;
chanend_t uc_ex3d_to_ubm, uc_eq_data;
#if (STEREO_8K == 1) || (STEREO_2K == 1)
#define UBM_TO_EX3D_CHANS (2)
#define EX3D_TO_UBM_CHANS (2)
#else
#define UBM_TO_EX3D_CHANS (NUM_USB_CHAN_OUT)
#define EX3D_TO_UBM_CHANS (2)
#endif
// tile 1, mic level
unsigned g_mic_level_t1;
@@ -696,10 +702,10 @@ void hid_update(unsigned char hid_data) {
#define BLUE_LED_PIN 0 // 3D LED (蓝色LED) - bit 0 of leds2_val, 0b11111110
// 改动原因定义模式切换标志值用于在SPATIAL_GAME、SPATIAL_MOVIE、STEREO_2K、UAC1之间循环切换
#define MODE_STEREO_2K UAC1_IN_FLAG //4 STEREO_2K模式标志
#define MODE_STEREO_2K USB_IN_FLAG // 2 STEREO_2K模式标志
#define MODE_SPATIAL_GAME COAX_IN_FLAG //1 SPATIAL_GAME模式标志
#define MODE_STEREO_8K OPT_IN_FLAG // 3 SPATIAL_MOVIE模式标志
#define MODE_UAC1 USB_IN_FLAG // 2 UAC1模式标志
#define MODE_SPATIAL_MOVIE OPT_IN_FLAG // 3 SPATIAL_MOVIE模式标志
#define MODE_UAC1 UAC1_IN_FLAG // 4 UAC1模式标志
//Tile 1
void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData, chanend_t c_uac_vol)
@@ -726,9 +732,9 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
static unsigned is_no_effect_mode = 0; // 是否为无音效模式标志模式3
static unsigned is_uac1_mode = 0; // 是否为UAC1模式标志模式4
static unsigned actual_mode_for_led = 0; // UAC1模式下的实际模式值0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE用于LED闪烁
// 改动原因添加当前模式变量用于短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K
// 改动原因添加当前模式变量用于短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=SPATIAL_MOVIE
static unsigned current_mode_local = 0; // 当前模式值0-3
// 改动原因添加LED闪烁相关变量用于STEREO_8K模式的蓝灯闪烁
// 改动原因添加LED闪烁相关变量用于SPATIAL_MOVIE模式的蓝灯闪烁
static unsigned blink_counter = 0; // LED闪烁计数器每100ms递增
int ret = 0;
hwtimer_t timer = hwtimer_alloc();
@@ -781,9 +787,9 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
// 这是音频模式传输命令(用于短按切换模式)
current_mode_local = chan_in_byte(cc_mic_level);
if (current_mode_local > 3) {
current_mode_local = 1; // 如果值无效重置为STEREO_2K
current_mode_local = 0; // 如果值无效重置为STEREO_2K
}
debug_printf("hid_button_task received audio_mode: %d (0=NO_EFFECT, 1=STEREO_2K, 2=SPATIAL_GAME, 3=STEREO_8K)\n", current_mode_local);
debug_printf("hid_button_task received audio_mode: %d (0=NO_EFFECT, 1=STEREO_2K, 2=SPATIAL_GAME, 3=SPATIAL_MOVIE)\n", current_mode_local);
// 改动原因根据接收到的模式值初始化LED和算法状态
if (current_mode_local == 0) {
@@ -814,74 +820,18 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 2 (SPATIAL_GAME): algorithm ON, BLUE LED\n");
} else if (current_mode_local == 3) {
// STEREO_8K模式:蓝灯闪烁,算法开启
// SPATIAL_MOVIE模式:蓝灯闪烁,算法开启
audio_ex3d_onoff(1);
is_3d_on = A3D_ON;
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on (初始状态)
leds1_val |= 1; // Red LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 3 (STEREO_8K): algorithm ON, BLUE LED blinking\n");
debug_printf("Mode 3 (SPATIAL_MOVIE): algorithm ON, BLUE LED blinking\n");
}
port_out(p_leds, leds1_val);
port_out(p_leds2, leds2_val);
// 模式接收完成后继续,不处理按键
} else if (tmp == 0xFE) {
// 改动原因这是game_mode传输命令用于固件模式切换0-3或4=UAC1
game_mode_t1 = chan_in_byte(cc_mic_level);
is_no_effect_mode = (game_mode_t1 == 3) ? 1 : 0; // 模式3为无音效模式
is_uac1_mode = (game_mode_t1 == 4) ? 1 : 0; // 模式4为UAC1模式
debug_printf("hid_button_task received game_mode: %d (NO_EFFECT=%d, UAC1=%d) in event_mic_vol\n",
game_mode_t1, is_no_effect_mode, is_uac1_mode);
// 如果是无音效模式强制禁用3D算法
if (is_no_effect_mode) {
audio_ex3d_onoff(0);
is_3d_on = A3D_OFF;
// 改动原因无音效模式下LED关闭所有LED都灭
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
debug_printf("NO_EFFECT mode: 3D algorithm disabled, LED OFF\n");
}
// 改动原因UAC1模式下的等效模式值将在下一个event_mic_vol中通过0xFD命令接收
// 模式接收完成后继续,不处理按键
} else if (tmp == 0xFD) {
// 改动原因这是UAC1模式下的等效模式值传输命令0xFD命令 + 等效模式值0-2
if (is_uac1_mode) {
actual_mode_for_led = chan_in_byte(cc_mic_level);
debug_printf("hid_button_task received actual_mode_for_led: %d (0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE)\n", actual_mode_for_led);
// 改动原因如果3D算法是开启状态根据等效模式值更新LED显示
if (is_3d_on == A3D_ON) {
if (actual_mode_for_led == 0) {
// STEREO_2K等效模式绿色LED
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
} else if (actual_mode_for_led == 1) {
// SPATIAL_GAME等效模式蓝色LED
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
} else if (actual_mode_for_led == 2) {
// SPATIAL_MOVIE等效模式红色LED
leds1_val &= (~1); // Red LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
}
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
debug_printf("UAC1 mode: LED updated to match equivalent mode %d\n", actual_mode_for_led);
}
} else {
// 非UAC1模式下不应该收到0xFD命令忽略
debug_printf("WARNING: received 0xFD command but not in UAC1 mode, ignoring\n");
chan_in_byte(cc_mic_level); // 读取并丢弃下一个字节
}
// 模式接收完成后继续,不处理按键
} else {
// 正常的mic level命令处理
debug_printf("Processing mic level command: 0x%02X\n", tmp);
@@ -958,18 +908,12 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
} else {
is_stable = 1;
if (press_hold_cnt > 0) {
// 改动原因短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K
// 改动原因短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=SPATIAL_MOVIE
// 循环切换0→1→2→3→0
#if 0
unsigned old_mode = current_mode_local;
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);
// 改动原因通过c_hidSendData发送命令通知button_task保存新模式到flash
// 命令格式0xFB000000 + mode_valuemode_value在低8位
unsigned save_cmd = 0xFB000000 | (current_mode_local & 0xFF);
chan_out_word(c_hidSendData, save_cmd);
debug_printf("Sent save audio_mode command to button_task: 0x%08X\n", save_cmd);
// 改动原因根据模式控制算法和LED
if (current_mode_local == 0) {
// 无音效模式:灯灭,算法关闭
@@ -999,7 +943,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 2 (SPATIAL_GAME): algorithm ON, BLUE LED\n");
} else if (current_mode_local == 3) {
// STEREO_8K模式:蓝灯闪烁,算法开启
// SPATIAL_MOVIE模式:蓝灯闪烁,算法开启
audio_ex3d_onoff(1);
is_3d_on = A3D_ON;
SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on);
@@ -1007,13 +951,13 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
debug_printf("Mode 3 (STEREO_8K): algorithm ON, BLUE LED blinking\n");
debug_printf("Mode 3 (SPATIAL_MOVIE): algorithm ON, BLUE LED blinking\n");
}
// 更新LED输出
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
#endif
unsigned endData[1] = {0xffffffff};
chan_out_word(c_hidSendData, endData[0]);
}
@@ -1024,152 +968,16 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
if (press_hold_cnt == 0) {
// 改动原因长按检测到时在UAC1模式下切换等效模式并保存其他模式切换固件模式
// 保存当前LED状态
saved_leds2_val = leds2_val;
saved_leds1_val = leds1_val;
debug_printf("Long press detected\n");
// saved_leds2_val = leds2_val;
// saved_leds1_val = leds1_val;
// debug_printf("Long press detected\n");
// 改动原因在UAC1模式下长按键切换等效模式0→1→2→0不重启设备
#if UAC1_MODE == 1
{
// UAC1模式循环切换等效模式 0→1→2→0
// 0=STEREO_2K等效, 1=SPATIAL_GAME等效, 2=SPATIAL_MOVIE等效
unsigned old_actual_mode = actual_mode_for_led; // 保存旧值用于日志
unsigned new_actual_mode = (actual_mode_for_led + 1) % 3; // 循环切换 0→1→2→0
actual_mode_for_led = new_actual_mode;
debug_printf("UAC1 mode: switching equivalent mode from %d to %d (0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE)\n",
old_actual_mode, new_actual_mode);
// 改动原因保存新的等效模式值到flash的 "uac1_mode" 文件
unsigned char path_uac1[] = "uac1_mode";
save_value(path_uac1, (unsigned char)new_actual_mode);
debug_printf("Saved uac1_mode %d to flash\n", new_actual_mode);
// 根据新的等效模式值闪烁对应的LED颜色
for (int i = 0; i < BLINK_COUNT; i++) {
// LED亮 - 根据新的等效模式值选择颜色
if (new_actual_mode == 0) {
// STEREO_2K等效模式绿色LED闪烁
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
} else if (new_actual_mode == 1) {
// SPATIAL_GAME等效模式蓝色LED闪烁
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
} else if (new_actual_mode == 2) {
// SPATIAL_MOVIE等效模式红色LED闪烁
leds1_val &= (~1); // Red LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
} else {
// 默认白色LED所有LED都亮
leds2_val = 0xFC; // 0b11111100: bit 0=0(蓝色LED on), bit 1=0(绿色LED on)
leds1_val = 0x0; // 0b00000000: bit 0=0(红色LED on)
}
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
delay_milliseconds(200);
// LED灭
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
delay_milliseconds(200);
}
// 改动原因UAC1模式下根据新的等效模式值更新LED显示如果3D开启
// 如果3D算法是开启状态根据新的等效模式值显示对应的LED颜色
if (is_3d_on == A3D_ON) {
if (new_actual_mode == 0) {
// STEREO_2K等效模式绿色LED
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
} else if (new_actual_mode == 1) {
// SPATIAL_GAME等效模式蓝色LED
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
} else if (new_actual_mode == 2) {
// SPATIAL_MOVIE等效模式红色LED
leds1_val &= (~1); // Red LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
}
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
debug_printf("UAC1 mode: LED updated to match equivalent mode %d\n", new_actual_mode);
} else {
// 3D关闭状态恢复白灯
leds2_val = 0xFC; // 0b11111100: bit 0=0(蓝色LED on), bit 1=0(绿色LED on)
leds1_val = 0x0; // 0b00000000: bit 0=0(红色LED on)
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
}
debug_printf("UAC1 mode: equivalent mode switched to %d, saved to flash, no firmware restart\n", new_actual_mode);
// UAC1模式下不发送0xffffffff不切换固件模式
}
#else
{
// 非UAC1模式正常切换模式原有逻辑
// 直接在这里循环闪烁3次
for (int i = 0; i < BLINK_COUNT; i++) {
// LED亮
#if defined (STEREO_2K)
// STEREO_2K模式绿色LED闪烁3次
leds2_val &= (~(1<<GREEN_LED_PIN)); // Green LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
#elif defined (SPATIAL_GAME)
// SPATIAL_GAME模式蓝色LED闪烁3次
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
#elif defined (SPATIAL_MOVIE)
// SPATIAL_MOVIE模式红色LED闪烁3次
leds1_val &= (~1); // Red LED on
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
#else
// 默认蓝色LED闪烁3次
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds1_val |= 1; // Red LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
#endif
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
delay_milliseconds(100);
// LED灭
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds2_val |= (1<<GREEN_LED_PIN); // Green LED off
leds1_val |= 1; // Red LED off
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
delay_milliseconds(200);
}
// 恢复原始LED状态
leds2_val = saved_leds2_val;
leds1_val = saved_leds1_val;
port_out(p_leds2, leds2_val);
port_out(p_leds, leds1_val);
debug_printf("LED blink completed, mode switch will happen\n");
}
#endif
}
}
}
last_status = key_in;
// 改动原因STEREO_8K模式下蓝灯闪烁每500ms切换一次状态
// 改动原因SPATIAL_MOVIE模式下蓝灯闪烁每500ms切换一次状态
if (current_mode_local == 3) {
blink_counter++;
if (blink_counter >= 5) { // 5 * 100ms = 500ms
@@ -1184,10 +992,30 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c
}
port_out(p_leds2, leds2_val);
}
} else {
// 非STEREO_8K模式重置闪烁计数器
}
else {
blink_counter = 0;
}
#if 0
if (current_mode_local == 0) {
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
leds1_val |= 1; // Red LED off
port_out(p_leds, leds1_val);
port_out(p_leds2, leds2_val);
}
else if (current_mode_local == 1) {
leds1_val &= (~1); // Red LED on
leds2_val |= (1<<BLUE_LED_PIN); // Blue LED off
port_out(p_leds, leds1_val);
port_out(p_leds2, leds2_val);
}
else if (current_mode_local == 2) {
leds2_val &= (~(1<<BLUE_LED_PIN)); // Blue LED on
leds1_val |= 1; // Red LED off
port_out(p_leds, leds1_val);
port_out(p_leds2, leds2_val);
}
#endif
}
continue;
}
@@ -1230,32 +1058,27 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
unsigned host_os;
GET_SHARED_GLOBAL(host_os, g_host_os);
saved_mode = load_value(path);
debug_printf("Loaded game_mode from flash: %d\n", saved_mode);
#if defined(UAC1_MODE)
// 改动原因UAC1模式下从 "uac1_mode" 加载等效模式值0-2并设置为模式4
unsigned char path_uac1[] = "uac1_mode";
saved_uac1_mode = load_value(path_uac1);
if (saved_uac1_mode == 255) {
saved_uac1_mode = 0; // 默认STEREO_2K等效模式
save_value(path_uac1, saved_uac1_mode);
if (saved_mode == 255) {
saved_mode = 0;
save_value(path, saved_mode);
debug_printf("Saved game_mode to flash: %d\n", saved_mode);
}
saved_mode = 4; // UAC1模式固定为4
debug_printf("UAC1 mode: loaded uac1_mode=%d from flash\n", saved_uac1_mode);
#else
// 改动原因Windows模式下从 "game_mode" 加载模式值0-3
saved_mode = load_value(path);
if (saved_mode == 255) {
// 如果文件不存在,根据编译模式设置默认值
#if defined(STEREO_2K)
saved_mode = 0;
#elif defined(SPATIAL_GAME)
saved_mode = 1;
#elif defined(SPATIAL_MOVIE)
saved_mode = 2;
#else
saved_mode = 0;
#elif defined(SPATIAL_MOVIE)
saved_mode = 3;
#endif
save_value(path, saved_mode);
debug_printf("Saved game_mode to flash: %d\n", saved_mode);
}
#endif
@@ -1265,32 +1088,15 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
SetRoleSwitchFlag(MODE_UAC1);
debug_printf("Set role switch flag: 0x%04X (UAC1), device will restart\n", MODE_UAC1);
// 设备会重启,退出函数
return;
device_reboot();
while(1);
}
else {
debug_printf("Detected Windows OS (OS_WIN)\n");
#if UAC1_MODE == 1
// 改动原因Windows模式下检查当前编译模式是否与保存的模式匹配
unsigned need_reboot = 0;
#if defined(STEREO_2K)
if ((saved_mode != 255) && (saved_mode != 0) && (saved_mode != 3)) {
need_reboot = 1;
}
#endif
#if defined(SPATIAL_GAME)
if ((saved_mode != 255) && (saved_mode != 1)) {
need_reboot = 1;
}
#endif
#if defined(SPATIAL_MOVIE)
if ((saved_mode != 255) && (saved_mode != 2)) {
need_reboot = 1;
}
#endif
if (need_reboot) {
{
switch (saved_mode) {
case 0:
SetRoleSwitchFlag(MODE_STEREO_2K);
@@ -1299,7 +1105,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
SetRoleSwitchFlag(MODE_SPATIAL_GAME);
break;
case 2:
SetRoleSwitchFlag(MODE_STEREO_8K);
SetRoleSwitchFlag(MODE_SPATIAL_MOVIE);
break;
case 3:
SetRoleSwitchFlag(MODE_STEREO_2K);
@@ -1309,52 +1115,42 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
break;
}
debug_printf("Switch to saved mode: %d, device will restart.\n", saved_mode);
delay_milliseconds(5);
device_reboot();
while (1);
return;
delay_milliseconds(200);
//device_reboot();
//while (1);
}
#endif
#if defined(STEREO_2K)
if ((saved_mode != 255) && (saved_mode != 0) && (saved_mode != 1)) {
saved_mode = 0;
}
#endif
#if defined(SPATIAL_GAME)
if ((saved_mode != 255) && (saved_mode != 2)) {
saved_mode = 2;
}
#endif
#if defined(SPATIAL_MOVIE)
if ((saved_mode != 255) && (saved_mode != 3)) {
saved_mode = 3;
}
#endif
}
g_windows_detect_done = 1;
// 改动原因更新全局变量g_game_mode为保存的模式值
SET_SHARED_GLOBAL(g_game_mode, saved_mode);
debug_printf("Set new g_game_mode to %d\n", saved_mode);
// 改动原因从flash加载audio_mode用于短按切换模式0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K
unsigned char audio_mode_local;
unsigned char path_audio_mode[] = "audio_mode";
audio_mode_local = load_value(path_audio_mode);
if (audio_mode_local == 255) {
audio_mode_local = 1; // 默认STEREO_2K模式
save_value(path_audio_mode, audio_mode_local);
}
if (audio_mode_local > 3) {
audio_mode_local = 1; // 如果值无效重置为STEREO_2K
save_value(path_audio_mode, audio_mode_local);
}
debug_printf("button_task: loaded audio_mode=%d from flash\n", audio_mode_local);
chan_out_byte(cc_mic_level, 0xFC); // 音频模式传输命令
chan_out_byte(cc_mic_level, saved_mode); // 音频模式值0=无音效1=STEREO_2K2=SPATIAL_GAME3=SPATIAL_MOVIE
debug_printf("Sent audio_mode %d to hid_button_task via cc_mic_level channel\n", saved_mode);
// 改动原因通过cc_mic_level channel发送audio_mode到hid_button_task用于短按切换模式
// 发送格式0xFC命令 + audio_mode_value模式值 0-3
chan_out_byte(cc_mic_level, 0xFC); // 音频模式传输命令
chan_out_byte(cc_mic_level, audio_mode_local); // 音频模式值0=无音效1=STEREO_2K2=SPATIAL_GAME3=STEREO_8K
debug_printf("Sent audio_mode %d to hid_button_task via cc_mic_level channel\n", audio_mode_local);
// 改动原因通过cc_mic_level channel发送game_mode到hid_button_task用于固件模式切换
// 发送格式0xFE命令 + mode_value模式值
chan_out_byte(cc_mic_level, 0xFE); // game_mode传输命令
chan_out_byte(cc_mic_level, saved_mode); // 模式值Windows: 0-3, UAC1: 4
debug_printf("Sent game_mode %d to hid_button_task via cc_mic_level channel\n", saved_mode);
#if defined(UAC1_MODE)
// 改动原因UAC1模式下还需要发送等效模式值0-2给hid_button_task用于LED显示
chan_out_byte(cc_mic_level, 0xFD); // UAC1等效模式传输命令
chan_out_byte(cc_mic_level, saved_uac1_mode); // UAC1等效模式值0=STEREO_2K, 1=SPATIAL_GAME, 2=SPATIAL_MOVIE
debug_printf("Sent uac1_mode %d to hid_button_task via cc_mic_level channel\n", saved_uac1_mode);
#endif
port_enable(p_ctrl_keys);
port_ctrl_keys = port_in(p_ctrl_keys);
if ((port_ctrl_keys & KEY_MUTE) == 0) {
@@ -1381,17 +1177,7 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
unsigned hidData0 = chan_in_word(c_hidSendData);
unsigned *reportData = hidSendData;
reportData[0] = hidData0;
// 改动原因检查是否是保存audio_mode命令0xFB000000格式
if ((hidData0 & 0xFF000000) == 0xFB000000) {
// 这是保存audio_mode命令低8位是模式值
unsigned char new_audio_mode = (unsigned char)(hidData0 & 0xFF);
if (new_audio_mode <= 3) {
unsigned char path_audio_mode[] = "audio_mode";
save_value(path_audio_mode, new_audio_mode);
debug_printf("button_task: saved audio_mode=%d to flash\n", new_audio_mode);
}
continue; // 处理完保存命令后继续不发送HID报告
} else if (hidData0 == 0xffffffff) {
if (hidData0 == 0xffffffff) {
debug_printf("receive end data\n");
// 改动原因收到0xffffffff后循环切换模式并保存到flash然后设置切换标志
// 注意UAC1模式下不会收到此命令hid_button_task不发送
@@ -1403,40 +1189,39 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level, chanend_t c_ua
// 循环切换模式0(STEREO_2K) -> 1(SPATIAL_GAME) -> 2(SPATIAL_MOVIE) -> 3(无音效) -> 0
unsigned new_mode;
unsigned mode_flag;
debug_printf("current_mode: %d\n", current_mode);
#if UAC1_MODE != 1
if (current_mode == 0) {
// 当前是STEREO_2K切换到SPATIAL_GAME
// 当前是STEREO_2K切换到STEREO_2K
new_mode = 1;
mode_flag = MODE_SPATIAL_GAME;
debug_printf("Switching from STEREO_2K (0) to SPATIAL_GAME (1)\n");
mode_flag = MODE_STEREO_2K;
debug_printf("Switching from STEREO_2K (0) to STEREO_2K (1)\n");
} else if (current_mode == 1) {
// 当前是SPATIAL_GAME切换到SPATIAL_MOVIE
// 当前是STEREO_2K切换到SPATIAL_GAME
new_mode = 2;
mode_flag = MODE_STEREO_8K;
debug_printf("Switching from SPATIAL_GAME (1) to SPATIAL_MOVIE (2)\n");
mode_flag = MODE_SPATIAL_GAME;
debug_printf("Switching from STEREO_2K (1) to SPATIAL_GAME (2)\n");
} else if (current_mode == 2) {
// 当前是STEREO_8K切换到无音效模式
// 当前是SPATIAL_GAME切换到SPATIAL_MOVIE
new_mode = 3;
mode_flag = MODE_STEREO_2K; // 无音效模式使用STEREO_2K固件
debug_printf("Switching from STEREO_8K (2) to NO_EFFECT (3)\n");
} else if (current_mode == 3) {
// 当前是无音效模式切换回STEREO_2K完成循环
mode_flag = MODE_SPATIAL_MOVIE; // SPATIAL_MOVIE模式使用SPATIAL_MOVIE固件
debug_printf("Switching from SPATIAL_GAME (2) to SPATIAL_MOVIE (3)\n");
} // 更新g_game_mode
else if(current_mode == 3) {
new_mode = 0;
mode_flag = MODE_STEREO_2K;
debug_printf("Switching from NO_EFFECT (3) to STEREO_2K (0)\n");
}
// 更新g_game_mode
SET_SHARED_GLOBAL(g_game_mode, new_mode);
debug_printf("Switching from SPATIAL_MOVIE (3) to STEREO_2K (0)\n");
}
// 改动原因保存新的模式值到flash的 "game_mode" 文件Windows模式专用
unsigned char path[] = "game_mode";
save_value(path, (unsigned char)new_mode);
debug_printf("Saved game_mode %d to flash\n", new_mode);
debug_printf("Set role switch flag: 0x%04X\n", mode_flag);
// 设置角色切换标志,触发模式切换
SetRoleSwitchFlag(mode_flag);
debug_printf("Set role switch flag: 0x%04X\n", mode_flag);
delay_milliseconds(5);
delay_milliseconds(20);
device_reboot();
while (1);
#endif

View File

@@ -617,8 +617,6 @@ int main()
on tile[AUDIO_IO_TILE]: sw_pll_task(c_sw_pll);
#endif
on tile[0]: while (1);
on tile[AUDIO_IO_TILE]:
{
/* Audio I/O task, includes mixing etc */