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 2e801c6..8ce4f40 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 @@ -96,6 +96,8 @@ 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; +// HID 0x84 FACTORY_RESET命令到达时由eq.c设置,button_task轮询后执行重启 +unsigned g_request_factory_reset = 0; uint32_t get_reference_time(); unsigned g_disable_i2c = 0; unsigned g_dac_mode = 10; @@ -319,9 +321,10 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) //port_enable(p_button_music_mode); - int codec_adc_pga_gain_reg_value = NAU88L21_PGA_GAIN_REG_DEFAULT_VALUE;// NAU88L21_PGA_GAIN_REG_MAX_VALUE;//0x01;//0x1f; + // 出厂默认:麦克风21dB (reg=22), 监听-14dB (level=15) + int codec_adc_pga_gain_reg_value = 22; // 21dB - int dac_level = DAC_LEVEL_DEFAULT; + int dac_level = 15; // -14dB (DAC_LEVEL_MAX - 14 = 29 - 14 = 15) // mic endcoder 变量 uint8_t prev_encode_input1 = 0; @@ -344,9 +347,10 @@ 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; + // 脚步增强3档状态: 0=关(0dB), 1=中亮/6dB, 2=高亮/12dB;出厂默认开启(12dB) + unsigned flag_footsteps_enhancement = 2; + // 出厂默认:AI降噪开启 + unsigned flag_aidenoise_onoff = 1; // Buttons state unsigned push_button_music_mode_state_old = 1; // Active low @@ -390,7 +394,11 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) 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; + else if (saved_footstep == 255) { + // 未初始化:出厂默认脚步增强开启(12dB),写入flash + flag_footsteps_enhancement = 2; + save_value(footstep_path, (unsigned char)12); + } else flag_footsteps_enhancement = 0; debug_printf("Loaded footstep gain from flash: %d, state=%d\n", saved_footstep, flag_footsteps_enhancement); } #endif @@ -409,13 +417,8 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) } #else if (saved_mode == 255) { -#if defined(F1_MUSIC_UAC2) - saved_mode = 1; // f1: default music mode -#elif defined(F3_F4_FPS_UAC2) - saved_mode = 3; // f3/f4: default AI7.1 (IR_7_1_GAME) -#else - saved_mode = 0; -#endif + // 出厂默认:AI7.1开启(mode=3) + saved_mode = 3; save_value(path, saved_mode); debug_printf("Saved game_mode to flash: %d\n", saved_mode); } @@ -502,13 +505,13 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) if(saved_mic >= NAU88L21_PGA_GAIN_REG_MIN_USED_VALUE && saved_mic <= NAU88L21_PGA_GAIN_REG_MAX_VALUE) codec_adc_pga_gain_reg_value = saved_mic; else - save_value(mic_vol_path, (unsigned char)codec_adc_pga_gain_reg_value); + save_value(mic_vol_path, (unsigned char)codec_adc_pga_gain_reg_value); // 出厂默认22(21dB) unsigned char saved_dac = load_value(dac_vol_path); if(saved_dac <= DAC_LEVEL_MAX) dac_level = saved_dac; else - save_value(dac_vol_path, (unsigned char)dac_level); + save_value(dac_vol_path, (unsigned char)dac_level); // 出厂默认15(-14dB) } // 同步全局音量变量与从Flash恢复的dac_level / codec_adc_pga_gain_reg_value g_volume_level = dac_level; @@ -588,7 +591,16 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) led_on(&led_ctx, LED_FOOTSTEP_MODE); led_update_all(&led_ctx); } -#endif +#endif + + // 出厂默认:AI降噪开启,初始化LED和算法 +#if DNR_ENABLE == 1 + if (flag_aidenoise_onoff) { + led_on(&led_ctx, LED_ANC); + led_update_all(&led_ctx); + dnr_set_mode(1); + } +#endif // port_enable(p_ctrl_keys); port_ctrl_keys = 0;//port_in(p_ctrl_keys); @@ -991,6 +1003,18 @@ void button_task(chanend c_hidSendData, chanend cc_mic_level, chanend c_uac_vol) //led_update_all(&led_ctx); #endif + // 检查HID 0x84 FACTORY_RESET请求 + { + unsigned factory_reset_req; + GET_SHARED_GLOBAL(factory_reset_req, g_request_factory_reset); + if (factory_reset_req) { + SET_SHARED_GLOBAL(g_request_factory_reset, 0); + debug_printf("Factory reset: rebooting...\n"); + delay_milliseconds(500); + device_reboot(); + while (1); + } + } mode_change = 0; if(button_mic_mute == 0) 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 f00f8e5..da1b5b1 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 @@ -460,6 +460,10 @@ 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 + +// 0x84 FACTORY_RESET: 删除Flash参数后触发重启(由button_task轮询执行) +extern unsigned g_request_factory_reset; +extern int lfs_remove_file(const char *path); unsigned char process_send_params(uint8_t data[], uint16_t len) { if (len < 60) { return false; @@ -722,6 +726,21 @@ unsigned char process_send_params(uint8_t data[], uint16_t len) { return true; } + // 处理恢复出厂默认命令 (0x84) - FACTORY_RESET + if (data[1] == 0x84) { + // 删除所有Flash保存的参数文件 + lfs_remove_file("game_mode"); + lfs_remove_file("mic_vol"); + lfs_remove_file("dac_vol"); + lfs_remove_file("footstep"); + // 删除EQ flash数据 + eq_flash_clear_all(); + // 通知button_task在合适时机重启(避免在USB上下文中直接reboot) + SET_SHARED_GLOBAL(g_request_factory_reset, 1); + read_request.pending_cmd = 0x84; + return true; + } + // 处理发送/读取EX3D命令 (0xB0/0xB1) - SET_EX3D_CMD / GET_EX3D_CMD // 数据通过 g_ex3d_hid_chanend 直接传到tile1的hid_button_task执行,结果同步返回 if (data[1] == 0xB0 || data[1] == 0xB1) { @@ -1073,6 +1092,14 @@ unsigned char process_read_params(uint8_t response[]) { return true; } + // 处理恢复出厂默认响应 (0x84) - FACTORY_RESET + if (read_request.pending_cmd == 0x84) { + RSP_HDR(response, 0x84); + response[2] = 0x00; // 成功 + read_request.pending_cmd = 0; + return true; + } + // 处理发送EX3D命令响应 (0xB0) - SET_EX3D_CMD // 结果已在process_send_params中同步从tile1获取,存于ex3d_b0b1_result if (ex3d_request.pending_cmd == 0xB0) { diff --git a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq_designer_new.py b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq_designer_new.py index e94ce06..9416bf4 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq_designer_new.py +++ b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq_designer_new.py @@ -678,6 +678,13 @@ class EQDesigner(QMainWindow): firmware_btn_layout.addWidget(self.get_firmware_version_btn) device_mode_layout.addRow(firmware_btn_layout) + # 恢复出厂默认按钮 + factory_reset_btn_layout = QHBoxLayout() + self.factory_reset_btn = QPushButton("恢复出厂默认 (0x84)") + self.factory_reset_btn.clicked.connect(self.on_factory_reset) + factory_reset_btn_layout.addWidget(self.factory_reset_btn) + device_mode_layout.addRow(factory_reset_btn_layout) + left_content_layout.addWidget(device_mode_group) @@ -2022,6 +2029,83 @@ eq_mode_data_t sEQ_data_{int(fs)}HZ[NUM_EQ_MODES][NUM_EQ_CHANS] = {{ except Exception as e: log_message(LOG_LEVEL_ERROR, f"复位EQ参数时出错: {str(e)}", self.log_level) + def on_factory_reset(self): + """恢复出厂默认(发送0x84命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + reply = QMessageBox.warning( + self, + "确认恢复出厂默认", + "这将删除所有已保存的参数(音效模式、麦克风增益、监听音量、脚步声增强、EQ预设),\n" + "恢复出厂默认值,并重启设备。\n\n" + "出厂默认值:\n" + " · 音效模式: AI7.1 (3)\n" + " · 脚步声增强: 12dB (全亮)\n" + " · 麦克风增益: 21dB\n" + " · 监听音量: -14dB\n" + " · AI降噪: 开启\n" + " · EQ预设: 头文件默认值\n\n" + "是否继续?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply == QMessageBox.Yes: + self.send_factory_reset() + + def send_factory_reset(self): + """发送恢复出厂默认命令(0x84命令)""" + if self.device_combo.currentData() is None: + log_message(LOG_LEVEL_ERROR, "请先选择设备", self.log_level) + return + + try: + device_info = self.device_combo.currentData() + h = hid.device() + h.open(device_info['vendor_id'], device_info['product_id']) + h.set_nonblocking(1) + + # 构建0x84数据包 + data = bytearray(63) # 63字节数据包 + data[0] = 0x77 # 同步头1 + data[1] = 0x84 # 命令码 (FACTORY_RESET) + # data[2..62] 保留,保持为0 + + log_message(LOG_LEVEL_INFO, "正在发送恢复出厂默认命令...", self.log_level) + h.write([0x01] + list(data)) # 0x01是report_id + + # 读取响应(设备重启前会先回复) + reply = h.get_input_report(0x1, 64) + if reply and len(reply) == 64: + if reply[0] == 0x01 and reply[1] == 0x77 and reply[2] == 0x84: + status = reply[3] + if status == 0x00: + log_message(LOG_LEVEL_INFO, "恢复出厂默认成功,设备即将重启...", self.log_level) + QMessageBox.information( + self, + "恢复出厂默认", + "命令已发送,设备将在500ms后重启。\n请稍候重新连接设备。" + ) + else: + log_message(LOG_LEVEL_ERROR, f"恢复出厂默认失败 (状态码: 0x{status:02x})", self.log_level) + else: + log_message(LOG_LEVEL_ERROR, f"无效的0x84响应: 0x{reply[1]:02x} 0x{reply[2]:02x}", self.log_level) + else: + # 设备可能已开始重启,视为成功 + log_message(LOG_LEVEL_INFO, "未收到响应,设备可能已开始重启", self.log_level) + QMessageBox.information( + self, + "恢复出厂默认", + "命令已发送,设备将重启。\n请稍候重新连接设备。" + ) + + h.close() + + except Exception as e: + log_message(LOG_LEVEL_ERROR, f"恢复出厂默认时出错: {str(e)}", self.log_level) + def on_get_mode_count(self): """获取EQ模式总数(发送0x91命令)""" if self.device_combo.currentData() is None: diff --git a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq_hid_protocol.md b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq_hid_protocol.md index 04ff9a5..d411ce6 100644 --- a/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq_hid_protocol.md +++ b/sw_usb_audio/app_usb_aud_phaten_golden_6ch/src/extensions/eq_hid_protocol.md @@ -10,6 +10,7 @@ |--------|----------|------|------|------| | 0x82 | SET_MIC_VOLUME | 设置麦克风增益级别 | 主机→设备 | 设置麦克风PGA增益(0=静音, 1-37=0dB~36dB, 1dB/步) | | 0x83 | GET_MIC_VOLUME | 获取麦克风增益级别 | 主机→设备 | 读取当前麦克风PGA增益级别(0=静音, 1-37=0dB~36dB) | +| 0x84 | FACTORY_RESET | 恢复出厂默认设置 | 主机→设备 | 删除Flash中所有已保存参数,设备重启后自动恢复出厂默认值 | | 0x8A | SET_EQ_MODE | 切换EQ模式 | 主机→设备 | 切换EQ模式 | | 0x8B | GET_EQ_MODE | 获取当前EQ模式信息 | 主机→设备 | 读取设备当前EQ模式和名称 | | 0x8C | SET_MODE_GAIN_AND_NAME | 设置模式整体增益和名称 | 主机→设备 | 设置模式整体增益和名称 | @@ -98,6 +99,54 @@ - 编码器旋转导致增益变化时,设备主动向主机上报当前增益(最大上报37,内部38时上报37) - HID SET_MIC_VOLUME(0x82)命令成功执行后,设备也主动上报新增益 +### 2.0c 0x84 - FACTORY_RESET (恢复出厂默认设置) +**功能**: 删除Flash中所有已保存的用户参数,设备重启后自动恢复出厂默认值 +**方向**: 主机→设备 +**数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x77 | 同步头1 +1 | 1 | 0x84 | 命令码 +2-62 | 61 | 0x00 | 保留字节 +``` + +**出厂默认参数**: +| 参数 | 出厂默认值 | 说明 | +|------|-----------|------| +| AI7.1音效模式 | 3 (AI7.1开启) | 音效模式 0=无音效, 1=音乐, 2=游戏, 3=AI7.1 | +| 脚步增强 | 12dB (全亮, 状态2) | LED全亮, 扩展增益12dB | +| 麦克风音量 | 22 (21dB) | PGA寄存器值22 = 21dB | +| 监听音量 | 15 (-14dB) | DAC level 15 = 0dB - 14 = -14dB | +| EQ参数 | 头文件预设 | 删除所有用户EQ参数,恢复固件内置预设 | +| AI降噪 | 开启 | 每次上电默认开启(不保存到Flash) | + +**设备端处理**: +1. 删除Flash中保存的以下参数文件: + - `game_mode`(音效模式) + - `mic_vol`(麦克风音量) + - `dac_vol`(监听音量) + - `footstep`(脚步增强状态) + - 所有EQ参数文件(调用eq_flash_clear_all) +2. 设置重启标志,约500ms后设备自动重启 +3. 重启后自动加载出厂默认参数 + +**响应数据包格式**: +``` +字节位置 | 长度 | 内容 | 描述 +---------|------|------|------ +0 | 1 | 0x01 | Report ID +1 | 1 | 0x77 | 同步头1 +2 | 1 | 0x84 | 同步头2 +3 | 1 | uint8 | 状态码 (0x00=成功, 0x01=失败) +4-62 | 59 | 0x00 | 保留字节 +``` + +**注意**: +- 执行后设备将在约500ms后自动重启,USB连接会短暂断开后重连 +- 重启后所有参数将恢复为出厂默认值 +- 此操作不可撤销 + ### 2.1 0x8A - SET_EQ_MODE (切换EQ模式) **功能**: 切换当前EQ模式 **方向**: 主机→设备