update ex3d settings

This commit is contained in:
Steven Dan
2026-03-26 14:29:30 +08:00
parent c9235923ed
commit f3d757417c
4 changed files with 202 additions and 62 deletions

View File

@@ -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)

View File

@@ -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<length; i++) {
RcvData[i] = chan_in_byte(c_hidRcvData);
}
if(RcvData[0] == 0x01) { // REPORT ID 1
#if (HID_CONTROLS == 1)
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]);
// 0xB0/0xB1命令由process_send_params通过c_ex3d_hid_cmd直接发到tile1处理
// 这里只需跳过不再通过c_hidSendData回传结果
if (length >= 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_params16个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:
{

View File

@@ -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 <xcore/channel.h>
#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);

View File

@@ -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_);