From 75d8f87b40aaefc8fb8595b73ad5aa4b98c43de8 Mon Sep 17 00:00:00 2001 From: kenji Date: Fri, 8 May 2026 11:40:49 -0400 Subject: [PATCH] suppress hid events from host when device is disconnected --- hyperx_elite2.c | 10 +++++++--- usb_device.c | 18 ++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/hyperx_elite2.c b/hyperx_elite2.c index e225b08..35e25ca 100644 --- a/hyperx_elite2.c +++ b/hyperx_elite2.c @@ -360,11 +360,15 @@ void startADC() { // forward HID report after processing bool forward_report(uint8_t instance, uint8_t const* report, uint16_t len) { - if (instance == 0x01 && report[0] == 0x03 && report[1] == 0xE2) { - mute = !mute; + if (device_state == DEVICE_ACTIVE ) { + if (instance == 0x01 && report[0] == 0x03 && report[1] == 0xE2) { + mute = !mute; + } + + return tud_hid_n_report(instance, 0, report, len); } - return tud_hid_n_report(instance, 0, report, len); + return true; } // save RGB configuration to flash diff --git a/usb_device.c b/usb_device.c index cc267a3..17040c2 100644 --- a/usb_device.c +++ b/usb_device.c @@ -75,19 +75,17 @@ void usb_device_main(void) { while (true) { switch ( device_state ) { case DEVICE_ACTIVE: + if (!tud_mounted()) { + device_state = DEVICE_INACTIVE; + } break; case DEVICE_INACTIVE: break; case DEVICE_RESTART: if (tud_disconnect()) { + device_state = DEVICE_INACTIVE; sleep_ms(10); - if (tud_connect()) { - if ( host_state == HOST_INACTIVE ) { - device_state = DEVICE_INACTIVE; - } else { - device_state = DEVICE_ACTIVE; - } - } + tud_connect(); } break; default: @@ -214,7 +212,6 @@ uint8_t const * tud_hid_descriptor_report_cb(uint8_t itf) return NULL; } - // Invoked when received SET_REPORT control request or // received data on OUT endpoint ( Report ID = 0, Type = 0 ) void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) { @@ -238,6 +235,11 @@ uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_t return 0; } +// Invoked when device is mounted +void tud_mount_cb(void) { + device_state = DEVICE_ACTIVE; +} + // print message to CDC in raw hex void cdc_print_hex(uint8_t const* msg, uint16_t msg_len) { (void) msg;