From 5efccb105f08a42dba44f98c6f56d3832a2f2292 Mon Sep 17 00:00:00 2001 From: imalexgao Date: Sun, 13 Sep 2026 22:37:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=95=BF=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E8=BF=90=E8=A1=8C=E5=90=8EHID=E7=AB=AF=E7=82=B9?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E9=94=99=E4=B9=B1=E5=AF=BC=E8=87=B4=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E9=94=AE=E5=A4=B1=E6=95=88=E5=92=8C=E9=94=AE=E7=9B=98?= =?UTF-8?q?=E9=94=99=E4=B9=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 去掉双重HID报告发送:每次按键同时调用tud_hid_n_report和Arduino封装的sendReport,导致USB端点缓冲区长时间运行后堆积状态错乱 2. 去掉错误的clear_stall调用:每次按键都检查端点busy并调用clear_stall,这是错误用法,clear_stall用于清除stall状态而非处理busy状态,频繁错误调用会导致端点状态错乱 修复后按键事件只发送一次USB报告,且不再错误调用clear_stall,解决了使用一段时间后语音键失效、麦克风不拾音、键盘错乱的问题 --- src/usb/usb_composite.cpp | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/src/usb/usb_composite.cpp b/src/usb/usb_composite.cpp index 36fe4e9..eb25a1d 100644 --- a/src/usb/usb_composite.cpp +++ b/src/usb/usb_composite.cpp @@ -152,17 +152,6 @@ bool usb_hid_keyboard_press(uint8_t modifier, uint8_t keycode) { vTaskDelay(pdMS_TO_TICKS(15)); } - if (usbd_edpt_busy(0, 0x81)) { - usbd_edpt_clear_stall(0, 0x81); - } - - // 1. Direct TinyUSB driver report - hid_keyboard_report_t kbd = {0}; - kbd.modifier = modifier; - kbd.keycode[0] = keycode; - tud_hid_n_report(0, HID_REPORT_ID_KEYBOARD, &kbd, sizeof(kbd)); - - // 2. Arduino helper state update KeyReport report = {0}; report.modifiers = modifier; report.keys[0] = keycode; @@ -176,13 +165,6 @@ bool usb_hid_keyboard_release(void) { if (!s_usb_ready) return false; hid_lock(); - if (usbd_edpt_busy(0, 0x81)) { - usbd_edpt_clear_stall(0, 0x81); - } - - hid_keyboard_report_t kbd = {0}; - tud_hid_n_report(0, HID_REPORT_ID_KEYBOARD, &kbd, sizeof(kbd)); - KeyReport report = {0}; // All zeroes s_keyboard.sendReport(&report); s_keyboard.releaseAll(); @@ -209,11 +191,6 @@ bool usb_hid_consumer_press(uint16_t usage_code) { vTaskDelay(pdMS_TO_TICKS(10)); } - if (usbd_edpt_busy(0, 0x81)) { - usbd_edpt_clear_stall(0, 0x81); - } - - tud_hid_n_report(0, HID_REPORT_ID_CONSUMER_CONTROL, &usage_code, 2); s_consumer.press(usage_code); hid_unlock(); @@ -224,12 +201,6 @@ bool usb_hid_consumer_release(void) { if (!s_usb_ready) return false; hid_lock(); - if (usbd_edpt_busy(0, 0x81)) { - usbd_edpt_clear_stall(0, 0x81); - } - - uint16_t zero = 0; - tud_hid_n_report(0, HID_REPORT_ID_CONSUMER_CONTROL, &zero, 2); s_consumer.release(); hid_unlock();