From 4180d98a386b9a5b989bc9efcf095b099718782b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Tu=C4=8Dek?= Date: Fri, 7 Jul 2023 09:32:52 +0200 Subject: [PATCH 1/3] Revert "usb: hide/disable gamepad interface (#546)" This reverts commit 624debe8f5c799dc5f99075ea9f69b86ee735fc9. --- right/src/usb_composite_device.c | 35 +++++++++++++++++++ .../usb_descriptor_configuration.c | 15 ++++++-- .../usb_descriptors_microsoft.c | 6 ++-- right/src/usb_device_config.h | 1 + right/src/usb_report_updater.c | 10 ++++++ 5 files changed, 61 insertions(+), 6 deletions(-) diff --git a/right/src/usb_composite_device.c b/right/src/usb_composite_device.c index 5de9871f0..5553beefb 100644 --- a/right/src/usb_composite_device.c +++ b/right/src/usb_composite_device.c @@ -165,6 +165,41 @@ static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = { }} }} }, + { + .classCallback = UsbGamepadCallback, + .classInfomation = (usb_device_class_struct_t[]) {{ + .type = kUSB_DeviceClassTypeHid, + .configurations = USB_DEVICE_CONFIGURATION_COUNT, + .interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{ + .count = USB_GAMEPAD_INTERFACE_COUNT, + .interfaces = (usb_device_interfaces_struct_t[USB_GAMEPAD_INTERFACE_COUNT]) {{ + .classCode = USB_CLASS_HID, + .subclassCode = USB_HID_SUBCLASS_NONE, + .protocolCode = USB_HID_PROTOCOL_NONE, + .interfaceNumber = USB_GAMEPAD_INTERFACE_INDEX, + .count = 1, + .interface = (usb_device_interface_struct_t[]) {{ + .alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE, + .endpointList = { + .count = USB_GAMEPAD_ENDPOINT_COUNT, + .endpoint = (usb_device_endpoint_struct_t[USB_GENERIC_HID_ENDPOINT_COUNT]) { + { + .endpointAddress = USB_GAMEPAD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), + .transferType = USB_ENDPOINT_INTERRUPT, + .maxPacketSize = USB_GAMEPAD_INTERRUPT_IN_PACKET_SIZE, + }, + { + .endpointAddress = USB_GAMEPAD_ENDPOINT_INDEX | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT), + .transferType = USB_ENDPOINT_INTERRUPT, + .maxPacketSize = USB_GAMEPAD_INTERRUPT_OUT_PACKET_SIZE, + } + } + } + }} + }} + }} + }} + }, }}; volatile bool SleepModeActive = true; diff --git a/right/src/usb_descriptors/usb_descriptor_configuration.c b/right/src/usb_descriptors/usb_descriptor_configuration.c index 99cc7a160..a971c055b 100644 --- a/right/src/usb_descriptors/usb_descriptor_configuration.c +++ b/right/src/usb_descriptors/usb_descriptor_configuration.c @@ -295,15 +295,21 @@ USB_GAMEPAD_INTERRUPT_OUT_INTERVAL #define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH (USB_CONFIGURATION_DESCRIPTOR_BASE_LENGTH + \ - 0) + (USB_DESCRIPTOR_LENGTH_INTERFACE + USB_DESCRIPTOR_LENGTH_HID + (2 * USB_DESCRIPTOR_LENGTH_ENDPOINT))) static USB_DESC_STORAGE_TYPE(uint8_t) UsbConfigurationDescriptor[USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH] = { BASE_CONFIGURATION_DESCRIPTOR(USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH), + GAMEPAD_HID_CONFIGURATION_DESCRIPTOR }; #define USB_MS_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH (USB_CONFIGURATION_DESCRIPTOR_BASE_LENGTH + \ (USB_DESCRIPTOR_LENGTH_INTERFACE + 0x11 + (2 * USB_DESCRIPTOR_LENGTH_ENDPOINT))) +static USB_DESC_STORAGE_TYPE(uint8_t) UsbMsConfigurationDescriptor[USB_MS_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH] = { + BASE_CONFIGURATION_DESCRIPTOR(USB_MS_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH), + GAMEPAD_XINPUT_CONFIGURATION_DESCRIPTOR +}; + usb_status_t USB_DeviceGetHidDescriptor( usb_device_handle handle, usb_device_get_hid_descriptor_struct_t *hidDescriptor) { @@ -325,6 +331,9 @@ usb_status_t USB_DeviceGetHidDescriptor( case USB_MOUSE_INTERFACE_INDEX: hidDescriptor->buffer = (uint8_t*)&UsbConfigurationDescriptor[USB_MOUSE_HID_DESCRIPTOR_INDEX]; break; + case USB_GAMEPAD_INTERFACE_INDEX: + hidDescriptor->buffer = (uint8_t*)&UsbConfigurationDescriptor[USB_GAMEPAD_HID_DESCRIPTOR_INDEX]; + break; default: return kStatus_USB_InvalidRequest; } @@ -339,8 +348,8 @@ usb_status_t USB_DeviceGetConfigurationDescriptor( configurationDescriptor->buffer = (uint8_t*)UsbConfigurationDescriptor; configurationDescriptor->length = sizeof(UsbConfigurationDescriptor); } else { - configurationDescriptor->buffer = (uint8_t*)UsbConfigurationDescriptor; - configurationDescriptor->length = sizeof(UsbConfigurationDescriptor); + configurationDescriptor->buffer = (uint8_t*)UsbMsConfigurationDescriptor; + configurationDescriptor->length = sizeof(UsbMsConfigurationDescriptor); } return kStatus_USB_Success; } diff --git a/right/src/usb_descriptors/usb_descriptors_microsoft.c b/right/src/usb_descriptors/usb_descriptors_microsoft.c index d0fa80d53..cfbf473d1 100644 --- a/right/src/usb_descriptors/usb_descriptors_microsoft.c +++ b/right/src/usb_descriptors/usb_descriptors_microsoft.c @@ -105,7 +105,7 @@ static USB_DESC_STORAGE_TYPE(USBD_BOSType) usbd_bosDesc = { }, .CapabilityData.DescInfoSet = { .dwWindowsVersion = USB_MS_OS_2P0_MIN_WINDOWS_VERSION, - .wMSOSDescriptorSetTotalLength = 0, + .wMSOSDescriptorSetTotalLength = sizeof(USB_MSOS_DescType), .bMS_VendorCode = USB_REQ_MICROSOFT_OS, .bAltEnumCode = 1, }, @@ -163,8 +163,8 @@ usb_status_t USB_DeviceGetMsOsDescriptor( usb_device_handle handle, usb_device_control_request_struct_t *controlRequest) { #if (USBD_MS_OS_DESC_VERSION == 2) - controlRequest->buffer = (uint8_t*)NULL; - controlRequest->length = 0; + controlRequest->buffer = (uint8_t*)&usbd_msosDesc; + controlRequest->length = sizeof(usbd_msosDesc); return kStatus_USB_Success; #else return kStatus_USB_InvalidRequest; diff --git a/right/src/usb_device_config.h b/right/src/usb_device_config.h index a8f4c6979..c0051d539 100644 --- a/right/src/usb_device_config.h +++ b/right/src/usb_device_config.h @@ -21,6 +21,7 @@ USB_MEDIA_KEYBOARD_INTERFACE_COUNT + \ USB_SYSTEM_KEYBOARD_INTERFACE_COUNT + \ USB_MOUSE_INTERFACE_COUNT + \ + USB_GAMEPAD_INTERFACE_COUNT + \ 0) // Whether the device is self-powered: 1 supported, 0 not supported diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 480180a0c..8f3e0a637 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -542,6 +542,7 @@ void UpdateUsbReports(void) UsbMediaKeyboardResetActiveReport(); UsbSystemKeyboardResetActiveReport(); UsbMouseResetActiveReport(); + UsbGamepadResetActiveReport(); updateActiveUsbReports(); @@ -593,4 +594,13 @@ void UpdateUsbReports(void) } lastActivityTime = CurrentTime; } + + if (UsbGamepadCheckReportReady() == kStatus_USB_Success) { + UsbReportUpdateSemaphore |= 1 << USB_GAMEPAD_INTERFACE_INDEX; + usb_status_t status = UsbGamepadAction(); + if (status != kStatus_USB_Success) { + UsbReportUpdateSemaphore &= ~(1 << USB_GAMEPAD_INTERFACE_INDEX); + } + lastActivityTime = CurrentTime; + } } From e7c2831483bc070c335436c99e553af1431458e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Tu=C4=8Dek?= Date: Wed, 30 Nov 2022 15:34:27 +0100 Subject: [PATCH 2/3] Add missing gamepad handle. --- right/src/usb_composite_device.c | 1 + 1 file changed, 1 insertion(+) diff --git a/right/src/usb_composite_device.c b/right/src/usb_composite_device.c index 5553beefb..13a7bff6f 100644 --- a/right/src/usb_composite_device.c +++ b/right/src/usb_composite_device.c @@ -358,6 +358,7 @@ void InitUsb(void) UsbCompositeDevice.mediaKeyboardHandle = UsbDeviceCompositeConfigList.config[USB_MEDIA_KEYBOARD_INTERFACE_INDEX].classHandle; UsbCompositeDevice.systemKeyboardHandle = UsbDeviceCompositeConfigList.config[USB_SYSTEM_KEYBOARD_INTERFACE_INDEX].classHandle; UsbCompositeDevice.mouseHandle = UsbDeviceCompositeConfigList.config[USB_MOUSE_INTERFACE_INDEX].classHandle; + UsbCompositeDevice.gamepadHandle = UsbDeviceCompositeConfigList.config[USB_GAMEPAD_INTERFACE_INDEX].classHandle; uint8_t usbDeviceKhciIrq[] = USB_IRQS; uint8_t irqNumber = usbDeviceKhciIrq[CONTROLLER_ID - kUSB_ControllerKhci0]; From 30cb6fb47b8894dd3975a9a26b2c90fdb5ce9026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Tu=C4=8Dek?= Date: Fri, 7 Jul 2023 09:41:38 +0200 Subject: [PATCH 3/3] Implement basic gamepad interface support. --- doc-dev/reference-manual.md | 8 ++- lib/agent | 2 +- right/src/config_parser/parse_keymap.h | 19 ++++++ right/src/key_action.h | 6 ++ right/src/ledmap.c | 4 ++ right/src/ledmap.h | 3 +- right/src/macro_set_command.c | 13 +++- right/src/macro_shortcut_parser.c | 34 ++++++++++ right/src/macro_shortcut_parser.h | 3 +- right/src/macros.c | 62 +++++++++++++++++++ right/src/macros.h | 8 +++ right/src/module.h | 2 + right/src/mouse_controller.c | 31 ++++++++-- right/src/mouse_controller.h | 3 + right/src/slave_drivers/uhk_module_driver.c | 5 ++ right/src/str_utils.c | 7 +++ .../usb_interfaces/usb_interface_gamepad.c | 18 +++++- .../usb_interfaces/usb_interface_gamepad.h | 9 ++- right/src/usb_report_updater.c | 28 ++++++--- scripts/package.json | 2 +- shared/module/slave_protocol_handler.c | 2 + shared/slave_protocol.h | 1 + trackball/src/module.c | 1 + trackpoint/src/module.c | 1 + 24 files changed, 245 insertions(+), 27 deletions(-) diff --git a/doc-dev/reference-manual.md b/doc-dev/reference-manual.md index 6a72dfc41..4ebed3e0a 100644 --- a/doc-dev/reference-manual.md +++ b/doc-dev/reference-manual.md @@ -158,7 +158,7 @@ The following grammar is supported: LABEL = SHORTCUT = MODMASK- | MODMASK-KEY | KEY | MODMASK MODMASK = [MODMASK]+ | [L|R]{S|C|A|G} | {p|r|h|t} | {s|i|o} - NAVIGATIONMODE = cursor | scroll | caret | media | zoom | zoomPc | zoomMac | none + NAVIGATIONMODE = cursor | scroll | caret | media | zoom | zoomPc | zoomMac | none | gamepadStickLeft | gamepadStickRight NAVIGATIONMODECUSTOM = caret | media | zoomPc | zoomMac MODULEID = trackball | touchpad | trackpoint | keycluster KEY = CHAR|KEYABBREV @@ -184,11 +184,14 @@ The following grammar is supported: KEYABBREV = f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10 | f11 | f12 | f13 | f14 | f15 | f16 | f17 | f18 | f19 | f20 | f21 | f22 | f23 | f24 KEYABBREV = mediaVolumeMute | mediaVolumeUp | mediaVolumeDown | mediaRecord | mediaFastForward | mediaRewind | mediaNext | mediaPrevious | mediaStop | mediaPlayPause | mediaPause KEYABBREV = systemPowerDown | systemSleep | systemWakeUp - KEYABBREV = mouseBtnLeft | mouseBtnRight | mouseBtnMiddle | mouseBtn4 | mouseBtn5 | mouseBtn6 | mouseBtn7 | mouseBtn8 + KEYABBREV = mouse.btn1 | mouse.btn2 | mouse.btn3 | mouse.btn4 | mouse.btn5 | mouse.btn6 | mouse.btn7 | mouse.btn8 | mouse.btnLeft | mouse.btnMiddle | mouse.btnRight + KEYABBREV = gamepad.a | gamepad.b | gamepad.back | gamepad.dPadDown | gamepad.dPadLeft | gamepad.dPadRight | gamepad.dPadUp | gamepad.home + KEYABBREV = gamepad.leftBumper | gamepad.leftStick | gamepad.rightBumper | gamepad.rightStick | gamepad.start | gamepad.x | gamepad.y MACRONAME = ############ #DEPRECATED# ############ + KEYABBREV = mouseBtnLeft | mouseBtnRight | mouseBtnMiddle | mouseBtn4 | mouseBtn5 | mouseBtn6 | mouseBtn7 | mouseBtn8 COMMAND = set macroEngine.scheduler {blocking|preemptive} COMMAND = set doubletapDelay