From 7875f6122df0beb1ba0d14f1e2a841f95711cc37 Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Wed, 13 May 2026 16:57:10 +0800 Subject: [PATCH] windows detection --- .../app_usb_aud_fosi_c1/CMakeLists.txt | 197 ++++-------------- .../app_usb_aud_fosi_c1/gen_factory.bat | 2 +- .../app_usb_aud_fosi_c1/gen_update.bat | 2 +- .../src/extensions/audiohw.xc | 65 +++++- .../src/extensions/host_os_detect.c | 102 +++++++++ 5 files changed, 207 insertions(+), 161 deletions(-) create mode 100644 sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/host_os_detect.c diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt b/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt index 2040868..93a71eb 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt +++ b/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt @@ -108,161 +108,46 @@ set(APP_COMPILER_FLAGS_factory ${SW_FACT_AUDIO_FLAGS} -DI2S_CHANS_DA -DNUM_USB_CHAN_OUT=2 -DI2S_CHANS_ADC=0) -#set(APP_COMPILER_FLAGS_boot_0x1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2 -# -DNUM_USB_CHAN_IN=0 -# -DDSD_CHANS_DAC=2 -# -DHID_DFU_EN=1 -# -DI2S_DSD_SHARED=1 -# -DXUA_DFU_EN=1 -# -DBOOT_MODE=1 -# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=32 -# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=24 -# -DMAX_FREQ=\(768000\) -# -DMIN_FREQ=\(44100\) -# -DDEFAULT_FREQ=\(44100\) -# -DHID_CONTROLS=1 -# #-DDEBUG_MEMORY_LOG_ENABLED=0 -# -DNUM_USB_CHAN_OUT=2 -# -DI2S_CHANS_ADC=0) -# -# -#set(MODE_2AMi0o2xxxxxxw16r768_VALUES I2S_MODE=0 -# SYNC_MODE=0 -# MIDI_ENABLE=0 -# SPDIF_IN_ENABLE=0 -# SPDIF_OUT_ENABLE=0 -# ADAT_IN_ENABLE=0 -# ADAT_OUT_ENABLE=0 -# DSD_OUT_ENABLE=0 -# AUDIO_SAMPLE_RATE=9 # 768KHz -# MQA_ENABLE=0 -# AUDIO_CLASS=1 # UAC 2.0 -# AUDIO_WIDTH=2 # 16bit -# INPUT_CHANNEL=0 # Disable -# OUTPUT_CHANNEL=2 # 2 channels -# OTHER_CFG=0) -# -# -#calculate_config_value(MODE_2AMi0o2xxxxxxw16r768_VALUES CONFIG_VALUE) -##set(VARIABLE_NAME "APP_COMPILER_FLAGS_${CONFIG_VALUE}") -# -# -#set(APP_COMPILER_FLAGS_2AMi0o2xxxxxxw32r768_${CONFIG_VALUE} ${SW_USB_AUDIO_FLAGS} -# -DI2S_CHANS_DAC=2 -# -DDSD_CHANS_DAC=2 -# -DI2S_DSD_SHARED=1 -# -DNUM_USB_CHAN_IN=0 -# -DNUM_USB_CHAN_OUT=2 -# -DXUA_DFU_EN=1 -# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=32 -# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=24 -# -DMAX_FREQ=\(384000\) -# -DMIN_FREQ=\(44100\) -# -DDEFAULT_FREQ=\(44100\) -# -DHID_DFU_EN=1 -# #-fxscope -# #-DXSCOPE -# -DHID_CONTROLS=1 -# -DEQ_EN=1 -# #-DDEBUG_MEMORY_LOG_ENABLED=1 -# -DNO_LOG_TIMESTAPS=1 -# -DI2S_CHANS_ADC=0) -# -#set(MODE_2AMi0o0xsxxxxw24r192_VALUES I2S_MODE=0 -# SYNC_MODE=0 -# MIDI_ENABLE=0 -# SPDIF_IN_ENABLE=1 -# SPDIF_OUT_ENABLE=0 -# ADAT_IN_ENABLE=0 -# ADAT_OUT_ENABLE=0 -# DSD_OUT_ENABLE=0 -# AUDIO_SAMPLE_RATE=5 # 768KHz -# MQA_ENABLE=0 -# AUDIO_CLASS=1 # UAC 2.0 -# AUDIO_WIDTH=1 # 24bit -# INPUT_CHANNEL=0 # Disable -# OUTPUT_CHANNEL=2 # 2 channels -# OTHER_CFG=0) -# -# -#calculate_config_value(MODE_2AMi0o0xsxxxxw24r192_VALUES CONFIG_VALUE) -# -# -#set(APP_COMPILER_FLAGS_2AMi0o0xsxxxxw24r192_${CONFIG_VALUE} ${SW_USB_AUDIO_FLAGS} -# -DXUA_SPDIF_RX_EN=1 -# -DXUA_SPDIF_TX_EN=0 -# -DI2S_CHANS_DAC=2 -# -DSPDIF_RX_I2S_OUT=1 -# -DXUA_USB_EN=0 -# -DNUM_USB_CHAN_IN=0 -# -DNUM_USB_CHAN_OUT=0 -# -DXUA_USE_SW_PLL=1 -# -DOUT_VOLUME_IN_MIXER=0 -# -DXUA_DFU_EN=0 -# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=24 -# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16 -# -DMCLK_441=\(512*44100\) -# -DMCLK_48=\(512*48000\) -# -DMAX_FREQ=\(192000\) -# -DMIN_FREQ=\(44100\) -# -DDEFAULT_FREQ=\(44100\) -# -DHID_CONTROLS=0 -# -DOPT=1 -# -DEQ_EN=1 -# -DSPDIF_RX_TILE=1 -# -DDEBUG_MEMORY_LOG_ENABLED=0 -# -DNO_LOG_TIMESTAPS=0 -# -DI2S_CHANS_ADC=0) -# -#set(MODE_2AMi0o0xsxxxxw24r192_VALUES I2S_MODE=0 -# SYNC_MODE=0 -# MIDI_ENABLE=0 -# SPDIF_IN_ENABLE=1 -# SPDIF_OUT_ENABLE=0 -# ADAT_IN_ENABLE=0 -# ADAT_OUT_ENABLE=0 -# DSD_OUT_ENABLE=0 -# AUDIO_SAMPLE_RATE=5 # 768KHz -# MQA_ENABLE=0 -# AUDIO_CLASS=1 # UAC 2.0 -# AUDIO_WIDTH=1 # 24bit -# INPUT_CHANNEL=0 # Disable -# OUTPUT_CHANNEL=2 # 2 channels -# OTHER_CFG=1) -# -# -# -#calculate_config_value(MODE_2AMi0o0xsxxxxw24r192_VALUES CONFIG_VALUE) -# -# -#set(APP_COMPILER_FLAGS_2AMi0o0xsxxxxw24r192_${CONFIG_VALUE} ${SW_USB_AUDIO_FLAGS} -# -DXUA_SPDIF_RX_EN=1 -# -DXUA_SPDIF_TX_EN=0 -# -DI2S_CHANS_DAC=2 -# -DSPDIF_RX_I2S_OUT=1 -# -DXUA_USB_EN=0 -# -DNUM_USB_CHAN_IN=0 -# -DNUM_USB_CHAN_OUT=0 -# -DXUA_USE_SW_PLL=1 -# -DOUT_VOLUME_IN_MIXER=0 -# -DXUA_DFU_EN=0 -# -DSTREAM_FORMAT_OUTPUT_2_RESOLUTION_BITS=24 -# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16 -# -DMCLK_441=\(512*44100\) -# -DMCLK_48=\(512*48000\) -# -DMAX_FREQ=\(192000\) -# -DMIN_FREQ=\(44100\) -# -DDEFAULT_FREQ=\(44100\) -# -DHID_CONTROLS=0 -# -DCOAX=1 -# -DEQ_EN=1 -# -DUART_DEBUG=0 -# -DSPDIF_RX_TILE=1 -# #-DDEBUG_MEMORY_LOG_ENABLED=0 -# -DNO_LOG_TIMESTAPS=0 -# -DI2S_CHANS_ADC=0) +set(APP_COMPILER_FLAGS_fps_uac1 ${SW_USB_AUDIO_FLAGS} -DXUA_SPDIF_RX_EN=0 + -DXUA_SPDIF_TX_EN=0 + -DI2S_CHANS_DAC=2 + -DSPDIF_RX_I2S_OUT=0 + -DAUDIO_CLASS=1 + -DXUA_USB_EN=1 + -DNUM_USB_CHAN_IN=2 + -DWINDOWS_OS_DESCRIPTOR_SUPPORT + -DNUM_USB_CHAN_IN_FS=2 + -DNUM_USB_CHAN_OUT=2 + -DNUM_USB_CHAN_OUT_FS=2 + -DXUA_USE_SW_PLL=0 + -DOUT_VOLUME_IN_MIXER=0 + #-fxscope + #-DXSCOPE + -DXUA_DFU_EN=0 + -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=24 + -DOUTPUT_FORMAT_COUNT=1 + -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=24 + -DINPUT_FORMAT_COUNT=1 + -DMCLK_441=\(1024*44100\) + -DMCLK_48=\(1024*48000\) + -DMAX_FREQ=\(48000\) + -DMIN_FREQ=\(48000\) + -DDEFAULT_FREQ=\(48000\) + -lxmos_fps + -DHID_CONTROLS_UAC1=1 + -DEQ_EN=1 + -DXMOS_FPS_EN=1 + -DUAC1=1 + -DWIN_OS_DETECTION=1 + -DHID_CONTROLS=1 + -DDNR_50MS=1 + -ldnr_50ms + -DDEBUG_MEMORY_LOG_ENABLED=1 + -DNO_LOG_TIMESTAPS=0 + -DI2S_CHANS_ADC=2) -set(APP_COMPILER_FLAGS_fps ${SW_USB_AUDIO_FLAGS} -DXUA_SPDIF_RX_EN=0 + +set(APP_COMPILER_FLAGS_fps_uac2 ${SW_USB_AUDIO_FLAGS} -DXUA_SPDIF_RX_EN=0 -DXUA_SPDIF_TX_EN=0 -DI2S_CHANS_DAC=2 -DSPDIF_RX_I2S_OUT=0 @@ -277,7 +162,7 @@ set(APP_COMPILER_FLAGS_fps ${SW_USB_AUDIO_FLAGS} -DXUA_SPDIF_RX -DOUT_VOLUME_IN_MIXER=0 #-fxscope #-DXSCOPE - -DXUA_DFU_EN=0 + -DXUA_DFU_EN=1 -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=32 -DOUTPUT_FORMAT_COUNT=1 -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=32 @@ -299,7 +184,7 @@ set(APP_COMPILER_FLAGS_fps ${SW_USB_AUDIO_FLAGS} -DXUA_SPDIF_RX -DNO_LOG_TIMESTAPS=0 -DI2S_CHANS_ADC=2) -set(APP_COMPILER_FLAGS_v71 ${SW_USB_AUDIO_FLAGS} +set(APP_COMPILER_FLAGS_br_uac2 ${SW_USB_AUDIO_FLAGS} -DXUA_SPDIF_RX_EN=0 -DXUA_SPDIF_TX_EN=0 -DI2S_CHANS_DAC=2 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/gen_factory.bat b/sw_usb_audio/app_usb_aud_fosi_c1/gen_factory.bat index 0704b9b..7f349c4 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/gen_factory.bat +++ b/sw_usb_audio/app_usb_aud_fosi_c1/gen_factory.bat @@ -1 +1 @@ -xflash bin/factory/phaten_module_factory.xe --loader loader.o --upgrade 2 bin/fps/phaten_module_fps.xe --upgrade 1 bin/v71/phaten_module_v71.xe -o %1 +xflash bin/factory/phaten_module_factory.xe --loader loader.o --upgrade 2 bin/fps_uac1/phaten_module_fps_uac1.xe --upgrade 1 bin/fps_uac2/phaten_module_fps_uac2.xe --upgrade 3 bin/br_uac2/phaten_module_br_uac2.xe -o %1 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/gen_update.bat b/sw_usb_audio/app_usb_aud_fosi_c1/gen_update.bat index 8c132fe..e481b17 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/gen_update.bat +++ b/sw_usb_audio/app_usb_aud_fosi_c1/gen_update.bat @@ -1 +1 @@ -xflash --factory-version 15.3 --target-file src/core/xu316_qf60.xn --upgrade 2 bin/fps/phaten_module_fps.xe --upgrade 1 bin/v71/phaten_module_v71.xe -o %1 +xflash --factory-version 15.3 --target-file src/core/xu316_qf60.xn --upgrade 2 bin/fps_uac1/phaten_module_fps_uac1.xe --upgrade 1 bin/fps_uac2/phaten_module_fps_uac2.xe --upgrade 3 bin/br_uac2/phaten_module_br_uac2.xe -o %1 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc index e86da8a..974487d 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/audiohw.xc @@ -31,7 +31,15 @@ extern "C" { #define TIMER_PERIOD 2000000 +#define DISABLE_REBOOT 1 +#define MODE_FPS_UAC2 COAX_IN_FLAG // 1 FPS +#define MODE_FPS_UAC1 USB_IN_FLAG // 2 UAC1 +#define MODE_BR_UAC2 OPT_IN_FLAG // 3 BR +#define MODE_V71_UAC2 UAC1_IN_FLAG // 4 V71 +#define MODE_V71_UAC1 BT_IN_FLAG // 5 UAC1 + +extern unsigned g_host_os; // 1 -> Windows, 2 -> Others audio_sampling g_new_playback_format, g_playback_format; audio_type g_new_audio_type, g_audio_type = 0; unsigned g_mute_enable = 0; @@ -157,7 +165,7 @@ on tile[0]: out port p_gpio = XS1_PORT_4F; #define LED_CYAN (LED_GREEN & LED_BLUE) #define LED_PURPLE (LED_RED & LED_BLUE) #define LED_WHITE (LED_RED & LED_GREEN & LED_BLUE) -unsigned g_led_color = LED_OFF; +enum { OS_WIN = 1, OS_OTHERS = 2 }; unsigned g_led_blink_count = 0; unsigned g_led_blink_is_white = 0; @@ -272,7 +280,7 @@ static inline i2c_regop_res_t NAU88C22_REGWRITE(unsigned reg, unsigned val, clie } else { - debug_printf("write reg [0x%02X] [0x%02X]\n", reg, val); + // debug_printf("write reg [0x%02X] [0x%02X]\n", reg, val); } return result; @@ -349,6 +357,8 @@ void codec_init(void) void dac_volume(signed level, client interface i2c_master_if i2c) { // 1dB/步: level 范围 -28 ~ 0,对应寄存器 0xcf-28=0xb3 ~ 0xcf + + unsigned tmp = 0xcf + level; unsafe {NAU88C22_REGWRITE(0x0034, (tmp<<8|tmp), i2c);} } @@ -428,6 +438,7 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli unsigned vol_up_press_ticks = 0; // 改动原因:mic mute红灯通过interface下发到tile1,仅在状态变化时发送,减少无意义跨tile调用。 unsigned last_mute_switch_for_led = 0xFFFFFFFF; + unsigned host_os = 0; tmr :> time; /* Input time */ time += TIMER_PERIOD; /* Add time */ se_tmr :> se_time; @@ -442,12 +453,60 @@ void AudioHwRemote2(streaming chanend c, client interface i2c_master_if i2c, cli firmware_upgrade_init(); #endif - if (c1_mode > 1) + if (c1_mode > 4) { c1_mode = 0; save_value(C1_MODE_INFO_PATH, c1_mode); } + + +#if defined(WIN_OS_DETECTION) + for(int i = 0; i < 500; i++) + { + GET_SHARED_GLOBAL(host_os, g_host_os); + if (host_os == OS_WIN) { + debug_printf("Detected Windows OS (OS_WIN) host_os: %d\n", host_os); + break; + } + delay_milliseconds(1); + } + + if (host_os == OS_WIN) { + debug_printf("Detected Windows OS (OS_WIN) c1_mode: %d\n", c1_mode); + unsigned flag = 1; + switch (c1_mode) + { + case 1: + flag = MODE_FPS_UAC2; + break; + case 3: + flag = MODE_BR_UAC2; + break; + case 4: + flag = MODE_V71_UAC2; + break; + } + SetRoleSwitchFlag(flag); +#ifndef DISABLE_REBOOT + device_reboot(); + while (1); +#endif + } + else + { + if (c1_mode == 5) + { + SetRoleSwitchFlag(MODE_V71_UAC1); +#ifndef DISABLE_REBOOT + device_reboot(); + while (1); +#endif + } + } +#endif + + // 改动原因:开机从 LittleFS 恢复 DAC 音量寄存器码;无效或未写过时用最大音量 C1_DAC_VOL_MAX,避免误用默认值或垃圾数据。 { unsigned char loaded_dac_vol = load_value(C1_DAC_VOL_INFO_PATH); diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/host_os_detect.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/host_os_detect.c new file mode 100644 index 0000000..a6f10d7 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/host_os_detect.c @@ -0,0 +1,102 @@ +#ifndef _HOST_OS_DETECT_H_ +#define _HOST_OS_DETECT_H_ + +#include "xua.h" +#include "xc_ptr.h" +#include "xassert.h" +#if XUA_USB_EN +#ifndef WINDOWS_OS_DESCRIPTOR_SUPPORT +#define WINDOWS_OS_DESCRIPTOR_SUPPORT +#endif +#define EP0_MAX_REQUEST_SIZE 2048 +#include "xud.h" +#include "vendorrequests.h" + +unsigned g_host_os = 0; // 1 -> Windows, 0 -> Others + + +int VendorAudioRequests(XUD_ep ep0_out, XUD_ep ep0_in, unsigned char bRequest, unsigned char cs, unsigned char cn, + unsigned short unitId, unsigned char direction, NULLABLE_RESOURCE(chanend, c_aud_ctl), + NULLABLE_RESOURCE(chanend, c_mix_ctl), + NULLABLE_RESOURCE(chanend, c_clk_ctL)) +{ + + return XUD_RES_ERR; +} +enum { OS_WIN = 1, OS_OTHERS = 2 }; +#if 1 +int VendorRequests(XUD_ep ep0_out, XUD_ep ep0_in, REFERENCE_PARAM(USB_SetupPacket_t, sp) VENDOR_REQUESTS_PARAMS_DEC_) +{ + XUD_Result_t result = XUD_RES_ERR; + + unsigned char request_data[EP0_MAX_REQUEST_SIZE]; + unsigned len; + int a = 0; + unsigned k = 5; +//SET_SHARED_GLOBAL(g_host_os, k); + switch ((sp->bmRequestType.Direction << 7) | (sp->bmRequestType.Type << 5) | (sp->bmRequestType.Recipient)) { + case USB_BMREQ_H2D_VENDOR_DEV: + result = XUD_GetBuffer(ep0_out, request_data, len); + if (result == XUD_RES_OKAY) { + if (a/*control_process_usb_set_request(sp.wIndex, sp.wValue, sp.wLength, request_data, i_control) == CONTROL_SUCCESS*/) { + /* zero length data to indicate success + * on control error, go to standard requests, which will issue STALL + */ + result = XUD_DoSetRequestStatus(ep0_in); + } else { + result = XUD_RES_ERR; + } + } + break; + + case USB_BMREQ_D2H_VENDOR_DEV: + /* application retrieval latency inside the control library call + * XUD task defers further calls by NAKing USB transactions + */ +// if (a/*control_process_usb_get_request(sp.wIndex, sp.wValue, sp.wLength, request_data, i_control) == CONTROL_SUCCESS*/) { +// len = sp->wLength; +// result = XUD_DoGetRequest(ep0_out, ep0_in, request_data, len, len); +// /* on control error, go to standard requests, which will issue STALL */ +// } +#ifdef WINDOWS_OS_DESCRIPTOR_SUPPORT +// else +if(sp->bRequest == 0x01) // GET_MS_DESCRIPTOR, same as the OS_STR_DESC last byte + { + // dwLength, 4bytes: 16 bytes + request_data[0] = 0x10; request_data[1] = 0x00; request_data[2] = 0x00; request_data[3] = 0x00; + // bcdVersion, 2bytes: For version 1.00, bcdVersion is set to 0x0100. + request_data[4] = 0x00; request_data[5] = 0x01; + // wIndex, 2bytes: 0x04 for extended compat ID descriptors + request_data[6] = 0x04; request_data[7] = 0x00; + // bCount, 1byte: 0 + request_data[8] = 0x00; + // RESERVED, 7bytes: all 0 + request_data[9] = 0x00; request_data[10] = 0x00; request_data[11] = 0x00; + request_data[12] = 0x00; request_data[13] = 0x00; request_data[14] = 0x00; request_data[15] = 0x00; + + result = XUD_DoGetRequest(ep0_out, ep0_in, request_data, 16, sp->wLength); +//xassert(busSpeed == XUD_SPEED_HS); + k = OS_WIN; + SET_SHARED_GLOBAL(g_host_os, k); + } + + else { +//xassert(busSpeed == XUD_SPEED_FS); + k = OS_OTHERS; + SET_SHARED_GLOBAL(g_host_os, k); + result = XUD_RES_ERR; + } +#endif + break; + } + return result; +} +#endif +void VendorRequests_Init(VENDOR_REQUESTS_PARAMS_DEC) +{ + +} + +#endif /* XUA_USB_EN */ + +#endif \ No newline at end of file