From f3d757417cd85fa2b3e349b070768d0014a12fbd Mon Sep 17 00:00:00 2001 From: Steven Dan Date: Thu, 26 Mar 2026 14:29:30 +0800 Subject: [PATCH] update ex3d settings --- .../src/extensions/audiohw.xc | 98 ++++++++++++++++++- .../src/extensions/dsp.c | 56 ++++++++++- .../src/extensions/eq.c | 93 +++++++++--------- .../src/extensions/main.xc | 17 ++-- 4 files changed, 202 insertions(+), 62 deletions(-) diff --git a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/audiohw.xc b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/audiohw.xc index 196d5c4..2e801c6 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/audiohw.xc +++ b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/audiohw.xc @@ -93,6 +93,9 @@ unsigned g_format_delay_time = 0; unsigned g_mclk_select = 0; // 改动原因:添加LED开关全局变量,控制LED是否显示(0=关闭,1=开启) unsigned g_led_enable = 1; // LED开关,默认开启 +// HID 0xB0 CMD_EXPAND_GAIN到达时由eq.c设置,button_task读取后更新footstep LED +// -1 (0xFFFFFFFF) 表示无待处理请求 +unsigned g_hid_expand_gain_request = (unsigned)-1; uint32_t get_reference_time(); unsigned g_disable_i2c = 0; unsigned g_dac_mode = 10; @@ -341,6 +344,7 @@ 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 unsigned flag_footsteps_enhancement = 0; unsigned flag_aidenoise_onoff = 0; @@ -379,6 +383,17 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) saved_mode = load_value(path); debug_printf("Loaded game_mode from flash: %d\n", saved_mode); +#if USE_EX3D == 1 + // 加载脚步增强状态(保存值为expand_gain: 0/6/12) + { + unsigned char footstep_path[] = "footstep"; + unsigned char saved_footstep = load_value(footstep_path); + if (saved_footstep == 6) flag_footsteps_enhancement = 1; + else if (saved_footstep == 12) flag_footsteps_enhancement = 2; + else flag_footsteps_enhancement = 0; + debug_printf("Loaded footstep gain from flash: %d, state=%d\n", saved_footstep, flag_footsteps_enhancement); + } +#endif #if defined(UAC1_MODE) delay_milliseconds(300); @@ -554,6 +569,27 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) debug_printf("Sent sound_effect_mode %d to hid_button_task\n", active_mode); } +#if USE_EX3D == 1 + // 发送初始脚步增强expand_gain到tile1 + { + int init_expand = 0; + if (flag_footsteps_enhancement == 1) init_expand = 6; + else if (flag_footsteps_enhancement == 2) init_expand = 12; + cc_mic_level <: 0xFD; + cc_mic_level <: (unsigned)init_expand; + debug_printf("Sent init expand_gain %d to hid_button_task\n", init_expand); + } + + // 恢复脚步增强LED初始状态 + if (flag_footsteps_enhancement == 1) { + led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128); + led_update_all(&led_ctx); + } else if (flag_footsteps_enhancement == 2) { + led_on(&led_ctx, LED_FOOTSTEP_MODE); + led_update_all(&led_ctx); + } +#endif + // port_enable(p_ctrl_keys); port_ctrl_keys = 0;//port_in(p_ctrl_keys); if ((port_ctrl_keys & KEY_MUTE) == 0) { @@ -680,7 +716,6 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) } #if (HID_CONTROLS == 1) for (int i=1; i<(HID_MAX_DATA_BYTES/4); i++) { - //reportData[i] = chan_in_word(c_hidSendData); c_hidSendData :> reportData[i]; } hidSetChangePending(1); @@ -857,25 +892,78 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) #endif } +#if USE_EX3D == 1 mode_change = 0; if(button_footsteps_enhancement == 0) { if(push_button_footsteps_enhancement_state_old == 1) { - flag_footsteps_enhancement ^= 1; + // 3档循环: 0(关/0dB) → 1(中亮/6dB) → 2(高亮/12dB) → 0 + flag_footsteps_enhancement = (flag_footsteps_enhancement + 1) % 3; mode_change = 1; } } push_button_footsteps_enhancement_state_old = button_footsteps_enhancement; if(mode_change) - if(flag_footsteps_enhancement) + { + int new_expand_gain; + if(flag_footsteps_enhancement == 0) { - led_on(&led_ctx, LED_FOOTSTEP_MODE); + new_expand_gain = 0; + led_off(&led_ctx, LED_FOOTSTEP_MODE); + } + else if(flag_footsteps_enhancement == 1) + { + new_expand_gain = 6; + led_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128); } else { - led_off(&led_ctx, LED_FOOTSTEP_MODE); + new_expand_gain = 12; + led_on(&led_ctx, LED_FOOTSTEP_MODE); } + led_update_all(&led_ctx); + // 发送expand_gain到tile1执行 + cc_mic_level <: 0xFD; + cc_mic_level <: (unsigned)new_expand_gain; + // 掉电保存 + unsigned char footstep_path[] = "footstep"; + save_value(footstep_path, (unsigned char)new_expand_gain); + debug_printf("Footstep state=%d, expand_gain=%d\n", flag_footsteps_enhancement, new_expand_gain); + } + + // HID 0xB0 CMD_EXPAND_GAIN请求:同步footstep LED状态 + { + unsigned hid_gain_req; + 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档位 + unsigned new_state; + if (hid_gain_req == 0) { + new_state = 0; + } else if (hid_gain_req <= 6) { + new_state = 1; + } else { + new_state = 2; + } + 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_set_brightness(&led_ctx, LED_FOOTSTEP_MODE, 128); + } else { + led_on(&led_ctx, LED_FOOTSTEP_MODE); + } + led_update_all(&led_ctx); + unsigned char fp[] = "footstep"; + save_value(fp, (unsigned char)hid_gain_req); + debug_printf("HID set footstep gain=%d, state=%d\n", hid_gain_req, flag_footsteps_enhancement); + } + } + } +#endif mode_change = 0; if(button_aidenoise_onoff == 0) diff --git a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/dsp.c b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/dsp.c index b7c1fd4..7e0d2f3 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/dsp.c +++ b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/dsp.c @@ -820,7 +820,7 @@ void update_button(unsigned char b) extern uint8_t mic_vol; //Tile 1 -void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData, chanend_t c_uac_vol) +void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c_hidSendData, chanend_t c_uac_vol, chanend_t c_ex3d_hid_cmd) { #if defined(IR_SWITCHING_MODE) static uint32_t is_3d_on = IR_OFF; @@ -852,6 +852,7 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c SELECT_RES( CASE_THEN(cc_mic_level, event_mic_vol) , CASE_THEN(c_hidRcvData, event_hid) + , CASE_THEN(c_ex3d_hid_cmd, event_ex3d_hid) , CASE_THEN(timer, event_polling) , CASE_THEN(c_uac_vol, event_uac_vol) ) @@ -912,6 +913,14 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c debug_printf("Mode 3: AI7.1 (IR_7_1_GAME) ON, sf=1, EQ ON\n"); } SET_SHARED_GLOBAL(g_3d_on_off_t1, is_3d_on); + } else if (tmp == 0xFD) { + // 脚步增强按键发来的 expand gain 命令 + int32_t gain = (int32_t)chan_in_word(cc_mic_level); + if ((0 <= gain) && (gain <= 20)) { + Ex3dExpandGain = gain; + EX3DAudio_SetExpandGain(Ex3dExpandGain); + debug_printf("Button set CMD_EXPAND_GAIN: %d\n", gain); + } } else { // Mic 静音状态命令 switch (tmp) { @@ -936,21 +945,58 @@ void hid_button_task(chanend_t cc_mic_level, chanend_t c_hidRcvData, chanend_t c event_hid: { - //uint8_t junk=chan_in_byte(c_hid); unsigned length = chan_in_byte(c_hidRcvData); for(int i=0; i= 3 && RcvData[1] == 0x77 && + (RcvData[2] == 0xB0 || RcvData[2] == 0xB1)) { + // 丢弃,由event_ex3d_hid处理 + } else { + hid_receive_task_in_c(RcvData, SendData); + for(int i=0; i<(HID_MAX_DATA_BYTES / 4); i++) { + chan_out_word(c_hidSendData, SendData[i]); + } } #endif } } continue; + event_ex3d_hid: + { +#if (HID_CONTROLS == 1) + // 收到process_send_params发来的0xB0/0xB1 EX3D命令 + // 协议: cmd(1 byte) + ex3d_cmd_code(1 word) + params_len(1 byte) + params(N bytes) + uint8_t hid_cmd = chan_in_byte(c_ex3d_hid_cmd); + uint32_t ex3d_cmd_code = chan_in_word(c_ex3d_hid_cmd); + uint8_t params_len = chan_in_byte(c_ex3d_hid_cmd); + + // 构建EX3D原生格式缓冲区: [0x01, 0, 0, 0, cmd_code[4], params...] + unsigned char ex3d_rcv[64]; + memset(ex3d_rcv, 0, 64); + ex3d_rcv[0] = 0x01; + ex3d_rcv[4] = (uint8_t)(ex3d_cmd_code & 0xFF); + ex3d_rcv[5] = (uint8_t)((ex3d_cmd_code >> 8) & 0xFF); + ex3d_rcv[6] = (uint8_t)((ex3d_cmd_code >> 16) & 0xFF); + ex3d_rcv[7] = (uint8_t)((ex3d_cmd_code >> 24) & 0xFF); + for (int i = 0; i < params_len && i < 56; i++) { + ex3d_rcv[8 + i] = chan_in_byte(c_ex3d_hid_cmd); + } + + // 在tile1执行EX3D命令 + hid_receive_task_in_c(ex3d_rcv, SendData); + + // 将结果回传给process_send_params(16个word) + for (int i = 0; i < (HID_MAX_DATA_BYTES / 4); i++) { + chan_out_word(c_ex3d_hid_cmd, SendData[i]); + } +#endif + } + continue; event_uac_vol: { diff --git a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq.c b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq.c index d52181c..f00f8e5 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq.c +++ b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq.c @@ -25,6 +25,9 @@ extern void device_reboot(void); #include "biquad_standalone.h" #include "eq_flash_storage.h" #include "user_func.h" +#if (USE_EX3D == 1) && (HID_CONTROLS == 1) +#include +#endif static struct { uint8_t pending_cmd; // 0xB0/0xB1 or 0 @@ -449,6 +452,13 @@ static bool apply_eq_band_params(uint8_t mode, uint8_t band_index, uint8_t filte void program_key(unsigned char *, signed int); #if (USE_EX3D == 1) && (HID_CONTROLS == 1) extern void hid_receive_task_in_c(unsigned char * RcvData, unsigned * SendData); +#ifndef HID_MAX_DATA_BYTES +#define HID_MAX_DATA_BYTES (64) +#endif +static chanend_t g_ex3d_hid_chanend = 0; +static unsigned ex3d_b0b1_result[HID_MAX_DATA_BYTES / 4] = {0}; +extern unsigned g_hid_expand_gain_request; +void SetEx3dHidChan(chanend_t c) { g_ex3d_hid_chanend = c; } #endif unsigned char process_send_params(uint8_t data[], uint16_t len) { if (len < 60) { @@ -713,17 +723,42 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { } // 处理发送/读取EX3D命令 (0xB0/0xB1) - SET_EX3D_CMD / GET_EX3D_CMD + // 数据通过 g_ex3d_hid_chanend 直接传到tile1的hid_button_task执行,结果同步返回 if (data[1] == 0xB0 || data[1] == 0xB1) { #if (USE_EX3D == 1) && (HID_CONTROLS == 1) + if (!g_ex3d_hid_chanend) return false; + // 提取EX3D命令码(4字节,小端序) uint32_t ex3d_cmd = (uint32_t)data[2] | ((uint32_t)data[3] << 8) | ((uint32_t)data[4] << 16) | ((uint32_t)data[5] << 24); - // 提取参数(从data[6]开始,最多56字节) + uint8_t params_len = (uint8_t)((len > 62) ? 56 : (len > 6 ? len - 6 : 0)); + + // 存储到ex3d_request供process_read_params构建响应 ex3d_request.ex3d_command_code = ex3d_cmd; - ex3d_request.ex3d_params_len = (len > 62) ? 56 : (len - 6); - memcpy(ex3d_request.ex3d_params, &data[6], ex3d_request.ex3d_params_len); + ex3d_request.ex3d_params_len = params_len; + if (params_len > 0) memcpy(ex3d_request.ex3d_params, &data[6], params_len); ex3d_request.pending_cmd = data[1]; + + // 若是SET CMD_EXPAND_GAIN (0x93),同步更新footstep LED状态 + if (data[1] == 0xB0 && ex3d_cmd == 0x93 && params_len >= 4) { + uint32_t gain_val = (uint32_t)data[6] | ((uint32_t)data[7] << 8) | + ((uint32_t)data[8] << 16) | ((uint32_t)data[9] << 24); + SET_SHARED_GLOBAL(g_hid_expand_gain_request, gain_val); + } + + // 发送命令到tile1并同步等待结果 + // 协议: cmd(1 byte) + ex3d_cmd_code(4 bytes) + params_len(1 byte) + params(N bytes) + chan_out_byte(g_ex3d_hid_chanend, data[1]); + chan_out_word(g_ex3d_hid_chanend, ex3d_cmd); + chan_out_byte(g_ex3d_hid_chanend, params_len); + for (int i = 0; i < params_len; i++) { + chan_out_byte(g_ex3d_hid_chanend, data[6 + i]); + } + // 接收tile1返回的结果(16个word) + for (int i = 0; i < (HID_MAX_DATA_BYTES / 4); i++) { + ex3d_b0b1_result[i] = chan_in_word(g_ex3d_hid_chanend); + } return true; #else return false; @@ -837,23 +872,6 @@ void user_read_hid_status(unsigned char hidPassData[]) } } -#if (USE_EX3D == 1) && (HID_CONTROLS == 1) -static void ex3d_build_and_call(unsigned char rcv_data[64], unsigned send_data[16]) { - memset(rcv_data, 0, 64); - memset(send_data, 0, sizeof(unsigned) * 16); - rcv_data[0] = 0x01; - unsigned *pRcvBuf = (unsigned *)(rcv_data + 4); - pRcvBuf[0] = ex3d_request.ex3d_command_code; - for (int i = 0; i < ex3d_request.ex3d_params_len / 4 && i < 14; i++) { - pRcvBuf[i + 1] = (uint32_t)ex3d_request.ex3d_params[i * 4] | - ((uint32_t)ex3d_request.ex3d_params[i * 4 + 1] << 8) | - ((uint32_t)ex3d_request.ex3d_params[i * 4 + 2] << 16) | - ((uint32_t)ex3d_request.ex3d_params[i * 4 + 3] << 24); - } - hid_receive_task_in_c(rcv_data, send_data); -} -#endif - // process_read_params: build HID response from pending request state unsigned char process_read_params(uint8_t response[]) { memset(response, 0, 63); @@ -1056,20 +1074,15 @@ unsigned char process_read_params(uint8_t response[]) { } // 处理发送EX3D命令响应 (0xB0) - SET_EX3D_CMD + // 结果已在process_send_params中同步从tile1获取,存于ex3d_b0b1_result if (ex3d_request.pending_cmd == 0xB0) { RSP_HDR(response, 0xB0); #if (USE_EX3D == 1) && (HID_CONTROLS == 1) - unsigned char rcv_data[64]; - unsigned send_data[16]; - ex3d_build_and_call(rcv_data, send_data); + unsigned *send_data = ex3d_b0b1_result; // 状态码:检查send_data[1]是否有错误返回值(0xFFFFFFFF表示参数错误) - uint8_t status = 0x00; // 默认成功 - if (send_data[1] == 0xFFFFFFFF) { - status = 0x01; // 失败 - } - + uint8_t status = (send_data[1] == 0xFFFFFFFF) ? 0x01 : 0x00; response[2] = status; // 回显命令码(4字节) @@ -1078,20 +1091,11 @@ unsigned char process_read_params(uint8_t response[]) { response[5] = (uint8_t)((ex3d_request.ex3d_command_code >> 16) & 0xFF); response[6] = (uint8_t)((ex3d_request.ex3d_command_code >> 24) & 0xFF); - // 返回send_data中的返回值(如果有) - if (send_data[1] != 0xFFFFFFFF) { - // 某些SET命令可能返回数据,将send_data[1]开始的数据复制到响应 - response[7] = (uint8_t)(send_data[1] & 0xFF); - response[8] = (uint8_t)((send_data[1] >> 8) & 0xFF); - response[9] = (uint8_t)((send_data[1] >> 16) & 0xFF); - response[10] = (uint8_t)((send_data[1] >> 24) & 0xFF); - } else { - // 错误时返回0xFFFFFFFF - response[7] = 0xFF; - response[8] = 0xFF; - response[9] = 0xFF; - response[10] = 0xFF; - } + // 返回send_data[1]中的返回值 + response[7] = (uint8_t)(send_data[1] & 0xFF); + response[8] = (uint8_t)((send_data[1] >> 8) & 0xFF); + response[9] = (uint8_t)((send_data[1] >> 16) & 0xFF); + response[10] = (uint8_t)((send_data[1] >> 24) & 0xFF); #else response[2] = 0x01; // 失败:EX3D支持未启用 #endif @@ -1101,13 +1105,12 @@ unsigned char process_read_params(uint8_t response[]) { } // 处理读取EX3D命令响应 (0xB1) - GET_EX3D_CMD + // 结果已在process_send_params中同步从tile1获取,存于ex3d_b0b1_result if (ex3d_request.pending_cmd == 0xB1) { RSP_HDR(response, 0xB1); #if (USE_EX3D == 1) && (HID_CONTROLS == 1) - unsigned char rcv_data[64]; - unsigned send_data[16]; - ex3d_build_and_call(rcv_data, send_data); + unsigned *send_data = ex3d_b0b1_result; // 回显命令码(4字节) response[2] = (uint8_t)(ex3d_request.ex3d_command_code & 0xFF); diff --git a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/main.xc b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/main.xc index 2e64c39..ddf12bd 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/main.xc +++ b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/main.xc @@ -425,11 +425,12 @@ extern void dsp_core0(void); extern void board_setup(); extern void dsp_main (chanend c_data); extern void SetEqDataChan (chanend c); +extern void SetEx3dHidChan (chanend c); extern int dsp_worker_tile(chanend c_dsp_to_ex3d, int worker_id); //extern int dsp_worker_tile_1(chanend c_dsp_to_ex3d, int worker_id); extern void ex3d_task(); -extern void hid_button_task(chanend cc_mic_level, chanend c_hid, chanend c_hidSendData, chanend c_uac_vol); +extern void hid_button_task(chanend cc_mic_level, chanend c_hid, chanend c_hidSendData, chanend c_uac_vol, chanend c_ex3d_hid_cmd); extern void AudioHwRemote(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol); extern void dnr_dsp_proc_task(void); @@ -531,12 +532,13 @@ int main() USER_MAIN_DECLARATIONS - chan c_dsp_to_ex3d[DSP_WORKER_COUNT]; - chan cc_mic_level; - chan c_key; chan c_hidSendData; - chan c_hidRcvData; - chan c_eq_data; + chan c_dsp_to_ex3d[DSP_WORKER_COUNT]; + chan cc_mic_level; + chan c_key; chan c_hidSendData; + chan c_hidRcvData; + chan c_eq_data; chan c_uac_vol; + chan c_ex3d_hid_cmd; par { @@ -544,7 +546,7 @@ int main() on tile[1] : { par { unsafe { - hid_button_task(cc_mic_level, c_hidRcvData, c_hidSendData, c_uac_vol); + hid_button_task(cc_mic_level, c_hidRcvData, c_hidSendData, c_uac_vol, c_ex3d_hid_cmd); } #if USE_EX3D == 1 par(int i = 0; i < DSP_WORKER_COUNT; i++) @@ -675,6 +677,7 @@ int main() { thread_speed(); #if (USE_EX3D == 1) && (HID_CONTROLS > 0) + SetEx3dHidChan(c_ex3d_hid_cmd); XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_hidRcvData, c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_); #else XUA_Endpoint0( c_xud_out[0], c_xud_in[0], c_aud_ctl, c_mix_ctl, c_clk_ctl, c_EANativeTransport_ctrl, dfuInterface VENDOR_REQUESTS_PARAMS_);