diff --git a/lib_xua/lib_xua/src/core/uac_hwresources.h b/lib_xua/lib_xua/src/core/uac_hwresources.h index dda3f67..08ff66d 100644 --- a/lib_xua/lib_xua/src/core/uac_hwresources.h +++ b/lib_xua/lib_xua/src/core/uac_hwresources.h @@ -8,8 +8,8 @@ #define CLKBLK_SPDIF_TX XS1_CLKBLK_1 #define CLKBLK_SPDIF_RX XS1_CLKBLK_1 #define CLKBLK_MCLK XS1_CLKBLK_2 -#define CLKBLK_FLASHLIB XS1_CLKBLK_1 /* Clock block for use by flash lib */ +#define CLKBLK_FLASHLIB XS1_CLKBLK_3 /* Clock block for use by flash lib */ #define CLKBLK_ADAT_RX XS1_CLKBLK_REF /* Use REF for ADAT_RX on x200/AI series */ -#define CLKBLK_I2S_BIT XS1_CLKBLK_3 +#define CLKBLK_I2S_BIT XS1_CLKBLK_1 #endif /* _UAC_HWRESOURCES_H_ */ diff --git a/sw_usb_audio/app_usb_aud_phaten_golden/CMakeLists.txt b/sw_usb_audio/app_usb_aud_phaten_golden/CMakeLists.txt index ae5ae48..2528d62 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden/CMakeLists.txt +++ b/sw_usb_audio/app_usb_aud_phaten_golden/CMakeLists.txt @@ -54,36 +54,65 @@ set(SW_USB_AUDIO_FLAGS ${EXTRA_BUILD_FLAGS} -O3 -DDEBUG_PRINT_ENABLE=0) -LINK_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/../../lib_dnr/lib_dnr) -set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 +LINK_DIRECTORIES(${CMAKE_CURRENT_LIST_DIR}/../../lib_dnr/lib_dnr) + +set(APP_COMPILER_FLAGS_ex3d_UAC1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 -DI2S_CHANS_ADC=2 - #-DAUDIO_CLASS=1 - -DMIN_FREQ=48000 - -DMAX_FREQ=48000 - -DUSE_EX3D + -DAUDIO_CLASS=1 + -DMIN_FREQ=48000 + -DMAX_FREQ=48000 + -DUSE_EX3D -DMIXER=0 -DAIZIP_DNR=0 #-ldnr_50ms -llib_ex3d_stereo_2k -DNUM_USB_CHAN_OUT=2 - -DNUM_USB_CHAN_IN=2 + -DNUM_USB_CHAN_OUT_FS=2 + -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 -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16 -DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16 - -DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16 + -DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16 -DNUM_EX3D_CHAN_OUT=2 -DINPUT_VOLUME_CONTROL=0 + -DUAC1_MODE=1 + -DEQ_EN=1 -DOUTPUT_VOLUME_CONTROL=0 -DSTEREO_2K -DHID_CONTROLS=1) -set(APP_COMPILER_FLAGS_ex3d_stereo_8k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 + +set(APP_COMPILER_FLAGS_ex3d_stereo_2k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 + -DI2S_CHANS_ADC=0 + #-DAUDIO_CLASS=1 + -DMIN_FREQ=48000 + -DMAX_FREQ=48000 + -DUSE_EX3D + -DMIXER=0 + -DAIZIP_DNR=0 #-ldnr_50ms + -llib_ex3d_stereo_2k + -DNUM_USB_CHAN_OUT=2 + -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 + -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16 + -DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16 + -DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16 + -DNUM_EX3D_CHAN_OUT=2 + -DINPUT_VOLUME_CONTROL=0 + -DEQ_EN=1 + -DOUTPUT_VOLUME_CONTROL=0 + -DSTEREO_2K + -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 - -DMIN_FREQ=48000 - -DMAX_FREQ=48000 - -DUSE_EX3D + -DMIN_FREQ=48000 + -DMAX_FREQ=48000 + -DUSE_EX3D -DMIXER=0 -DAIZIP_DNR=0 #-ldnr_50ms -llib_ex3d_stereo_8k @@ -94,19 +123,19 @@ set(APP_COMPILER_FLAGS_ex3d_stereo_8k ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 -DSTREAM_FORMAT_OUTPUT_3_RESOLUTION_BITS=16 -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16 -DSTREAM_FORMAT_INPUT_2_RESOLUTION_BITS=16 - -DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16 + -DSTREAM_FORMAT_INPUT_3_RESOLUTION_BITS=16 -DNUM_EX3D_CHAN_OUT=2 -DINPUT_VOLUME_CONTROL=0 -DOUTPUT_VOLUME_CONTROL=0 -DSTEREO_8K -DHID_CONTROLS=1) -set(APP_COMPILER_FLAGS_ex3d_71_game ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 +set(APP_COMPILER_FLAGS_ex3d_71_game ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 -DI2S_CHANS_ADC=2 - -DMIN_FREQ=48000 - -DMAX_FREQ=48000 + -DMIN_FREQ=48000 + -DMAX_FREQ=48000 -DUSE_EX3D - -DMIXER=0 + -DMIXER=0 -DAIZIP_DNR=0 #-ldnr_50ms -llib_ex3d_game -DNUM_USB_CHAN_OUT=8 @@ -114,14 +143,15 @@ set(APP_COMPILER_FLAGS_ex3d_71_game ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 -DNUM_EX3D_CHAN_OUT=2 -DMIN_VOLUME=0xE000 -DSPATIAL_GAME + -DEQ_EN=1 -DHID_CONTROLS=1) -set(APP_COMPILER_FLAGS_ex3d_71_music ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 +set(APP_COMPILER_FLAGS_ex3d_71_music ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 -DI2S_CHANS_ADC=2 - -DMIN_FREQ=48000 - -DMAX_FREQ=48000 + -DMIN_FREQ=48000 + -DMAX_FREQ=48000 -DUSE_EX3D - -DMIXER=0 + -DMIXER=0 -DAIZIP_DNR=0 #-ldnr_50ms -llib_ex3d_music -DNUM_USB_CHAN_OUT=8 @@ -130,28 +160,29 @@ set(APP_COMPILER_FLAGS_ex3d_71_music ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 -DMIN_VOLUME=0xE000 -DSPATIAL_MUSIC -DHID_CONTROLS=1) - -set(APP_COMPILER_FLAGS_ex3d_71_movie ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 + +set(APP_COMPILER_FLAGS_ex3d_71_movie ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 -DI2S_CHANS_ADC=2 - -DMIN_FREQ=48000 - -DMAX_FREQ=48000 + -DMIN_FREQ=48000 + -DMAX_FREQ=48000 -DUSE_EX3D - -DMIXER=0 + -DMIXER=0 -DAIZIP_DNR=0 #-ldnr_50ms -llib_ex3d_movie -DNUM_USB_CHAN_OUT=8 -DNUM_USB_CHAN_IN=2 -DNUM_EX3D_CHAN_OUT=2 -DMIN_VOLUME=0xE000 + -DEQ_EN=1 -DSPATIAL_MOVIE - -DHID_CONTROLS=1) + -DHID_CONTROLS=1) -set(APP_COMPILER_FLAGS_ex3d_71_drama ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 +set(APP_COMPILER_FLAGS_ex3d_71_drama ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 -DI2S_CHANS_ADC=2 - -DMIN_FREQ=48000 - -DMAX_FREQ=48000 + -DMIN_FREQ=48000 + -DMAX_FREQ=48000 -DUSE_EX3D - -DMIXER=0 + -DMIXER=0 -DAIZIP_DNR=0 #-ldnr_50ms -llib_ex3d_drama -DNUM_USB_CHAN_OUT=8 diff --git a/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/dsp.c b/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/dsp.c index c5fabd8..8ed7cb1 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/dsp.c +++ b/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/dsp.c @@ -25,6 +25,12 @@ // 改动原因:添加user_func.h头文件,用于调用save_value和load_value函数保存/加载模式到/从flash extern void save_value(unsigned char *path, unsigned char value); extern unsigned char load_value(unsigned char *path); +// 改动原因:添加g_host_os外部声明,用于检测主机操作系统类型(Windows或非Windows) +extern unsigned g_host_os; // 1 -> Windows, 2 -> Others +extern void device_reboot(void); +unsigned g_windows_detect_done = 0; +unsigned g_ex3d_key_verified = 0; +enum { OS_WIN = 1, OS_OTHERS = 2 }; chanend_t uc_ex3d_to_ubm, uc_eq_data; @@ -70,11 +76,11 @@ void SetEqDataChan (chanend_t c) { void key_receiver(chanend_t c) { debug_printf("===> key_receiver\n"); - - // tile0 + // tile0 // load the license key // This function must be called before audio_ex3d_activate_key. audio_ex3d_load_key(c); + SET_SHARED_GLOBAL(g_ex3d_key_verified, 1); } void key_sender(chanend_t c) @@ -691,8 +697,6 @@ void hid_update(unsigned char hid_data) { #define KEY_POLLING_INTERVAL 10000000L // 100ms polling interval #define HOLD_THRESHOLD 20 // time = HOLD_THRESHOLD * KEY_POLLING_INTERVAL = 2000ms // 改动原因:添加LED闪烁相关宏定义,用于长按时直接循环闪烁3次 -#define BLINK_ON_INTERVAL 2 // LED闪烁亮持续时间:2 * 100ms = 200ms -#define BLINK_OFF_INTERVAL 2 // LED闪烁灭持续时间:2 * 100ms = 200ms #define BLINK_COUNT 3 // LED闪烁次数:3次 #endif @@ -708,10 +712,11 @@ void hid_update(unsigned char hid_data) { #define GREEN_LED_PIN 1 // DNR LED (绿色LED) - bit 1 of leds2_val, 0b11111101 #define BLUE_LED_PIN 0 // 3D LED (蓝色LED) - bit 0 of leds2_val, 0b11111110 -// 改动原因:定义模式切换标志值,用于在SPATIAL_GAME、SPATIAL_MOVIE、STEREO_2K之间循环切换 -#define MODE_STEREO_2K USB_IN_FLAG // STEREO_2K模式标志 -#define MODE_SPATIAL_GAME COAX_IN_FLAG // SPATIAL_GAME模式标志 -#define MODE_SPATIAL_MOVIE OPT_IN_FLAG // SPATIAL_MOVIE模式标志 +// 改动原因:定义模式切换标志值,用于在SPATIAL_GAME、SPATIAL_MOVIE、STEREO_2K、UAC1之间循环切换 +#define MODE_STEREO_2K UAC1_IN_FLAG //4 STEREO_2K模式标志 +#define MODE_SPATIAL_GAME COAX_IN_FLAG //1 SPATIAL_GAME模式标志 +#define MODE_SPATIAL_MOVIE OPT_IN_FLAG // 3 SPATIAL_MOVIE模式标志 +#define MODE_UAC1 USB_IN_FLAG // 2 UAC1模式标志 //Tile 1 void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData) @@ -732,9 +737,11 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c // 改动原因:添加LED闪烁相关变量,用于保存原始LED状态 static uint8_t saved_leds2_val = 0; // 保存原始leds2_val状态 static uint8_t saved_leds1_val = 0; // 保存原始leds1_val状态 - // 改动原因:添加模式变量,用于存储从button_task接收的模式值,判断是否在无音效模式 - static unsigned game_mode_t1 = 0; // tile1上的模式值,用于判断是否在无音效模式 + // 改动原因:添加模式变量,用于存储从button_task接收的模式值,判断是否在无音效模式或UAC1模式 + static unsigned game_mode_t1 = 0; // tile1上的模式值,用于判断是否在无音效模式或UAC1模式 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闪烁 int ret = 0; hwtimer_t timer = hwtimer_alloc(); // init mic level @@ -749,6 +756,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c // 初始化时先设置默认值,模式值将在event_mic_vol中接收 // 这样可以避免阻塞按键轮询 is_no_effect_mode = 0; + is_uac1_mode = 0; game_mode_t1 = 0; debug_printf("hid_button_task init: waiting for mode value from button_task\n"); @@ -781,8 +789,10 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c if (tmp == 0xFE) { // 这是模式传输命令 game_mode_t1 = chan_in_byte(cc_mic_level); - is_no_effect_mode = (game_mode_t1 == 3) ? 1 : 0; - debug_printf("hid_button_task received game_mode: %d (NO_EFFECT=%d) in event_mic_vol\n", game_mode_t1, is_no_effect_mode); + 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) { @@ -795,6 +805,41 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c port_out(p_leds, leds1_val); debug_printf("NO_EFFECT mode: 3D algorithm disabled, WHITE LED (all on)\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< 0)) { press_hold_cnt--; if (press_hold_cnt == 0) { - // 改动原因:长按检测到时,根据不同宏定义直接执行LED闪烁3次循环 + // 改动原因:长按检测到时,在UAC1模式下切换等效模式并保存,其他模式切换固件模式 // 保存当前LED状态 saved_leds2_val = leds2_val; saved_leds1_val = leds1_val; - debug_printf("Long press detected, start LED blink\n"); + debug_printf("Long press detected\n"); - // 直接在这里循环闪烁3次 - for (int i = 0; i < BLINK_COUNT; i++) { - // LED亮 -#if defined (STEREO_2K) - // STEREO_2K模式:绿色LED闪烁3次 - leds2_val &= (~(1< 1(SPATIAL_GAME) -> 2(SPATIAL_MOVIE) -> 3(无音效) -> 0 unsigned new_mode; unsigned mode_flag; +#if UAC1_MODE != 1 if (current_mode == 0) { // 当前是STEREO_2K,切换到SPATIAL_GAME new_mode = 1; mode_flag = MODE_SPATIAL_GAME; - printf("Switching from STEREO_2K to SPATIAL_GAME\n"); + printf("Switching from STEREO_2K (0) to SPATIAL_GAME (1)\n"); } else if (current_mode == 1) { // 当前是SPATIAL_GAME,切换到SPATIAL_MOVIE new_mode = 2; mode_flag = MODE_SPATIAL_MOVIE; - printf("Switching from SPATIAL_GAME to SPATIAL_MOVIE\n"); + printf("Switching from SPATIAL_GAME (1) to SPATIAL_MOVIE (2)\n"); } else if (current_mode == 2) { // 当前是SPATIAL_MOVIE,切换到无音效模式 new_mode = 3; mode_flag = MODE_STEREO_2K; // 无音效模式使用STEREO_2K固件 - printf("Switching from SPATIAL_MOVIE to NO_EFFECT (3)\n"); - } else { - // 当前是无音效模式(3)或其他,切换到STEREO_2K + printf("Switching from SPATIAL_MOVIE (2) to NO_EFFECT (3)\n"); + } else if (current_mode == 3) { + // 当前是无音效模式,切换回STEREO_2K(完成循环) new_mode = 0; mode_flag = MODE_STEREO_2K; - printf("Switching to STEREO_2K\n"); + printf("Switching from NO_EFFECT (3) to STEREO_2K (0)\n"); + } else { + // 其他模式值(如4=UAC1),不应该在这里处理,但为了安全,重置为0 + new_mode = 0; + mode_flag = MODE_STEREO_2K; + printf("Unknown mode %d, resetting to STEREO_2K (0)\n", current_mode); } - + // 更新g_game_mode SET_SHARED_GLOBAL(g_game_mode, new_mode); - // 保存新的模式值到flash + // 改动原因:保存新的模式值到flash的 "game_mode" 文件(Windows模式专用) unsigned char path[] = "game_mode"; save_value(path, (unsigned char)new_mode); printf("Saved game_mode %d to flash\n", new_mode); @@ -1158,7 +1366,10 @@ void button_task(chanend_t c_hidSendData, chanend_t cc_mic_level) // 设置角色切换标志,触发模式切换 SetRoleSwitchFlag(mode_flag); printf("Set role switch flag: 0x%04X\n", mode_flag); - + delay_milliseconds(5); + device_reboot(); + while (1); +#endif break; } for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) { diff --git a/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/dsp_core0.xc b/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/dsp_core0.xc index 650c425..a7bcb9b 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/dsp_core0.xc +++ b/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/dsp_core0.xc @@ -34,6 +34,7 @@ extern unsigned int g_saved_eq_mode; // 改动原因:添加保存模式外部 extern void debug_print_eq_params(unsigned sample_freq); extern uint32_t get_reference_time(void); extern void update_eq_post_gain(void); +extern unsigned g_windows_detect_done; #pragma unsafe arrays void dsp_core0(void) @@ -53,6 +54,12 @@ void dsp_core0(void) // EQ Flash存储初始化标志 delay_milliseconds(100); + unsigned windows_detect_done; + GET_SHARED_GLOBAL(windows_detect_done, g_windows_detect_done); + while (windows_detect_done == 0) { + asm("nop"); + GET_SHARED_GLOBAL(windows_detect_done, g_windows_detect_done); + } #if EQ_EN diff --git a/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/lfs_services.c b/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/lfs_services.c index eef7a2a..6fb0f37 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/lfs_services.c +++ b/sw_usb_audio/app_usb_aud_phaten_golden/src/extensions/lfs_services.c @@ -11,7 +11,7 @@ lfs_file_t file; swlock_t lfs_lock = SWLOCK_INITIAL_VALUE; static rtos_qspi_flash_t qspi_flash_ctx_s; -#define FLASH_CLKBLK XS1_CLKBLK_1 +#define FLASH_CLKBLK XS1_CLKBLK_3 #ifndef FS_BASE_ADDR #define FS_BASE_ADDR 0x180000 #endif @@ -102,7 +102,7 @@ void lfs_deinit(void) { swlock_release(&lfs_lock); } -#pragma stackfunction 10480 +#pragma stackfunction 5480 void lfs_read_config(unsigned char * config, unsigned char * buffer, unsigned size) { swlock_acquire(&lfs_lock); @@ -130,7 +130,7 @@ void lfs_read_config(unsigned char * config, unsigned char * buffer, unsigned si } -#pragma stackfunction 10480 +#pragma stackfunction 5480 void lfs_write_config(unsigned char * config, unsigned char * buffer, unsigned size) { swlock_acquire(&lfs_lock); diff --git a/sw_usb_audio/deps.cmake b/sw_usb_audio/deps.cmake index 91c24b4..8e5cc8f 100644 --- a/sw_usb_audio/deps.cmake +++ b/sw_usb_audio/deps.cmake @@ -10,6 +10,7 @@ set(APP_DEPENDENT_MODULES "lib_xua(5.0.0)" "lib_i2s(5.1.0)" "lib_audio_dsp(1.4.0)" "lib_agc" + "lib_roleswitch" ) include_directories("${CMAKE_CURRENT_LIST_DIR}/../lib_ex3d/lib_ex3d/api")