From db4e3bb232af27ef79ad0f5a4b17c828f283334a Mon Sep 17 00:00:00 2001 From: Ryan Date: Fri, 27 Oct 2023 11:21:13 +1000 Subject: [PATCH] V-USB: Fix `GET_IDLE/SET_IDLE` (#22332) Co-authored-by: Sergey Vlasov --- quantum/command.c | 5 ----- tmk_core/protocol/vusb/vusb.c | 28 ++++++++++++---------------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/quantum/command.c b/quantum/command.c index aa64b75064..c188638eb4 100644 --- a/quantum/command.c +++ b/quantum/command.c @@ -222,21 +222,16 @@ static void print_status(void) { "\n\t- Status -\n" "host_keyboard_leds(): %02X\n" -#ifndef PROTOCOL_VUSB "keyboard_protocol: %02X\n" "keyboard_idle: %02X\n" -#endif #ifdef NKRO_ENABLE "keymap_config.nkro: %02X\n" #endif "timer_read32(): %08lX\n" , host_keyboard_leds() -#ifndef PROTOCOL_VUSB - /* these aren't set on the V-USB protocol, so we just ignore them for now */ , keyboard_protocol , keyboard_idle -#endif #ifdef NKRO_ENABLE , keymap_config.nkro #endif diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index d7d2227687..3502d9e644 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -48,16 +48,14 @@ along with this program. If not, see . # include "os_detection.h" #endif -#define NEXT_INTERFACE __COUNTER__ - /* * Interface indexes */ enum usb_interfaces { #ifndef KEYBOARD_SHARED_EP - KEYBOARD_INTERFACE = NEXT_INTERFACE, + KEYBOARD_INTERFACE, #else - SHARED_INTERFACE = NEXT_INTERFACE, + SHARED_INTERFACE, # define KEYBOARD_INTERFACE SHARED_INTERFACE #endif @@ -65,32 +63,30 @@ enum usb_interfaces { // interface number, to support Linux/OSX platforms and chrome.hid // If Raw HID is enabled, let it be always 1. #ifdef RAW_ENABLE - RAW_INTERFACE = NEXT_INTERFACE, + RAW_INTERFACE, #endif #if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP) - SHARED_INTERFACE = NEXT_INTERFACE, + SHARED_INTERFACE, #endif #ifdef CONSOLE_ENABLE - CONSOLE_INTERFACE = NEXT_INTERFACE, + CONSOLE_INTERFACE, #endif - TOTAL_INTERFACES = NEXT_INTERFACE + TOTAL_INTERFACES }; #define MAX_INTERFACES 3 -#if (NEXT_INTERFACE - 1) > MAX_INTERFACES -# error There are not enough available interfaces to support all functions. Please disable one or more of the following: Mouse Keys, Extra Keys, Raw HID, Console -#endif +_Static_assert(TOTAL_INTERFACES <= MAX_INTERFACES, "There are not enough available interfaces to support all functions. Please disable one or more of the following: Mouse Keys, Extra Keys, Raw HID, Console."); #if (defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)) && CONSOLE_ENABLE # error Mouse/Extra Keys share an endpoint with Console. Please disable one of the two. #endif static uint8_t keyboard_led_state = 0; -static uint8_t vusb_idle_rate = 0; +uint8_t keyboard_idle = 0; uint8_t keyboard_protocol = 1; /* Keyboard report send buffer */ @@ -335,7 +331,7 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) { break; case USBRQ_HID_GET_IDLE: dprint("GET_IDLE:"); - usbMsgPtr = (usbMsgPtr_t)&vusb_idle_rate; + usbMsgPtr = (usbMsgPtr_t)&keyboard_idle; return 1; case USBRQ_HID_GET_PROTOCOL: dprint("GET_PROTOCOL:"); @@ -351,8 +347,8 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) { } return USB_NO_MSG; // to get data in usbFunctionWrite case USBRQ_HID_SET_IDLE: - vusb_idle_rate = rq->wValue.bytes[1]; - dprintf("SET_IDLE: %02X", vusb_idle_rate); + keyboard_idle = (rq->wValue.word & 0xFF00) >> 8; + dprintf("SET_IDLE: %02X", keyboard_idle); break; case USBRQ_HID_SET_PROTOCOL: if (rq->wIndex.word == KEYBOARD_INTERFACE) { @@ -1044,7 +1040,7 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) { #endif break; case USBDESCR_HID: - switch (rq->wValue.bytes[0]) { + switch (rq->wIndex.word) { #ifndef KEYBOARD_SHARED_EP case KEYBOARD_INTERFACE: usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.keyboardHID;