Compare commits
22 Commits
fosi_audio
...
synido_sy1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d54f2a01a | ||
|
|
a9327e8e38 | ||
|
|
c33b1a4b3d | ||
|
|
e28072657b | ||
|
|
ecba7b4863 | ||
|
|
d48858e4e9 | ||
|
|
f0daa4f62e | ||
|
|
bc3ba14a65 | ||
|
|
0e3d9ed7c5 | ||
|
|
344e04aa33 | ||
|
|
307aee89d9 | ||
|
|
716f60fabb | ||
|
|
8b39245372 | ||
|
|
4e31f7e0e0 | ||
|
|
1b0815a956 | ||
|
|
9eb6adc8d4 | ||
|
|
303bb6a244 | ||
|
|
50ae1a5550 | ||
|
|
f63a6e0653 | ||
|
|
b8f93ea5f5 | ||
|
|
9205b48882 | ||
|
|
f4faefc8e5 |
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
#ifndef FLASH_MAX_UPGRADE_SIZE
|
||||
//#define FLASH_MAX_UPGRADE_SIZE (512 * 1024)
|
||||
#define FLASH_MAX_UPGRADE_SIZE (2200 * 1024)
|
||||
#define FLASH_MAX_UPGRADE_SIZE (3000 * 1024)
|
||||
#endif
|
||||
|
||||
#define FLASH_ERROR() do {} while(0)
|
||||
|
||||
@@ -50,6 +50,7 @@ XUD_Result_t HidInterfaceClassRequests(
|
||||
#endif
|
||||
#if DEBUG_MEMORY_LOG_ENABLED
|
||||
unsigned log_switch;
|
||||
buffer[0] = 0x1;
|
||||
|
||||
GET_SHARED_GLOBAL(log_switch, g_log_switch);
|
||||
if (log_switch) {
|
||||
|
||||
@@ -37,8 +37,8 @@ endif()
|
||||
|
||||
# Firmware version (maps to BCD_DEVICE_J.M.N in USB descriptor)
|
||||
set(FW_VER_J 1)
|
||||
set(FW_VER_M 1)
|
||||
set(FW_VER_N 15)
|
||||
set(FW_VER_M 2)
|
||||
set(FW_VER_N 2)
|
||||
set(FW_VERSION "v${FW_VER_J}.${FW_VER_M}.${FW_VER_N}")
|
||||
|
||||
set(SW_USB_AUDIO_FLAGS ${EXTRA_BUILD_FLAGS} -Os
|
||||
@@ -129,7 +129,7 @@ set(APP_COMPILER_FLAGS_fact ${SW_USB_FACT_FLAGS} -DI2S_CHANS_DAC=2
|
||||
-DMIN_VOLUME=0xE000
|
||||
-DINPUT_VOLUME_CONTROL=0
|
||||
-DOUTPUT_VOLUME_CONTROL=0
|
||||
-DDEBUG_MEMORY_LOG_ENABLED=1
|
||||
#-DDEBUG_MEMORY_LOG_ENABLED=1
|
||||
-DHID_DFU_EN=1
|
||||
-DXUA_DFU_EN=1
|
||||
#-DIR_SWITCHING_MODE
|
||||
@@ -139,7 +139,7 @@ set(APP_COMPILER_FLAGS_fact ${SW_USB_FACT_FLAGS} -DI2S_CHANS_DAC=2
|
||||
|
||||
set(APP_COMPILER_FLAGS_f1_music_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||
-DI2S_CHANS_ADC=2
|
||||
-DMIN_FREQ=44100
|
||||
-DMIN_FREQ=192000
|
||||
-DMAX_FREQ=192000
|
||||
-DF1_MUSIC_UAC2=1
|
||||
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=24
|
||||
@@ -151,7 +151,8 @@ set(APP_COMPILER_FLAGS_f1_music_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC
|
||||
#-DUSE_EX3D
|
||||
-DMIXER=0
|
||||
-DUAC2_MODE=1
|
||||
#-ldnr_50ms
|
||||
-ldnr_50ms
|
||||
-DDNR_ENABLE=1
|
||||
#-llib_ex3d_all
|
||||
-DEQ_EN=1
|
||||
#-DEX3D_SF_NUM=3
|
||||
@@ -168,35 +169,35 @@ set(APP_COMPILER_FLAGS_f1_music_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC
|
||||
-DHID_CONTROLS=1)
|
||||
|
||||
|
||||
set(APP_COMPILER_FLAGS_f3_f4_fps_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||
-DI2S_CHANS_ADC=2
|
||||
-DMIN_FREQ=48000
|
||||
-DMAX_FREQ=48000
|
||||
-DUSE_EX3D=1
|
||||
-DF3_F4_FPS_UAC2=1
|
||||
-DMIXER=0
|
||||
-DUAC2_MODE=1
|
||||
-ldnr_50ms
|
||||
-llib_ex3d_all
|
||||
-DEQ_EN=1
|
||||
-DDNR_ENABLE=1
|
||||
-DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
|
||||
-DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
|
||||
-DINPUT_FORMAT_COUNT=1
|
||||
-DOUTPUT_FORMAT_COUNT=1
|
||||
-DEX3D_SF_NUM=3
|
||||
-DNUM_USB_CHAN_OUT=8
|
||||
-DNUM_USB_CHAN_IN=2
|
||||
-DNUM_EX3D_CHAN_OUT=2
|
||||
-DMIN_VOLUME=0xE000
|
||||
-DINPUT_VOLUME_CONTROL=1
|
||||
-DOUTPUT_VOLUME_CONTROL=1
|
||||
#-DDEBUG_MEMORY_LOG_ENABLED=1
|
||||
-DXUA_DFU_EN=1
|
||||
-DHID_DFU_EN=1
|
||||
-DIR_SWITCHING_MODE
|
||||
-DHID_CONTROLS=1)
|
||||
|
||||
#set(APP_COMPILER_FLAGS_f3_f4_fps_uac2 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||
# -DI2S_CHANS_ADC=2
|
||||
# -DMIN_FREQ=48000
|
||||
# -DMAX_FREQ=48000
|
||||
# -DUSE_EX3D=1
|
||||
# -DF3_F4_FPS_UAC2=1
|
||||
# -DMIXER=0
|
||||
# -DUAC2_MODE=1
|
||||
# -ldnr_50ms
|
||||
# -llib_ex3d_all
|
||||
# -DEQ_EN=1
|
||||
# -DDNR_ENABLE=1
|
||||
# -DSTREAM_FORMAT_OUTPUT_1_RESOLUTION_BITS=16
|
||||
# -DSTREAM_FORMAT_INPUT_1_RESOLUTION_BITS=16
|
||||
# -DINPUT_FORMAT_COUNT=1
|
||||
# -DOUTPUT_FORMAT_COUNT=1
|
||||
# -DEX3D_SF_NUM=3
|
||||
# -DNUM_USB_CHAN_OUT=8
|
||||
# -DNUM_USB_CHAN_IN=2
|
||||
# -DNUM_EX3D_CHAN_OUT=2
|
||||
# -DMIN_VOLUME=0xE000
|
||||
# -DINPUT_VOLUME_CONTROL=1
|
||||
# -DOUTPUT_VOLUME_CONTROL=1
|
||||
# #-DDEBUG_MEMORY_LOG_ENABLED=1
|
||||
# -DXUA_DFU_EN=1
|
||||
# -DHID_DFU_EN=1
|
||||
# -DIR_SWITCHING_MODE
|
||||
# -DHID_CONTROLS=1)
|
||||
#
|
||||
set(APP_COMPILER_FLAGS_f6_f7_fps_uac1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||
-DI2S_CHANS_ADC=2
|
||||
-DAUDIO_CLASS=1
|
||||
@@ -221,8 +222,8 @@ set(APP_COMPILER_FLAGS_f6_f7_fps_uac1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||
-DNUM_USB_CHAN_IN=2
|
||||
-DNUM_EX3D_CHAN_OUT=2
|
||||
-DMIN_VOLUME=0xE000
|
||||
-DINPUT_VOLUME_CONTROL=1
|
||||
-DOUTPUT_VOLUME_CONTROL=1
|
||||
-DINPUT_VOLUME_CONTROL=0
|
||||
-DOUTPUT_VOLUME_CONTROL=0
|
||||
#-DDEBUG_MEMORY_LOG_ENABLED=1
|
||||
-DXUA_DFU_EN=1
|
||||
-DHID_DFU_EN=1
|
||||
@@ -230,7 +231,7 @@ set(APP_COMPILER_FLAGS_f6_f7_fps_uac1 ${SW_USB_AUDIO_FLAGS} -DI2S_CHANS_DAC=2
|
||||
-DIR_SWITCHING_MODE
|
||||
-DHID_CONTROLS=1)
|
||||
|
||||
set(APP_INCLUDES src src/core src/extensions ../../lib_dnr/lib_dnr)
|
||||
set(APP_INCLUDES src src/core src/extensions src/extensions/ssrc ../../lib_dnr/lib_dnr)
|
||||
set(XMOS_SANDBOX_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
|
||||
|
||||
XMOS_REGISTER_APP()
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
xflash bin/fact/app_usb_aud_sy102_fact.xe --loader loader.o --upgrade 2 bin/f5_music_uac1/app_usb_aud_sy102_f5_music_uac1.xe --upgrade 3 bin/f1_music_uac2/app_usb_aud_sy102_f1_music_uac2.xe --upgrade 1 bin/f3_f4_fps_uac2/app_usb_aud_sy102_f3_f4_fps_uac2.xe --upgrade 4 bin/f6_f7_fps_uac1/app_usb_aud_sy102_f6_f7_fps_uac1.xe -o %1
|
||||
|
||||
rem --upgrade 4 bin/f6_f7_fps_uac1/app_usb_aud_sy102_f6_f7_fps_uac1.xe
|
||||
rem 改动原因:F3/F4 拆分——slot1=F3 Game,slot5=F4 AI7.1
|
||||
xflash bin/fact/app_usb_aud_sy102_fact.xe --loader loader.o --upgrade 2 bin/f5_music_uac1/app_usb_aud_sy102_f5_music_uac1.xe --upgrade 3 bin/f1_music_uac2/app_usb_aud_sy102_f1_music_uac2.xe --upgrade 1 ..\..\..\csl_sy102\sw_usb_audio\app_usb_aud_phaten_golden_6ch\bin/f3_fps_uac2/app_usb_aud_sy102_f3_fps_uac2.xe --upgrade 4 bin/f6_f7_fps_uac1/app_usb_aud_sy102_f6_f7_fps_uac1.xe --upgrade 5 ..\..\..\csl_sy102\sw_usb_audio\app_usb_aud_phaten_golden_6ch\bin/f4_fps_uac2/app_usb_aud_sy102_f4_fps_uac2.xe -o %1
|
||||
|
||||
@@ -1 +1 @@
|
||||
xflash --factory-version 15.3 --target-file src/core/synido.xn --upgrade 2 bin/f5_music_uac1/app_usb_aud_sy102_f5_music_uac1.xe --upgrade 3 bin/f1_music_uac2/app_usb_aud_sy102_f1_music_uac2.xe --upgrade 1 bin/f3_f4_fps_uac2/app_usb_aud_sy102_f3_f4_fps_uac2.xe --upgrade 4 bin/f6_f7_fps_uac1/app_usb_aud_sy102_f6_f7_fps_uac1.xe -o %1
|
||||
xflash --factory-version 15.3 --target-file src/core/synido.xn --upgrade 2 bin/f5_music_uac1/app_usb_aud_sy102_f5_music_uac1.xe --upgrade 3 ..\..\..\csl_sy102\sw_usb_audio\app_usb_aud_phaten_golden_6ch\bin/f1_music_uac2/app_usb_aud_sy102_f1_music_uac2.xe --upgrade 1 ..\..\..\csl_sy102\sw_usb_audio\app_usb_aud_phaten_golden_6ch\bin/f3_fps_uac2/app_usb_aud_sy102_f3_fps_uac2.xe --upgrade 4 ..\..\..\csl_sy102\sw_usb_audio\app_usb_aud_phaten_golden_6ch\bin/f6_f7_fps_uac1/app_usb_aud_sy102_f6_f7_fps_uac1.xe --upgrade 5 ..\..\..\csl_sy102\sw_usb_audio\app_usb_aud_phaten_golden_6ch\bin/f4_fps_uac2/app_usb_aud_sy102_f4_fps_uac2.xe -o %1
|
||||
|
||||
@@ -147,8 +147,8 @@
|
||||
#ifndef PID_AUDIO_2
|
||||
#if defined(F1_MUSIC_UAC2)
|
||||
#define PID_AUDIO_2 (0x2000) /* F1: Music, UAC2, Windows */
|
||||
#elif defined(F3_F4_FPS_UAC2)
|
||||
#define PID_AUDIO_2 (0x2001) /* F3/F4: FPS/AI7.1, UAC2, Windows */
|
||||
#elif defined(F3_FPS_UAC2) || defined(F4_FPS_UAC2)
|
||||
#define PID_AUDIO_2 (0x2001) /* F3 Game / F4 AI7.1, UAC2, Windows */
|
||||
#else
|
||||
#define PID_AUDIO_2 (0x2000)
|
||||
#endif
|
||||
@@ -167,7 +167,7 @@
|
||||
#if defined(F1_MUSIC_UAC2) || defined(F5_MUSIC_UAC1)
|
||||
#define PRODUCT_STR_A2 "SY102 Music"
|
||||
#define PRODUCT_STR_A1 "SY102 Music"
|
||||
#elif defined(F3_F4_FPS_UAC2) || defined(F6_F7_FPS_UAC1)
|
||||
#elif defined(F3_FPS_UAC2) || defined(F4_FPS_UAC2) || defined(F6_F7_FPS_UAC1)
|
||||
#define PRODUCT_STR_A2 "SY102 AI Game"
|
||||
#define PRODUCT_STR_A1 "SY102 AI Game"
|
||||
#else
|
||||
|
||||
@@ -213,11 +213,19 @@ unsigned g_led_blink_is_white = 0;
|
||||
#define LED_PURPLE (LED_RED & LED_BLUE)
|
||||
#define LED_WHITE (LED_RED & LED_GREEN & LED_BLUE)
|
||||
enum { OS_WIN = 1, OS_OTHERS = 2 };
|
||||
// 改动原因:定义模式切换标志值,用于在SPATIAL_GAME、STEREO_8K、STEREO_2K、UAC1之间循环切换
|
||||
#define MODE_F3_F4_FPS_UAC2 COAX_IN_FLAG //1 SPATIAL_GAME模式标志
|
||||
#define MODE_F5_MUSIC_UAC1 USB_IN_FLAG // 2 F5 MUSIC
|
||||
#define MODE_F1_MUSIC_UAC2 OPT_IN_FLAG // 3 F1 MUSIC
|
||||
#define MODE_F6_F7_FPS_UAC1 UAC1_IN_FLAG // 4 STEREO_2K模式标志
|
||||
// 改动原因:F3/F4拆分为独立固件——Game键切F3(COAX/slot1),AI7.1键切F4(BT/slot5)
|
||||
#define MODE_F3_FPS_UAC2 COAX_IN_FLAG // F3 Game (upgrade slot 1)
|
||||
#define MODE_F5_MUSIC_UAC1 USB_IN_FLAG // F5 Music UAC1 (upgrade slot 2)
|
||||
#define MODE_F1_MUSIC_UAC2 OPT_IN_FLAG // F1 Music UAC2 (upgrade slot 3)
|
||||
#define MODE_F6_F7_FPS_UAC1 UAC1_IN_FLAG // F6/F7 FPS UAC1 (upgrade slot 4)
|
||||
#define MODE_F4_FPS_UAC2 BT_IN_FLAG // F4 AI7.1 (upgrade slot 5)
|
||||
|
||||
// 改动原因:按 game_mode(2=Game/3=AI7.1) 选择 F3 或 F4 固件标志,供启动链与 HID 复用
|
||||
static unsigned get_fps_firmware_flag(unsigned mode)
|
||||
{
|
||||
if (mode == 3) return MODE_F4_FPS_UAC2;
|
||||
return MODE_F3_FPS_UAC2; // mode==2 或其它 FPS 模式默认 F3 Game
|
||||
}
|
||||
|
||||
/* All on tile[0] */
|
||||
port p_scl = PORT_I2C_SCL;
|
||||
@@ -382,7 +390,7 @@ void mic_volume(unsigned level)
|
||||
{
|
||||
// 改动原因:移除旧版37~38寄存器额外数字增益路径,最大限制到24dB(1~24,1dB/步)。
|
||||
debug_printf("mic_volume write reg=%d\n", level);
|
||||
unsafe {NAU88C22_REGWRITE(0x007E, (level << 8), (client interface i2c_master_if)i_i2c_client);}
|
||||
unsafe {NAU88C22_REGWRITE(0x007E, ((level + 4) << 8), (client interface i2c_master_if)i_i2c_client);}
|
||||
unsafe {NAU88C22_REGWRITE(0x0035, (0xcfcf), (client interface i2c_master_if)i_i2c_client);}
|
||||
}
|
||||
}
|
||||
@@ -535,8 +543,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
// active_mode: 0=off, 1=music (LED_MUSIC, no algorithm),
|
||||
// 2=game (LED_GAME_MODE, IR_GAME), 3=AI7.1 (LED_AI7_1, IR_7_1_GAME)
|
||||
unsigned active_mode = 0;
|
||||
// 脚步增强3档状态: 0=关(0dB), 1=中亮/6dB, 2=高亮/12dB;出厂默认开启(12dB)
|
||||
unsigned flag_footsteps_enhancement = 2;
|
||||
// 改动原因:脚步增强改为2档——0=关(0dB),1=开(15dB);出厂默认开启(15dB)
|
||||
unsigned flag_footsteps_enhancement = 1;
|
||||
// 出厂默认:AI降噪开启
|
||||
unsigned flag_aidenoise_onoff = 1;
|
||||
unsigned dnr_strength_saved = 100; // AI降噪重新开启时恢复的强度(0x85可更新)
|
||||
@@ -548,7 +556,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
unsigned push_button_game_mode_state_old = 1; // Active low
|
||||
unsigned push_button_footsteps_enhancement_state_old = 0; // Active low
|
||||
unsigned push_button_aidenoise_onoff_state_old = 1; // Active low
|
||||
unsigned char saved_footstep = 0;
|
||||
unsigned char saved_footstep = 15; // 改动原因:与出厂默认15dB一致,flash加载前临时初值
|
||||
|
||||
|
||||
|
||||
@@ -615,22 +623,26 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
debug_printf("Loaded game_mode from flash: %d\n", saved_mode);
|
||||
|
||||
#if USE_EX3D == 1
|
||||
// 加载脚步增强状态(保存值为expand_gain: 0/6/12)
|
||||
// 改动原因:加载脚步增强(2档 expand_gain: 0/15);旧固件6/12等非零值迁移为15
|
||||
{
|
||||
unsigned char footstep_path[] = "footstep";
|
||||
saved_footstep = load_value(footstep_path);
|
||||
debug_printf("Loaded footstep gain from flash: %d\n", saved_footstep);
|
||||
if (saved_footstep == 0) {
|
||||
flag_footsteps_enhancement = 0;
|
||||
} else if (saved_footstep <= 6) {
|
||||
} else if (saved_footstep == 15) {
|
||||
flag_footsteps_enhancement = 1;
|
||||
} else if (saved_footstep <= 20) {
|
||||
flag_footsteps_enhancement = 2;
|
||||
} else if (saved_footstep > 0 && saved_footstep <= 20) {
|
||||
// 旧3档(6/12)或其它历史非零增益:统一迁移为15dB开档
|
||||
saved_footstep = 15;
|
||||
flag_footsteps_enhancement = 1;
|
||||
save_value(footstep_path, (unsigned char)15);
|
||||
debug_printf("Migrated footstep gain to flash: %d\n", saved_footstep);
|
||||
} else {
|
||||
// 未初始化(255)或异常值:出厂默认脚步增强开启(12dB),写入flash
|
||||
saved_footstep = 12;
|
||||
flag_footsteps_enhancement = 2;
|
||||
save_value(footstep_path, (unsigned char)12);
|
||||
// 未初始化(255)或异常值:出厂默认脚步增强开启(15dB),写入flash
|
||||
saved_footstep = 15;
|
||||
flag_footsteps_enhancement = 1;
|
||||
save_value(footstep_path, (unsigned char)15);
|
||||
debug_printf("Saved footstep gain to flash: %d\n", saved_footstep);
|
||||
}
|
||||
debug_printf("Loaded footstep gain from flash: %d, state=%d\n", saved_footstep, flag_footsteps_enhancement);
|
||||
@@ -662,7 +674,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
|
||||
if (host_os == OS_WIN) {
|
||||
debug_printf("Detected Windows OS (OS_WIN) saved_mode: %d\n", saved_mode);
|
||||
unsigned flag = (saved_mode <= 1) ? MODE_F1_MUSIC_UAC2 : MODE_F3_F4_FPS_UAC2;
|
||||
// 改动原因:Windows 下 mode2→F3 Game,mode3→F4 AI7.1,不再共用 F3_F4 合并固件
|
||||
unsigned flag = (saved_mode <= 1) ? MODE_F1_MUSIC_UAC2 : get_fps_firmware_flag(saved_mode);
|
||||
SetRoleSwitchFlag(flag);
|
||||
#ifndef DISABLE_REBOOT
|
||||
device_reboot();
|
||||
@@ -972,13 +985,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
}
|
||||
}
|
||||
|
||||
// 恢复脚步增强LED初始状态
|
||||
// 改动原因:2档脚步增强——仅开档(15dB)点亮LED
|
||||
if (flag_footsteps_enhancement == 1) {
|
||||
led_on(&led_ctx, LED_FOOTSTEP_MODE);
|
||||
led_update_all(&led_ctx);
|
||||
} else if (flag_footsteps_enhancement == 2) {
|
||||
led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128);
|
||||
led_update_all(&led_ctx);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1024,7 +1034,7 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
{
|
||||
unsigned music_init, game_init;
|
||||
p_button_music_mode :> music_init;
|
||||
p_button_game_mode :> game_init;
|
||||
p_button_game_mode :> game_init;//
|
||||
if (music_init == 0 && game_init == 0) {
|
||||
fr_inhibit = 1;
|
||||
btn_combo_active = 1;
|
||||
@@ -1318,9 +1328,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
// Music btn: toggle LED locally (no reboot)
|
||||
// Game/AI7.1 btn: save mode + reboot (F5 will route to FPS firmware)
|
||||
//
|
||||
// FPS firmware (F3/F4, F6/F7): USE_EX3D set
|
||||
// FPS firmware (F3 Game / F4 AI7.1, F6/F7): USE_EX3D set
|
||||
// Music btn: save mode=1 + reboot (F5 will route to music firmware)
|
||||
// Game/AI7.1 btn: switch IR algorithm locally (no reboot)
|
||||
// F3: Game 本地切 mode2;AI7.1 需重启切 F4
|
||||
// F4: AI7.1 本地切 mode3;Game 需重启切 F3
|
||||
|
||||
unsigned mode_btn_change = 0;
|
||||
unsigned need_reboot = 0;
|
||||
@@ -1389,7 +1400,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
if (!btn_combo_active) {
|
||||
if (btn_music_hold_ticks == BTN_COMBO_DELAY_TICKS) {
|
||||
debug_printf("Music button pressed for %d ticks\n", BTN_COMBO_DELAY_TICKS);
|
||||
#if (F3_F4_FPS_UAC2 == 1)
|
||||
#if (F3_FPS_UAC2 == 1) || (F4_FPS_UAC2 == 1)
|
||||
// 改动原因:F3/F4 FPS 固件按 Music 键切回 F1 Music
|
||||
active_mode = 1;
|
||||
need_reboot = 1;
|
||||
SetRoleSwitchFlag(MODE_F1_MUSIC_UAC2);
|
||||
@@ -1422,9 +1434,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
if (btn_game_hold_ticks == BTN_COMBO_DELAY_TICKS) {
|
||||
debug_printf("Game button pressed for %d ticks\n", BTN_COMBO_DELAY_TICKS);
|
||||
#if F1_MUSIC_UAC2 == 1
|
||||
// 改动原因:Music 固件按 Game 键启动 F3 Game 固件
|
||||
active_mode = 2;
|
||||
need_reboot = 1;
|
||||
SetRoleSwitchFlag(MODE_F3_F4_FPS_UAC2);
|
||||
SetRoleSwitchFlag(MODE_F3_FPS_UAC2);
|
||||
#elif (F5_MUSIC_UAC1 == 1)
|
||||
// UAC1 Music firmware: game needs F6/F7, reboot if not already game
|
||||
if (active_mode != 2) {
|
||||
@@ -1438,11 +1451,17 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
active_mode = 2;
|
||||
mode_btn_change = 1;
|
||||
}
|
||||
#else
|
||||
#elif (F3_FPS_UAC2 == 1)
|
||||
// 改动原因:已在 F3 Game 固件,Game 键仅本地切 mode2
|
||||
if (active_mode != 2) {
|
||||
active_mode = 2;
|
||||
mode_btn_change = 1;
|
||||
}
|
||||
#elif (F4_FPS_UAC2 == 1)
|
||||
// 改动原因:F4 AI7.1 固件按 Game 键需重启加载 F3 Game 固件
|
||||
active_mode = 2;
|
||||
need_reboot = 1;
|
||||
SetRoleSwitchFlag(MODE_F3_FPS_UAC2);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1458,10 +1477,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
if (button_ai71_onoff == 0) {
|
||||
if (push_button_ai71_onoff_state_old == 1) {
|
||||
#if (F1_MUSIC_UAC2 == 1)
|
||||
// Music-only firmware: AI7.1 needs FPS firmware
|
||||
// 改动原因:Music 固件按 AI7.1 键启动 F4 AI7.1 固件
|
||||
active_mode = 3;
|
||||
need_reboot = 1;
|
||||
SetRoleSwitchFlag(MODE_F3_F4_FPS_UAC2);
|
||||
SetRoleSwitchFlag(MODE_F4_FPS_UAC2);
|
||||
#elif (F5_MUSIC_UAC1 == 1)
|
||||
// UAC1 Music firmware: AI71 needs F6/F7 FPS, reboot if not already AI71
|
||||
if (active_mode != 3) {
|
||||
@@ -1475,12 +1494,17 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
active_mode = 3;
|
||||
mode_btn_change = 1;
|
||||
}
|
||||
#else
|
||||
// FPS firmware: switch algorithm locally (activate if not already)
|
||||
#elif (F4_FPS_UAC2 == 1)
|
||||
// 改动原因:已在 F4 AI7.1 固件,AI7.1 键仅本地切 mode3
|
||||
if (active_mode != 3) {
|
||||
active_mode = 3;
|
||||
mode_btn_change = 1;
|
||||
}
|
||||
#elif (F3_FPS_UAC2 == 1)
|
||||
// 改动原因:F3 Game 固件按 AI7.1 键需重启加载 F4 AI7.1 固件
|
||||
active_mode = 3;
|
||||
need_reboot = 1;
|
||||
SetRoleSwitchFlag(MODE_F4_FPS_UAC2);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1493,20 +1517,40 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
if (hid_req_mode != (unsigned)-1) {
|
||||
SET_SHARED_GLOBAL(g_request_game_mode, (unsigned)-1);
|
||||
unsigned target = (hid_req_mode <= 3) ? hid_req_mode : 0;
|
||||
#if (F3_F4_FPS_UAC2 == 1)
|
||||
#if (F3_FPS_UAC2 == 1) || (F4_FPS_UAC2 == 1)
|
||||
// 改动原因:HID 0xA4 在 F3/F4 间切换需跨固件重启,同固件则本地切算法
|
||||
if (target == 1) {
|
||||
active_mode = target;
|
||||
need_reboot = 1;
|
||||
SetRoleSwitchFlag(MODE_F1_MUSIC_UAC2);
|
||||
} else {
|
||||
active_mode = target;
|
||||
mode_btn_change = 1;
|
||||
} else if (target == 2) {
|
||||
#if (F3_FPS_UAC2 == 1)
|
||||
if (active_mode != 2) {
|
||||
active_mode = 2;
|
||||
mode_btn_change = 1;
|
||||
}
|
||||
#else
|
||||
active_mode = 2;
|
||||
need_reboot = 1;
|
||||
SetRoleSwitchFlag(MODE_F3_FPS_UAC2);
|
||||
#endif
|
||||
} else if (target == 3) {
|
||||
#if (F4_FPS_UAC2 == 1)
|
||||
if (active_mode != 3) {
|
||||
active_mode = 3;
|
||||
mode_btn_change = 1;
|
||||
}
|
||||
#else
|
||||
active_mode = 3;
|
||||
need_reboot = 1;
|
||||
SetRoleSwitchFlag(MODE_F4_FPS_UAC2);
|
||||
#endif
|
||||
}
|
||||
#elif (F1_MUSIC_UAC2 == 1)
|
||||
if (target >= 2) {
|
||||
active_mode = target;
|
||||
need_reboot = 1;
|
||||
SetRoleSwitchFlag(MODE_F3_F4_FPS_UAC2);
|
||||
SetRoleSwitchFlag(get_fps_firmware_flag(target));
|
||||
} else {
|
||||
active_mode = target;
|
||||
mode_btn_change = 1;
|
||||
@@ -1600,8 +1644,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
case 3: led_on(&led_ctx, LED_AI7_1); break;
|
||||
default: break;
|
||||
}
|
||||
// 改动原因:2档脚步增强,开档(15dB)恢复全亮LED
|
||||
if (flag_footsteps_enhancement == 1) led_on(&led_ctx, LED_FOOTSTEP_MODE);
|
||||
else if (flag_footsteps_enhancement == 2) led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128);
|
||||
if (flag_aidenoise_onoff) led_on(&led_ctx, LED_ANC);
|
||||
led_update_all(&led_ctx);
|
||||
// 等待松键,防止重启后再次触发出厂恢复循环
|
||||
@@ -1615,8 +1659,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
delay_milliseconds(100);
|
||||
}
|
||||
#endif
|
||||
// 出厂恢复默认AI7.1模式(mode=3),需要F3/F4固件
|
||||
SetRoleSwitchFlag(MODE_F3_F4_FPS_UAC2);
|
||||
// 改动原因:出厂默认 AI7.1(mode=3),启动 F4 AI7.1 固件
|
||||
SetRoleSwitchFlag(MODE_F4_FPS_UAC2);
|
||||
delay_milliseconds(20);
|
||||
#ifndef DISABLE_REBOOT
|
||||
device_reboot();
|
||||
@@ -1650,10 +1694,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
{
|
||||
if(push_button_footsteps_enhancement_state_old == 1)
|
||||
{
|
||||
// 3档循环: 0(关/0dB) → 1(中亮/6dB) → 2(高亮/12dB) → 0
|
||||
flag_footsteps_enhancement = (flag_footsteps_enhancement + 1) % 3;
|
||||
// 改动原因:2档循环: 0(关/0dB) ↔ 1(开/15dB)
|
||||
flag_footsteps_enhancement = (flag_footsteps_enhancement + 1) % 2;
|
||||
mode_change = 1;
|
||||
debug_printf("Footstep mode changed: %d -> %d\n", flag_footsteps_enhancement, flag_footsteps_enhancement + 1);
|
||||
debug_printf("Footstep mode changed to state=%d\n", flag_footsteps_enhancement);
|
||||
}
|
||||
}
|
||||
push_button_footsteps_enhancement_state_old = button_footsteps_enhancement;
|
||||
@@ -1661,18 +1705,13 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
{
|
||||
if(flag_footsteps_enhancement == 0)
|
||||
{
|
||||
saved_footstep = 0;
|
||||
saved_footstep = 0; // 改动原因:关档 0dB
|
||||
led_off(&led_ctx, LED_FOOTSTEP_MODE);
|
||||
}
|
||||
else if(flag_footsteps_enhancement == 1)
|
||||
{
|
||||
saved_footstep = 6;
|
||||
led_on(&led_ctx, LED_FOOTSTEP_MODE);
|
||||
}
|
||||
else
|
||||
{
|
||||
saved_footstep = 12;
|
||||
led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128);
|
||||
saved_footstep = 15; // 改动原因:开档 15dB(唯一增强档)
|
||||
led_on(&led_ctx, LED_FOOTSTEP_MODE);
|
||||
}
|
||||
led_update_all(&led_ctx);
|
||||
// 发送expand_gain到tile1执行
|
||||
@@ -1690,30 +1729,29 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
GET_SHARED_GLOBAL(hid_gain_req, g_hid_expand_gain_request);
|
||||
if (hid_gain_req != (unsigned)-1) {
|
||||
SET_SHARED_GLOBAL(g_hid_expand_gain_request, (unsigned)-1);
|
||||
// 将增益值映射到footstep档位
|
||||
// 改动原因:HID增益映射到2档——0=关,非0=开(15dB)
|
||||
unsigned new_state;
|
||||
unsigned char gain_to_save;
|
||||
if (hid_gain_req == 0) {
|
||||
new_state = 0;
|
||||
} else if (hid_gain_req <= 6) {
|
||||
new_state = 1;
|
||||
gain_to_save = 0;
|
||||
} else {
|
||||
new_state = 2;
|
||||
new_state = 1;
|
||||
gain_to_save = 15;
|
||||
}
|
||||
if (new_state != (unsigned)flag_footsteps_enhancement) {
|
||||
flag_footsteps_enhancement = (int)new_state;
|
||||
if (flag_footsteps_enhancement == 0) {
|
||||
led_off(&led_ctx, LED_FOOTSTEP_MODE);
|
||||
} else if (flag_footsteps_enhancement == 1) {
|
||||
led_on(&led_ctx, LED_FOOTSTEP_MODE);
|
||||
} else {
|
||||
led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128);
|
||||
led_on(&led_ctx, LED_FOOTSTEP_MODE);
|
||||
}
|
||||
led_update_all(&led_ctx);
|
||||
}
|
||||
|
||||
unsigned char fp[] = "footstep";
|
||||
save_value(fp, (unsigned char)hid_gain_req);
|
||||
saved_footstep = hid_gain_req;
|
||||
save_value(fp, gain_to_save);
|
||||
saved_footstep = gain_to_save;
|
||||
debug_printf("HID set footstep gain=%d, state=%d\n", hid_gain_req, flag_footsteps_enhancement);
|
||||
}
|
||||
}
|
||||
@@ -2431,7 +2469,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol,
|
||||
#if UAC1_MODE == 1
|
||||
GET_SHARED_GLOBAL(host_os, g_host_os);
|
||||
if (host_os == OS_WIN) {
|
||||
unsigned flag = (saved_mode <= 1) ? MODE_F1_MUSIC_UAC2 : MODE_F3_F4_FPS_UAC2;
|
||||
// 改动原因:运行时 OS 检测为 Windows 时按 mode 路由 F1/F3/F4
|
||||
unsigned flag = (saved_mode <= 1) ? MODE_F1_MUSIC_UAC2 : get_fps_firmware_flag(saved_mode);
|
||||
SetRoleSwitchFlag(flag);
|
||||
#ifndef DISABLE_REBOOT
|
||||
device_reboot();
|
||||
|
||||
@@ -9,25 +9,38 @@
|
||||
#include <xs1.h>
|
||||
#include <xcore/chanend.h>
|
||||
#include <xcore/channel.h>
|
||||
#include <xcore/channel_streaming.h>
|
||||
#include "xc_ptr.h"
|
||||
|
||||
#include "xua_conf.h"
|
||||
|
||||
#include "share_buffer.h"
|
||||
|
||||
extern uint32_t init_eq_data(unsigned sample_freq);
|
||||
|
||||
#if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1
|
||||
/* 改动原因:3 streaming chan + 1 普通 chan 传 us 192kHz(跨 tile 静态内存不共享) */
|
||||
uint32_t uc_ssrc_ds_in; /* tile[0]→tile[1] 192kHz mic */
|
||||
uint32_t uc_ssrc_ds_out; /* tile[1]→tile[0] 48kHz 降采样结果 */
|
||||
uint32_t uc_ssrc_us_in; /* tile[0]→tile[1] 48kHz DNR 后 */
|
||||
uint32_t uc_ssrc_us_out; /* tile[1]→tile[0] 192kHz 升采样结果(普通chan) */
|
||||
#endif
|
||||
|
||||
void dnr_exchange_buffer(int32_t *data);
|
||||
|
||||
// sample_freq 作为首字发送给 tile[0] 的 dsp_main,用于采样率变化检测和 EQ 初始化
|
||||
void buffer_exchange(chanend_t c_data, unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], unsigned sample_freq) {
|
||||
chan_out_word(c_data, sample_freq);
|
||||
chan_out_buf_word (c_data, sampsFromUsbToAudio, 2);
|
||||
chan_in_buf_word (c_data , sampsFromUsbToAudio, 2);
|
||||
#if DNR_ENABLE == 1
|
||||
chan_out_buf_word (c_data, sampsFromAudioToUsb, 2);
|
||||
chan_in_buf_word (c_data , sampsFromAudioToUsb, 2);
|
||||
#endif
|
||||
unsigned data_in[4] = {0,0,0,0};
|
||||
unsigned data_out[4] = {0,0,0,0};
|
||||
data_in[0] = sampsFromUsbToAudio[0];
|
||||
data_in[1] = sampsFromUsbToAudio[1];
|
||||
data_in[2] = sampsFromAudioToUsb[0];
|
||||
data_in[3] = sampsFromAudioToUsb[1];
|
||||
chan_out_buf_word (c_data, data_in, 4);
|
||||
chan_in_buf_word (c_data , data_out, 4);
|
||||
sampsFromUsbToAudio[0] = data_out[0];
|
||||
sampsFromUsbToAudio[1] = data_out[1];
|
||||
sampsFromAudioToUsb[0] = data_out[2];
|
||||
sampsFromAudioToUsb[1] = data_out[3];
|
||||
}
|
||||
|
||||
|
||||
@@ -38,40 +51,111 @@ void dsp_main (chanend_t c_data) {
|
||||
int mic_output[I2S_CHANS_ADC];
|
||||
int count = 0;
|
||||
unsigned ch[1] = {2};
|
||||
unsigned data_in[4] = {0,0,0,0};
|
||||
unsigned data_out[4] = {0,0,0,0};
|
||||
#if F1_MUSIC_UAC2 == 1
|
||||
unsigned current_sample_freq = 0;
|
||||
unsigned current_sample_freq = 192000;
|
||||
#else
|
||||
unsigned current_sample_freq = 48000;
|
||||
#endif
|
||||
while (1) {
|
||||
unsigned sample_freq = (unsigned)chan_in_word(c_data);
|
||||
chan_in_buf_word (c_data , play_input, 2);
|
||||
|
||||
// 采样率变化:重新初始化 EQ 系数并清空 ring buffer,避免残留状态污染
|
||||
if (sample_freq != current_sample_freq && sample_freq != 0) {
|
||||
current_sample_freq = sample_freq;
|
||||
init_eq_data(sample_freq);
|
||||
clear_ring_buffer(0);
|
||||
clear_ring_buffer(1);
|
||||
clear_ring_buffer(2);
|
||||
clear_ring_buffer(3);
|
||||
play_output[0] = 0;
|
||||
play_output[1] = 0;
|
||||
#if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1
|
||||
static int mic_48k[2] = {0, 0};
|
||||
static int us_cache[4][2] = {{0}};
|
||||
static int us_cache_idx = 4; /* 4=无有效缓存输出静音;0-3=当前消费 pair 索引 */
|
||||
static int ds_tick = 0; /* 每拍+1,满4拍处理一次 48kHz */
|
||||
/* 改动原因:第一个 tick4 时 us_out 还没有数据,不能阻塞读;
|
||||
* 之后每个 tick4 先读上一批(已就绪)再触发下一批,规避同拍等待 us_stereo 计算延迟 */
|
||||
static int us_first_batch = 1;
|
||||
#endif
|
||||
|
||||
init_eq_data(current_sample_freq);
|
||||
clear_ring_buffer(0);
|
||||
clear_ring_buffer(1);
|
||||
clear_ring_buffer(2);
|
||||
clear_ring_buffer(3);
|
||||
#if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1
|
||||
/* 改动原因:采样率变化时复位所有 SSRC 状态,下一批重新从头开始 */
|
||||
ds_tick = 0;
|
||||
us_cache_idx = 4;
|
||||
us_first_batch = 1;
|
||||
#endif
|
||||
|
||||
while (1) {
|
||||
chan_in_buf_word(c_data, data_in, 4);
|
||||
chan_out_buf_word(c_data, data_out, 4);
|
||||
|
||||
#if EQ_ENABLE == 1
|
||||
write_to_ring_buffer(0, data_in[0]);
|
||||
write_to_ring_buffer(1, data_in[1]);
|
||||
data_out[0] = read_from_ring_buffer(2);
|
||||
data_out[1] = read_from_ring_buffer(3);
|
||||
// data_out[0] = data_in[0];
|
||||
// data_out[1] = data_in[1];
|
||||
#else
|
||||
data_out[0] = data_in[0];
|
||||
data_out[1] = data_in[1];
|
||||
#endif
|
||||
|
||||
#if DNR_ENABLE == 1
|
||||
#if F1_MUSIC_UAC2 == 1
|
||||
/* F1: 192kHz→48kHz(DS)→DNR→48kHz→192kHz(US)
|
||||
*
|
||||
* 时序优化说明:
|
||||
* 原设计在 tick4 同一拍内"发 us_in → 等 us_stereo 计算 → 读8个 us_out",
|
||||
* us_stereo 在 tile[1] 独立线程运算需 2-5µs,导致 tick4 总延迟超过 5.2µs
|
||||
* (192kHz 单拍周期),buffer_exchange 响应超时引发噪音。
|
||||
*
|
||||
* 当前设计:每个 tick4 先读上一批已就绪的 8 个 us_out 字(us_rec_output_core
|
||||
* 在前 3 拍期间已完成并阻塞等待消费,读取近乎零延迟),再触发本批 ds→DNR→us_in。
|
||||
* 代价:录音延迟增加约 20.8µs(一个 48kHz 周期),人耳不可感知。
|
||||
*/
|
||||
s_chan_out_word((chanend_t)uc_ssrc_ds_in, (uint32_t)data_in[2]);
|
||||
s_chan_out_word((chanend_t)uc_ssrc_ds_in, (uint32_t)data_in[3]);
|
||||
ds_tick++;
|
||||
|
||||
if (ds_tick >= 4) {
|
||||
ds_tick = 0;
|
||||
|
||||
if (!us_first_batch) {
|
||||
/* 读上一批 us_stereo 已生产的 4 对 192kHz(近乎无延迟)*/
|
||||
us_cache[0][0] = (int)chan_in_word((chanend_t)uc_ssrc_us_out);
|
||||
us_cache[0][1] = (int)chan_in_word((chanend_t)uc_ssrc_us_out);
|
||||
us_cache[1][0] = (int)chan_in_word((chanend_t)uc_ssrc_us_out);
|
||||
us_cache[1][1] = (int)chan_in_word((chanend_t)uc_ssrc_us_out);
|
||||
us_cache[2][0] = (int)chan_in_word((chanend_t)uc_ssrc_us_out);
|
||||
us_cache[2][1] = (int)chan_in_word((chanend_t)uc_ssrc_us_out);
|
||||
us_cache[3][0] = (int)chan_in_word((chanend_t)uc_ssrc_us_out);
|
||||
us_cache[3][1] = (int)chan_in_word((chanend_t)uc_ssrc_us_out);
|
||||
us_cache_idx = 0;
|
||||
}
|
||||
|
||||
/* 处理当前批:ds→DNR→us_in,结果在下一个 tick4 读取 */
|
||||
mic_48k[0] = (int)s_chan_in_word((chanend_t)uc_ssrc_ds_out);
|
||||
mic_48k[1] = (int)s_chan_in_word((chanend_t)uc_ssrc_ds_out);
|
||||
dnr_exchange_buffer(mic_48k);
|
||||
s_chan_out_word((chanend_t)uc_ssrc_us_in, (uint32_t)mic_48k[0]);
|
||||
s_chan_out_word((chanend_t)uc_ssrc_us_in, (uint32_t)mic_48k[1]);
|
||||
|
||||
us_first_batch = 0;
|
||||
}
|
||||
|
||||
chan_out_buf_word (c_data , play_output, I2S_CHANS_DAC);
|
||||
#if DNR_ENABLE == 1
|
||||
chan_in_buf_word (c_data , mic_input, 2) ;
|
||||
chan_out_buf_word (c_data , mic_output, I2S_CHANS_ADC);
|
||||
#endif
|
||||
write_to_ring_buffer(0, play_input[0]);
|
||||
write_to_ring_buffer(1, play_input[1]);
|
||||
play_output[0] = read_from_ring_buffer(2);
|
||||
play_output[1] = read_from_ring_buffer(3);
|
||||
#if DNR_ENABLE == 1
|
||||
dnr_exchange_buffer(mic_input);
|
||||
mic_output[0] = mic_input[0];
|
||||
mic_output[1] = mic_input[1];
|
||||
if (us_cache_idx < 4) {
|
||||
data_out[2] = us_cache[us_cache_idx][0];
|
||||
data_out[3] = us_cache[us_cache_idx][1];
|
||||
us_cache_idx++;
|
||||
} else {
|
||||
data_out[2] = 0;
|
||||
data_out[3] = 0;
|
||||
}
|
||||
#else
|
||||
dnr_exchange_buffer((int32_t *)&data_in[2]);
|
||||
data_out[2] = data_in[2];
|
||||
data_out[3] = data_in[3];
|
||||
#endif
|
||||
#else
|
||||
data_out[2] = data_in[2];
|
||||
data_out[3] = data_in[3];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,15 +8,12 @@
|
||||
#include <xclib.h>
|
||||
#include <stdio.h>
|
||||
#include "debug_print.h"
|
||||
#include "dfu_upgrade.h"
|
||||
|
||||
#include "xua.h"
|
||||
|
||||
#if HID_DFU_EN
|
||||
|
||||
#ifndef DFU_FLASH_MAX_UPGRADE_SIZE
|
||||
#define DFU_FLASH_MAX_UPGRADE_SIZE (2200 * 1024)
|
||||
#endif
|
||||
|
||||
#define DFU_FLASH_ERROR()
|
||||
|
||||
static int dfu_flash_device_open = 0;
|
||||
|
||||
@@ -95,7 +95,7 @@ unsigned char handle_firmware_upgrade_start(uint8_t data[], uint16_t len)
|
||||
|
||||
debug_printf("g_first_page_write_executed: %d\n", g_first_page_write_executed);
|
||||
|
||||
if (firmware_size == 0 || firmware_size > FLASH_MAX_UPGRADE_SIZE) {
|
||||
if (firmware_size == 0 || firmware_size > DFU_FLASH_MAX_UPGRADE_SIZE) {
|
||||
debug_printf("Firmware upgrade error: invalid size %lu\n", firmware_size);
|
||||
response[0] = STATUS_SIZE_INVALID;
|
||||
send_firmware_upgrade_response(FIRMWARE_UPGRADE_START, response, 1);
|
||||
|
||||
@@ -44,7 +44,11 @@ typedef enum {
|
||||
// 数据包格式:同步头(1) + 命令码(1) + 块序号(2) + 数据长度(1) + 数据(N) + Checksum(1)
|
||||
// 所以最大数据长度 = 63 - 5(头部) - 1(Checksum) = 57字节
|
||||
#define MAX_DATA_BLOCK_SIZE 57 // 最大数据块大小(63字节HID数据包 - 5字节头部 - 1字节Checksum)
|
||||
#define FLASH_MAX_UPGRADE_SIZE (2000 * 1024) // 最大固件大小1400KB
|
||||
|
||||
#ifndef DFU_FLASH_MAX_UPGRADE_SIZE
|
||||
#define DFU_FLASH_MAX_UPGRADE_SIZE (3000 * 1024)
|
||||
#endif
|
||||
|
||||
|
||||
// 页缓冲区结构
|
||||
typedef struct {
|
||||
|
||||
@@ -53,7 +53,7 @@ static volatile int g_runtime_angle_written = 0;
|
||||
// 通过该标志判断EX3D是否已完成初始化,若已完成则在收到0xF9时立即应用角度。
|
||||
static volatile int g_ex3d_init_done = 0;
|
||||
// audio_ex3d_init会覆盖Ex3dExpandGain为库默认值;用此变量保存0xFD boot sync收到的值
|
||||
static volatile int32_t g_boot_footstep_expand_gain_value = 12;
|
||||
static volatile int32_t g_boot_footstep_expand_gain_value = 15; // 改动原因:脚步增强默认15dB(2档:0/15)
|
||||
static volatile int32_t g_boot_lmt_threshold_value = -5;
|
||||
static volatile uint32_t g_boot_angle_values[8] = {315, 45, 0, 0, 225, 135, 270, 90};
|
||||
|
||||
@@ -299,6 +299,7 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi
|
||||
#elif DNR_ENABLE == 1
|
||||
buffer_exchange(uc_eq_data, sampsFromUsbToAudio, sampsFromAudioToUsb, ubm_sample_freq);
|
||||
#endif
|
||||
|
||||
GET_SHARED_GLOBAL(is_monitor, g_monitor_switch_t1);
|
||||
if (is_monitor) {
|
||||
sampsFromUsbToAudio[0] += (unsigned)((((int)sampsFromAudioToUsb[0]) >> 1));
|
||||
@@ -1175,7 +1176,8 @@ void ex3d_task(){
|
||||
}
|
||||
|
||||
// audio_ex3d_init内部会将Ex3dExpandGain重置为库默认值(6),这里始终用保存值恢复
|
||||
Ex3dExpandGain = g_boot_footstep_expand_gain_loaded ? g_boot_footstep_expand_gain_value : 12;
|
||||
// 改动原因:无flash/boot同步时脚步增强默认15dB(原12dB为旧3档高亮档)
|
||||
Ex3dExpandGain = g_boot_footstep_expand_gain_loaded ? g_boot_footstep_expand_gain_value : 15;
|
||||
Ex3dLimiterThreshold = g_boot_lmt_threshold_loaded ? g_boot_lmt_threshold_value : -15;
|
||||
|
||||
EX3DAudio_SetOnGain(Ex3dOnGain);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#if DEBUG_MEMORY_LOG_ENABLED
|
||||
#define DEBUG_PRINT_ENABLE 1
|
||||
#define DEBUG_PRINT_ENABLE 0
|
||||
#else
|
||||
#define DEBUG_PRINT_ENABLE 0
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,7 @@ swlock_t flash_lock = SWLOCK_INITIAL_VALUE;
|
||||
static rtos_qspi_flash_t qspi_flash_ctx_s;
|
||||
#define FLASH_CLKBLK XS1_CLKBLK_3
|
||||
#ifndef FS_BASE_ADDR
|
||||
#define FS_BASE_ADDR (2500 * 1024)
|
||||
#define FS_BASE_ADDR (3500 * 1024)
|
||||
#endif
|
||||
#define SECTOR_SIZE 4096
|
||||
rtos_qspi_flash_t *qspi_flash_ctx = &qspi_flash_ctx_s;
|
||||
|
||||
@@ -2,6 +2,16 @@
|
||||
// This Software is subject to the terms of the XMOS Public Licence: Version 1.
|
||||
|
||||
#include "xua.h" /* Device specific defines */
|
||||
|
||||
#if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1
|
||||
#include "ssrc_rec_core.h"
|
||||
/* 改动原因:3 streaming + 1 普通 chan;us 192kHz 走普通 chan(跨 tile 内存不共享) */
|
||||
extern uint32_t uc_ssrc_ds_in;
|
||||
extern uint32_t uc_ssrc_ds_out;
|
||||
extern uint32_t uc_ssrc_us_in;
|
||||
extern uint32_t uc_ssrc_us_out;
|
||||
#endif
|
||||
|
||||
#ifdef EXCLUDE_USB_AUDIO_MAIN
|
||||
|
||||
/**
|
||||
@@ -540,6 +550,14 @@ int main()
|
||||
|
||||
USER_MAIN_DECLARATIONS
|
||||
|
||||
#if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1
|
||||
/* 改动原因:streaming chan 有 tile 配额上限;us 192kHz 用普通 chan 传 8 word/块 */
|
||||
streaming chan c_ssrc_ds_in;
|
||||
streaming chan c_ssrc_ds_out;
|
||||
streaming chan c_ssrc_us_in;
|
||||
chan c_ssrc_us_out;
|
||||
#endif
|
||||
|
||||
chan c_dsp_to_ex3d[DSP_WORKER_COUNT];
|
||||
chan cc_mic_level;
|
||||
chan c_audiohw;
|
||||
@@ -582,6 +600,11 @@ int main()
|
||||
}
|
||||
}
|
||||
on tile[1]: mute_handler(c_mic_det);
|
||||
#if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1
|
||||
on tile[1] : ds_rec_core(c_ssrc_ds_in, c_ssrc_ds_out);
|
||||
on tile[1] : us_rec_core(c_ssrc_us_in);
|
||||
on tile[1] : us_rec_output_core(c_ssrc_us_out);
|
||||
#endif
|
||||
|
||||
on tile[0] : {
|
||||
par {
|
||||
@@ -611,7 +634,17 @@ int main()
|
||||
dsp_core0();
|
||||
}
|
||||
}
|
||||
on tile[0] : { dsp_main(c_eq_data); }
|
||||
on tile[0] : {
|
||||
#if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1
|
||||
unsafe {
|
||||
uc_ssrc_ds_in = (uint32_t)(unsigned)(streaming chanend)c_ssrc_ds_in;
|
||||
uc_ssrc_ds_out = (uint32_t)(unsigned)(streaming chanend)c_ssrc_ds_out;
|
||||
uc_ssrc_us_in = (uint32_t)(unsigned)(streaming chanend)c_ssrc_us_in;
|
||||
uc_ssrc_us_out = (uint32_t)(unsigned)(chanend)c_ssrc_us_out;
|
||||
}
|
||||
#endif
|
||||
dsp_main(c_eq_data);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if DNR_ENABLE == 1
|
||||
|
||||
@@ -0,0 +1,187 @@
|
||||
#define FUNCTION_NAME ds_stereo
|
||||
|
||||
/*
|
||||
void ds_stereo(
|
||||
int32_t final_shr,
|
||||
int32_t * coefs,
|
||||
int32_t * data,
|
||||
chanend_t c_in,
|
||||
chanend_t c_out,
|
||||
int32_t num_phase);
|
||||
*/
|
||||
|
||||
#define NSTACKWORDS 32
|
||||
|
||||
#define S_LEFT 0
|
||||
#define S_RIGHT 1
|
||||
#define S_LOOP_COUNT 2
|
||||
#define S_COEF_BASE_POINTER 3
|
||||
|
||||
.cc_top FUNCTION_NAME.function
|
||||
.type FUNCTION_NAME,@function
|
||||
|
||||
.issue_mode dual
|
||||
.align 4
|
||||
#define ONE 0x40000000
|
||||
zeros:
|
||||
.word 0, 0, 0, 0, 0, 0, 0, 0
|
||||
left_chan:
|
||||
.word 0, 0, 0, 0, ONE, ONE, ONE, ONE
|
||||
right_chan:
|
||||
.word ONE, ONE, ONE, ONE, 0, 0, 0, 0
|
||||
.align 16
|
||||
.globl FUNCTION_NAME
|
||||
.globl FUNCTION_NAME.nstackwords
|
||||
.set FUNCTION_NAME.nstackwords, 32
|
||||
FUNCTION_NAME:
|
||||
{ dualentsp NSTACKWORDS;}
|
||||
|
||||
stw r4, sp[20]
|
||||
stw r5, sp[21]
|
||||
stw r6, sp[22]
|
||||
stw r7, sp[23]
|
||||
stw r8, sp[24]
|
||||
stw r9, sp[25]
|
||||
stw r10, sp[26]
|
||||
|
||||
ldw r4, sp[NSTACKWORDS+1]
|
||||
stw r4, sp[27]
|
||||
|
||||
|
||||
//{mov r0, r0; mov r1, r1}
|
||||
//{mov r2, r2; mov r3, r3}
|
||||
|
||||
#define CHANNELS 2
|
||||
#define MACCRS_PER_PHASE 4
|
||||
#define BYTES_PER_WORD 4
|
||||
#define WORDS_PER_VECTOR 8
|
||||
#define BYTES_PER_VECTOR (WORDS_PER_VECTOR*BYTES_PER_WORD)
|
||||
|
||||
ldc r10, (BYTES_PER_VECTOR+BYTES_PER_WORD)
|
||||
ldc r9, BYTES_PER_VECTOR
|
||||
ldc r8, (2*MACCRS_PER_PHASE-1)*BYTES_PER_VECTOR - 4 + (BYTES_PER_VECTOR+BYTES_PER_WORD) + 4
|
||||
ldc r7, MACCRS_PER_PHASE*BYTES_PER_VECTOR
|
||||
ldc r6, ((1<<(BYTES_PER_WORD*CHANNELS))-1)
|
||||
|
||||
//load number of phases - 1 to r11
|
||||
ldw r11, sp[NSTACKWORDS+2]
|
||||
sub r11, r11, 1
|
||||
// jump to passthrough loop if num of phases is 1
|
||||
bf r11, passthrough_loop
|
||||
std r1, r11, sp[1]
|
||||
//store the final_shr for the VLSAT
|
||||
std r0, r0, sp[2]
|
||||
std r0, r0, sp[3]
|
||||
std r0, r0, sp[4]
|
||||
std r0, r0, sp[5]
|
||||
|
||||
|
||||
ldc r11, (MACCRS_PER_PHASE-1)*BYTES_PER_VECTOR - 4 + 4 //the final +4 is for the padding at the origin
|
||||
{add r2, r2, r11; nop }
|
||||
|
||||
outer_loop:
|
||||
ldc r11, (MACCRS_PER_PHASE-1)*BYTES_PER_VECTOR
|
||||
{vclrdr ; add r11, r2, 0} //clear accu and reset data pointer
|
||||
ldd r1, r4, sp[1] // set loop counter and coef base pointer
|
||||
|
||||
phase_loop:
|
||||
|
||||
//{nop; nop}
|
||||
//{nop; nop}
|
||||
//{nop; nop}
|
||||
|
||||
//MACCR 1 left
|
||||
{vldc r11[0]; add r11, r11, BYTES_PER_WORD}
|
||||
{vlmaccr r1[0]; add r1, r1, r9}
|
||||
{vstc r11[0]; sub r11, r11, r10}
|
||||
|
||||
//MACCR 2 left
|
||||
{vldc r11[0]; add r11, r11, BYTES_PER_WORD}
|
||||
{vlmaccr r1[0]; add r1, r1, r9}
|
||||
{vstc r11[0]; sub r11, r11, r10}
|
||||
|
||||
//MACCR 3 left
|
||||
{vldc r11[0]; add r11, r11, BYTES_PER_WORD}
|
||||
{vlmaccr r1[0]; add r1, r1, r9}
|
||||
{vstc r11[0]; sub r11, r11, r10}
|
||||
|
||||
{testct r0, res[r3]; nop}
|
||||
{bt r0, exit; nop}
|
||||
{in r0, res[r3] ; nop } //fetch data from channel, then get the other one too
|
||||
{stw r0, r11[0] ; in r5, res[r3] } //store to start of phase
|
||||
|
||||
//MACCR 4 left
|
||||
{vldc r11[0]; add r11, r11, BYTES_PER_WORD}
|
||||
{vlmaccr r1[0]; add r1, r1, r9}
|
||||
{vstc r11[0]; sub r11, r11, r10}
|
||||
|
||||
|
||||
//rewind r1 by MACCRS_PER_PHASE * BYTES_PER_VECTOR
|
||||
{sub r1, r1, r7; add r11, r11, r8 }
|
||||
|
||||
//now do the right channel
|
||||
{vldc r11[0]; add r11, r11, BYTES_PER_WORD}
|
||||
{vlmaccr r1[0]; add r1, r1, r9}
|
||||
{vstc r11[0]; sub r11, r11, r10} //r10 = 32 + 1
|
||||
|
||||
//MACCR 2 right
|
||||
{vldc r11[0]; add r11, r11, BYTES_PER_WORD}
|
||||
{vlmaccr r1[0]; add r1, r1, r9}
|
||||
{vstc r11[0]; sub r11, r11, r10}
|
||||
|
||||
//MACCR 3 right
|
||||
{vldc r11[0]; add r11, r11, BYTES_PER_WORD}
|
||||
{vlmaccr r1[0]; add r1, r1, r9}
|
||||
{vstc r11[0]; sub r11, r11, r10}
|
||||
|
||||
{stw r5, r11[0] ; nop } //store to start of phase
|
||||
|
||||
//MACCR 4 right
|
||||
{vldc r11[0]; add r11, r11, BYTES_PER_WORD}
|
||||
{vlmaccr r1[0]; add r1, r1, r9}
|
||||
{vstc r11[0]; sub r11, r11, r10}
|
||||
|
||||
{nop; add r11, r11, r8 } //advance to next phase
|
||||
|
||||
{bt r4, phase_loop; sub r4, r4, 1}
|
||||
|
||||
ldaw r11, sp[4]
|
||||
{vlsat r11[0]; nop} //turn all accumulators into 32 bits
|
||||
|
||||
ldaw r11, sp[12]
|
||||
{vstr r11[0]; nop}
|
||||
{vldc r11[0];ldap r11, right_chan}
|
||||
{vclrdr; nop}
|
||||
{vlmaccr r11[0];ldap r11, left_chan}
|
||||
{vlmaccr r11[0]; ldap r11, zeros}
|
||||
|
||||
|
||||
{vlsat r11[0]; ldaw r11, sp[0]}
|
||||
vstrpv r11[0], r6
|
||||
|
||||
ldd r11, r4, sp[0]
|
||||
// load c_out from stack to r1
|
||||
ldw r1, sp[27]
|
||||
{out res[r1], r4; nop}
|
||||
{bu outer_loop;out res[r1], r11}
|
||||
|
||||
passthrough_loop:
|
||||
{testct r11, res[r3]; nop}
|
||||
{bt r11, exit; nop}
|
||||
{in r11, res[r3]; nop}
|
||||
{out res[r4], r11; nop}
|
||||
{in r11, res[r3]; nop}
|
||||
{bu passthrough_loop; out res[r4], r11}
|
||||
|
||||
exit:
|
||||
{inct r0, res[r3]; nop}
|
||||
ldw r4, sp[20]
|
||||
ldw r5, sp[21]
|
||||
ldw r6, sp[22]
|
||||
ldw r7, sp[23]
|
||||
ldw r8, sp[24]
|
||||
ldw r9, sp[25]
|
||||
ldw r10, sp[26]
|
||||
retsp NSTACKWORDS
|
||||
|
||||
.cc_bottom FUNCTION_NAME.function
|
||||
@@ -0,0 +1,53 @@
|
||||
#ifndef _SSRC_COEFS_H_
|
||||
#define _SSRC_COEFS_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* Downsample ratio=4, 48kHz base — 128 coefficients */
|
||||
static int32_t ds4_48000_coefs[128] = {
|
||||
4192603, -2703925, 1667738, -971500, 525063, -255689, 105964, 5666,
|
||||
147741797, -66167732, 40186648, -26923243, 18716201, -13134162, 9159092, -6278295,
|
||||
-8394794, 12071368, -17195979, 24612481, -36235752, 57613909, -114155284, 1046129870,
|
||||
-80960, 208765, -445117, 844122, -1474686, 2422662, -3794257, 5724570,
|
||||
11257906, -7331064, 4577066, -2707960, 1493638, -748452, 324772, -145564,
|
||||
502280711, -186846312, 108570992, -71571731, 49475933, -34709734, 24277296, -16731888,
|
||||
-18415916, 26595074, -37942809, 54167579, -78966289, 122300118, -223331678, 840288039,
|
||||
-149225, 407138, -899861, 1748155, -3108937, 5178122, -8198765, 12476764,
|
||||
12476764, -8198765, 5178122, -3108937, 1748155, -899861, 407138, -149225,
|
||||
840288039, -223331678, 122300118, -78966289, 54167579, -37942809, 26595074, -18415916,
|
||||
-16731888, 24277296, -34709734, 49475933, -71571731, 108570992, -186846312, 502280711,
|
||||
-145564, 324772, -748452, 1493638, -2707960, 4577066, -7331064, 11257906,
|
||||
5724570, -3794257, 2422662, -1474686, 844122, -445117, 208765, -80960,
|
||||
1046129870, -114155284, 57613909, -36235752, 24612481, -17195979, 12071368, -8394794,
|
||||
-6278295, 9159092, -13134162, 18716201, -26923243, 40186648, -66167732, 147741797,
|
||||
5666, 105964, -255689, 525063, -971500, 1667738, -2703925, 4192603,
|
||||
};
|
||||
|
||||
/* Upsample ratio=4, 48kHz base — 128 coefficients */
|
||||
static int32_t us4_48000_coefs[128] = {
|
||||
-80960, 208765, -445117, 844122, -1474686, 2422662, -3794257, 5724570,
|
||||
-149225, 407138, -899861, 1748155, -3108937, 5178122, -8198765, 12476764,
|
||||
-8394794, 12071368, -17195979, 24612481, -36235752, 57613909, -114155284, 1046129870,
|
||||
147741797, -66167732, 40186648, -26923243, 18716201, -13134162, 9159092, -6278295,
|
||||
4192603, -2703925, 1667738, -971500, 525063, -255689, 105964, 5666,
|
||||
11257906, -7331064, 4577066, -2707960, 1493638, -748452, 324772, -145564,
|
||||
-145564, 324772, -748452, 1493638, -2707960, 4577066, -7331064, 11257906,
|
||||
5666, 105964, -255689, 525063, -971500, 1667738, -2703925, 4192603,
|
||||
-16731888, 24277296, -34709734, 49475933, -71571731, 108570992, -186846312, 502280711,
|
||||
-6278295, 9159092, -13134162, 18716201, -26923243, 40186648, -66167732, 147741797,
|
||||
502280711, -186846312, 108570992, -71571731, 49475933, -34709734, 24277296, -16731888,
|
||||
-18415916, 26595074, -37942809, 54167579, -78966289, 122300118, -223331678, 840288039,
|
||||
12476764, -8198765, 5178122, -3108937, 1748155, -899861, 407138, -149225,
|
||||
5724570, -3794257, 2422662, -1474686, 844122, -445117, 208765, -80960,
|
||||
1046129870, -114155284, 57613909, -36235752, 24612481, -17195979, 12071368, -8394794,
|
||||
-6278295, 9159092, -13134162, 18716201, -26923243, 40186648, -66167732, 147741797,
|
||||
};
|
||||
|
||||
#define SSRC_DS4_48K_FINAL_SHR 2
|
||||
#define SSRC_US4_FINAL_SHR 0
|
||||
#define SSRC_US4_HISTORY_OFFSET (32*4)
|
||||
#define SSRC_US4_NUM_PHASE 4
|
||||
#define SSRC_US4_PHASE_SIZE 4
|
||||
#define SSRC_RB_SIZE (2*32*5+32)
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,33 @@
|
||||
#ifndef _SSRC_REC_CORE_H_
|
||||
#define _SSRC_REC_CORE_H_
|
||||
|
||||
#if F1_MUSIC_UAC2 == 1
|
||||
|
||||
#include <xs1.h>
|
||||
#include <platform.h>
|
||||
|
||||
/**
|
||||
* Downsample recording core — runs on tile[1]
|
||||
* Uses two streaming channels (ds_stereo.S 需要独立 c_in/c_out,不能别名):
|
||||
* - c_from_tile0: tile[0]→tile[1] 192kHz stereo input
|
||||
* - c_to_tile0: tile[1]→tile[0] 48kHz stereo output
|
||||
*/
|
||||
void ds_rec_core(streaming chanend c_from_tile0, streaming chanend c_to_tile0);
|
||||
|
||||
/**
|
||||
* Upsample recording core — runs on tile[1]
|
||||
* 改动原因:us_stereo.S 是持续运行函数,只会在控制 token 时返回;
|
||||
* 因此本 core 只负责把 48kHz 输入升采样写入 tile[1] 本地 ring buffer。
|
||||
*/
|
||||
void us_rec_core(streaming chanend c_us_in);
|
||||
|
||||
/**
|
||||
* Upsample output sender — runs on tile[1]
|
||||
* 改动原因:从 us_rec_core 写入的 tile[1] 本地 ring buffer 取 192kHz 数据,
|
||||
* 通过普通 channel 发回 tile[0],避免等待 us_stereo.S 返回导致死锁。
|
||||
*/
|
||||
void us_rec_output_core(chanend c_us_out);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,128 @@
|
||||
#if F1_MUSIC_UAC2 == 1
|
||||
|
||||
#include "ssrc_rec_core.h"
|
||||
#include <xs1.h>
|
||||
#include <platform.h>
|
||||
#include <string.h>
|
||||
#include "ssrc_coefs.h"
|
||||
#include "ssrc_us_share_buf.h"
|
||||
|
||||
#ifndef SET_SAMPLE_FREQ
|
||||
#define SET_SAMPLE_FREQ 1
|
||||
#endif
|
||||
|
||||
#ifndef NUM_USB_CHAN_OUT
|
||||
#define NUM_USB_CHAN_OUT 2
|
||||
#endif
|
||||
|
||||
/* Assembly function declarations */
|
||||
extern unsigned char ds_stereo(
|
||||
int32_t final_shr,
|
||||
int32_t *coefs,
|
||||
int32_t *data,
|
||||
streaming chanend c_in,
|
||||
streaming chanend c_out,
|
||||
int32_t num_phase);
|
||||
|
||||
extern unsigned char us_stereo(
|
||||
int32_t *coefs,
|
||||
int32_t *l_history,
|
||||
int32_t *r_history,
|
||||
streaming chanend c_in,
|
||||
int32_t history_offset,
|
||||
uint32_t ring_buffer_addr,
|
||||
uint32_t tail_addr,
|
||||
int32_t ring_buffer_size,
|
||||
int32_t num_phase,
|
||||
int32_t phase_size,
|
||||
int32_t final_shr);
|
||||
|
||||
#pragma unsafe arrays
|
||||
void ds_rec_core(streaming chanend c_from_tile0, streaming chanend c_to_tile0)
|
||||
{
|
||||
int32_t history[1057];
|
||||
unsigned char control_token;
|
||||
|
||||
memset(history, 0, sizeof(history));
|
||||
set_core_high_priority_on();
|
||||
|
||||
while (1) {
|
||||
control_token = ds_stereo(
|
||||
SSRC_DS4_48K_FINAL_SHR,
|
||||
ds4_48000_coefs,
|
||||
history,
|
||||
c_from_tile0, /* c_in: read 192kHz from tile[0] */
|
||||
c_to_tile0, /* c_out: write 48kHz back to tile[0] */
|
||||
4
|
||||
);
|
||||
|
||||
switch (control_token) {
|
||||
case SET_SAMPLE_FREQ:
|
||||
memset(history, 0, sizeof(history));
|
||||
{
|
||||
unsigned dummy;
|
||||
c_from_tile0 :> dummy;
|
||||
}
|
||||
soutct(c_to_tile0, SET_SAMPLE_FREQ);
|
||||
for (size_t i = 0; i < NUM_USB_CHAN_OUT * 3; ++i) {
|
||||
c_to_tile0 <: 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma unsafe arrays
|
||||
void us_rec_core(streaming chanend c_us_in)
|
||||
{
|
||||
int32_t l_history[64];
|
||||
int32_t r_history[64];
|
||||
unsigned char control_token;
|
||||
|
||||
memset(l_history, 0, sizeof(l_history));
|
||||
memset(r_history, 0, sizeof(r_history));
|
||||
ssrc_us_share_reset();
|
||||
|
||||
while (1) {
|
||||
/* 改动原因:us_stereo.S 是持续运行的生产者,只有收到控制 token 才返回。
|
||||
* 正常音频路径不要在此函数后面发送数据,否则永远执行不到。 */
|
||||
control_token = us_stereo(
|
||||
us4_48000_coefs,
|
||||
l_history, r_history,
|
||||
c_us_in,
|
||||
SSRC_US4_HISTORY_OFFSET,
|
||||
ssrc_us_share_get_buffer_addr(),
|
||||
ssrc_us_share_get_tail_addr(),
|
||||
SSRC_US_RB_WORDS - 32,
|
||||
SSRC_US4_NUM_PHASE,
|
||||
SSRC_US4_PHASE_SIZE,
|
||||
SSRC_US4_FINAL_SHR
|
||||
);
|
||||
|
||||
switch (control_token) {
|
||||
case SET_SAMPLE_FREQ:
|
||||
memset(l_history, 0, sizeof(l_history));
|
||||
memset(r_history, 0, sizeof(r_history));
|
||||
ssrc_us_share_reset();
|
||||
{
|
||||
unsigned dummy;
|
||||
c_us_in :> dummy;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void us_rec_output_core(chanend c_us_out)
|
||||
{
|
||||
while (1) {
|
||||
/* 改动原因:C 函数封装 ring buffer,避免 XC 并行共享对象规则报错和 C/XC 指针 ABI 差异。 */
|
||||
c_us_out <: ssrc_us_share_pop_word_blocking();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,43 @@
|
||||
#include "ssrc_us_share_buf.h"
|
||||
|
||||
/* 改动原因:该 buffer 只在 tile[1] 内被 us_rec_core/us_rec_output_core 使用。
|
||||
* us_stereo.S 通过 tail 地址写入;输出任务通过 head 读取并用普通 chan 发回 tile[0]。 */
|
||||
static int32_t ssrc_us_rb[SSRC_US_RB_WORDS];
|
||||
static int32_t ssrc_us_head;
|
||||
/* 改动原因:us_stereo.S 通过指针写 ssrc_us_tail;编译器无法感知,须加 volatile
|
||||
* 否则 ssrc_us_share_pop_word_blocking 的 while 循环永远读缓存旧值,导致死锁 */
|
||||
volatile int32_t ssrc_us_tail;
|
||||
|
||||
void ssrc_us_share_reset(void)
|
||||
{
|
||||
ssrc_us_head = 0;
|
||||
ssrc_us_tail = 0;
|
||||
}
|
||||
|
||||
uint32_t ssrc_us_share_get_buffer_addr(void)
|
||||
{
|
||||
return (uint32_t)ssrc_us_rb;
|
||||
}
|
||||
|
||||
uint32_t ssrc_us_share_get_tail_addr(void)
|
||||
{
|
||||
return (uint32_t)&ssrc_us_tail;
|
||||
}
|
||||
|
||||
int32_t ssrc_us_share_pop_word_blocking(void)
|
||||
{
|
||||
int32_t sample;
|
||||
|
||||
while (ssrc_us_head == ssrc_us_tail) {
|
||||
/* 改动原因:输出任务等待 us_stereo.S 生产数据;只阻塞发送任务,不阻塞采样率转换任务。 */
|
||||
asm volatile("nop");
|
||||
}
|
||||
|
||||
sample = ssrc_us_rb[ssrc_us_head];
|
||||
ssrc_us_head++;
|
||||
if (ssrc_us_head >= (SSRC_US_RB_WORDS - 32)) {
|
||||
/* 改动原因:us_stereo.S 使用的 ring size 为 NUM_USB_CHAN_OUT*32*5,不包含尾部padding。 */
|
||||
ssrc_us_head = 0;
|
||||
}
|
||||
return sample;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
#ifndef _SSRC_US_SHARE_BUF_H_
|
||||
#define _SSRC_US_SHARE_BUF_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* 改动原因:us_stereo.S 持续写 ring buffer;XC 并行任务不能直接共享全局数组,
|
||||
* 因此用 C 函数封装 ring buffer,作为 tile[1] 内 us_rec_core → us_rec_output_core 的边界。 */
|
||||
#define SSRC_US_RB_WORDS (2 * 32 * 5 + 32)
|
||||
|
||||
void ssrc_us_share_reset(void);
|
||||
uint32_t ssrc_us_share_get_buffer_addr(void);
|
||||
uint32_t ssrc_us_share_get_tail_addr(void);
|
||||
int32_t ssrc_us_share_pop_word_blocking(void);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,182 @@
|
||||
#define FUNCTION_NAME us_stereo
|
||||
/*
|
||||
void us_stereo(
|
||||
int32_t * coefs,
|
||||
int32_t * l_history,
|
||||
int32_t * r_history,
|
||||
streaming chanend c_in,
|
||||
int32_t history_offset, +1
|
||||
int32_t * ring_buffer, +2
|
||||
int32_t * tail, +3
|
||||
int32_t ring_buffer_size, +4
|
||||
int32_t num_phase, +5 (number of polyphase filter)
|
||||
int32_t phase_size, +6 (in vpu mac size (8word))
|
||||
int32_t final_shr); +7
|
||||
*/
|
||||
|
||||
#define NSTACKWORDS 32
|
||||
|
||||
.cc_top FUNCTION_NAME.function
|
||||
.type FUNCTION_NAME,@function
|
||||
|
||||
.issue_mode dual
|
||||
.align 4
|
||||
|
||||
#define BYTES_PER_WORD 4
|
||||
#define CHANNELS 2
|
||||
#define WORDS_PER_VECTOR 8
|
||||
#define BYTES_PER_VECTOR (WORDS_PER_VECTOR*BYTES_PER_WORD)
|
||||
|
||||
#define ZERO 0x0
|
||||
#define ONE 0x40000000
|
||||
filter_l_1010:
|
||||
.word ZERO, ZERO, ZERO, ZERO, ONE, ZERO, ONE, ZERO
|
||||
filter_l_0101:
|
||||
.word ZERO, ZERO, ZERO, ZERO, ZERO, ONE, ZERO, ONE
|
||||
filter_r_1010:
|
||||
.word ONE, ZERO, ONE, ZERO, ZERO, ZERO, ZERO, ZERO
|
||||
filter_r_0101:
|
||||
.word ZERO, ONE, ZERO, ONE, ZERO, ZERO, ZERO, ZERO
|
||||
zeros:
|
||||
.word 0, 0, 0, 0, 0, 0, 0, 0
|
||||
.align 16
|
||||
.globl FUNCTION_NAME
|
||||
.globl FUNCTION_NAME.nstackwords
|
||||
.set FUNCTION_NAME.nstackwords, NSTACKWORDS
|
||||
FUNCTION_NAME:
|
||||
{ dualentsp NSTACKWORDS ; nop }
|
||||
|
||||
stw r4, sp[NSTACKWORDS-1]
|
||||
stw r5, sp[NSTACKWORDS-2]
|
||||
stw r6, sp[NSTACKWORDS-3]
|
||||
stw r7, sp[NSTACKWORDS-4]
|
||||
stw r8, sp[NSTACKWORDS-5]
|
||||
stw r9, sp[NSTACKWORDS-6]
|
||||
stw r10, sp[NSTACKWORDS-7] // sp[25]
|
||||
|
||||
// store coefs to stack[0]
|
||||
stw r0, sp[24]
|
||||
// store l,r history to stack[1,2]
|
||||
std r2, r1, sp[0] // sp[1] sp[0]
|
||||
// store the final_shr for the VLSAT to stack[2-9]
|
||||
ldw r0, sp[NSTACKWORDS+7]
|
||||
std r0, r0, sp[1] // sp[2] sp[3]
|
||||
std r0, r0, sp[2] // sp[4] sp[5]
|
||||
std r0, r0, sp[3] // sp[6] sp[7]
|
||||
std r0, r0, sp[4] // sp[8] sp[9]
|
||||
// store start of ring buffer and tail to stack[10,11]
|
||||
ldw r0, sp[NSTACKWORDS+2]
|
||||
ldw r1, sp[NSTACKWORDS+3]
|
||||
std r0, r1, sp[5] // sp[11] sp[10]
|
||||
// store sample history offset to stack[12]
|
||||
ldw r0, sp[NSTACKWORDS+1]
|
||||
stw r0, sp[12]
|
||||
// store c_in to stack[13]
|
||||
stw r3, sp[13]
|
||||
// store num_phase and phase size to stack[14,15]
|
||||
ldw r0, sp[NSTACKWORDS+5]
|
||||
ldw r1, sp[NSTACKWORDS+6]
|
||||
stw r0, sp[14]
|
||||
stw r1, sp[15]
|
||||
|
||||
// temp vstr store at stack[16-23]
|
||||
|
||||
// program start
|
||||
ldc r9, BYTES_PER_VECTOR // r9: BYTES_PER_WORD
|
||||
ldc r10, BYTES_PER_VECTOR*3 // r10: coefs rewind
|
||||
ldd r7, r8, sp[5] // r7: ring_buffer ptr, r8: tail ptr
|
||||
|
||||
outer_loop:
|
||||
ldw r4, sp[12]
|
||||
ldw r3, sp[13]
|
||||
{ testct r11, res[r3] ; ldw r0, sp[0] } // r0: &l_history[0]
|
||||
bt r11, exit
|
||||
{ in r11, res[r3] ; add r2, r0, r4 } // r2: &l_history[offset]
|
||||
{ in r11, res[r3] ; stw r11, r2[0] }
|
||||
{ ldw r2, sp[1] ; add r1, r0, BYTES_PER_WORD } // r2: &r_history[0], r1: &l_history[4]
|
||||
{ add r4, r2, r4 ; add r3, r2, BYTES_PER_WORD } // r4: &r_history[offset], r3: &r_history[4]
|
||||
{ stw r11, r4[0] ; nop }
|
||||
{ ldw r4, sp[24] ; add r11, r2, 0 } // r4: &coeff[0], r11: r2
|
||||
ldw r6, sp[15] // r6: phase size
|
||||
{ sub r6, r6, 2 ; ldw r5, sp[14] } // burst 2, r5: num of phase
|
||||
{ vclrdr ; nop }
|
||||
bu mac_loop
|
||||
phase_loop:
|
||||
{ nop ; ldaw r11, sp[2] }
|
||||
{ vlsat r11[0] ; ldaw r11, sp[16] } // turn all accumulators into 32 bits
|
||||
{ vstr r11[0] ; nop } // store accumulators result into stack[16-23]
|
||||
{ vldc r11[0] ; nop } // load the accumulators result into VC from stack
|
||||
{ vclrdr ; ldap r11, filter_r_1010 } // clear vR vD
|
||||
{ vlmaccr r11[0] ; ldap r11, filter_l_1010 } // r us t1, vD:vR -> {r_us_t1, 0, 0, 0}
|
||||
{ vlmaccr r11[0] ; ldap r11, filter_r_0101 } // l us t1, vD:vR -> {l_us_t1, r_us_t1, 0, 0}
|
||||
{ vlmaccr r11[0] ; ldap r11, filter_l_0101 } // r us t0, vD:vR -> {r_us_t0, l_us_t1, r_us_t1, 0}
|
||||
{ vlmaccr r11[0] ; ldap r11, zeros } // l us t0, vD:vR -> {l_us_t0, r_us_t0, l_us_t1, r_us_t1}, r11: all zeros for vlsat
|
||||
{ vlsat r11[0] ; ldc r11, BYTES_PER_WORD*4 } // sat(vD:vR), r11: BYTES_PER_WORD*4 = 4 sample size
|
||||
{ vstr r7[0] ; add r7, r7, r11 } // save result to ring buffer, update ring buffer ptr
|
||||
{ ldw r11, r8[0] ; nop } // r11: tail value
|
||||
{ ldw r6, sp[NSTACKWORDS+4] ; add r11, r11, 4 } // r6: ring_buffer size, r11: tail + 4
|
||||
{ stw r11, r8[0] ; eq r11, r11, r6 } // update tail ptr, r11: check if tail at ring buffer end
|
||||
{ bf r11, prepare_mac_loop ; nop } // if tail not at buffer end, prepare mac loop
|
||||
{ ldw r7, sp[11] ; ldc r11, 0 } // r7: ring buffer start, r11: 0
|
||||
{ stw r11, r8[0] ; nop } // update tail ptr to 0
|
||||
prepare_mac_loop:
|
||||
{ ldw r6, sp[15] ; sub r5, r5, 2 } // r6: phase size, r5: r5-2 processed two polyphase filter
|
||||
{ bf r5, outer_loop ; sub r6, r6, 2 } // burst 2
|
||||
ldd r1, r0, sp[0] // r0: &l_history[0], r2: &r_history[0]
|
||||
{ vclrdr ; nop }
|
||||
bu mac_loop_no_move
|
||||
mac_loop:
|
||||
// swap r11 for channel
|
||||
{ add r2, r11, 0 ; add r11, r0, 0 } // r11: r0
|
||||
// left channel
|
||||
{ vldc r1[0] ; add r1, r1, r9 }
|
||||
{ vstc r11[0] ; add r11, r11, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vldc r1[0] ; add r1, r1, r9 }
|
||||
{ vstc r11[0] ; add r11, r11, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vlmaccr r4[0] ; sub r4, r4, r10 } // rewind
|
||||
// swap r11 for channel
|
||||
{ add r0, r11, 0 ; add r11, r2, 0 }
|
||||
// right channel
|
||||
{ vldc r3[0] ; add r3, r3, r9 }
|
||||
{ vstc r11[0] ; add r11, r11, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vldc r3[0] ; add r3, r3, r9 }
|
||||
{ vstc r11[0] ; add r11, r11, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ bt r6, mac_loop ; sub r6, r6, 2 } // vD:vR -> {right_f1, right_f0, left_f1, left_f0}
|
||||
bu phase_loop
|
||||
mac_loop_no_move:
|
||||
// left channel
|
||||
{ vldc r0[0] ; add r0, r0, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vldc r0[0] ; add r0, r0, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vlmaccr r4[0] ; sub r4, r4, r10 } // rewind
|
||||
// right channel
|
||||
{ vldc r1[0] ; add r1, r1, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vldc r1[0] ; add r1, r1, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ vlmaccr r4[0] ; add r4, r4, r9 }
|
||||
{ bt r6, mac_loop_no_move ; sub r6, r6, 2 }
|
||||
bu phase_loop
|
||||
|
||||
exit:
|
||||
{inct r0, res[r3]; nop}
|
||||
ldw r4, sp[NSTACKWORDS-1]
|
||||
ldw r5, sp[NSTACKWORDS-2]
|
||||
ldw r6, sp[NSTACKWORDS-3]
|
||||
ldw r7, sp[NSTACKWORDS-4]
|
||||
ldw r8, sp[NSTACKWORDS-5]
|
||||
ldw r9, sp[NSTACKWORDS-6]
|
||||
ldw r10, sp[NSTACKWORDS-7]
|
||||
retsp NSTACKWORDS
|
||||
|
||||
.cc_bottom FUNCTION_NAME.function
|
||||
Reference in New Issue
Block a user