From aad57466827c6aac8f612f5fbbb5adcea6fc5975 Mon Sep 17 00:00:00 2001 From: Ryan Date: Fri, 23 Jun 2023 00:07:28 +1000 Subject: Move protocol makefiles into their respective folders (#21332) * Move protocol makefiles into their respective folders * Fix USB-USB converter --- tmk_core/protocol/arm_atsam.mk | 31 -------------- tmk_core/protocol/arm_atsam/arm_atsam.mk | 31 ++++++++++++++ tmk_core/protocol/chibios.mk | 17 -------- tmk_core/protocol/chibios/chibios.mk | 17 ++++++++ tmk_core/protocol/lufa.mk | 52 ----------------------- tmk_core/protocol/lufa/lufa.mk | 52 +++++++++++++++++++++++ tmk_core/protocol/usb_hid.mk | 73 -------------------------------- tmk_core/protocol/usb_hid/usb_hid.mk | 73 ++++++++++++++++++++++++++++++++ tmk_core/protocol/vusb.mk | 17 -------- tmk_core/protocol/vusb/vusb.mk | 17 ++++++++ 10 files changed, 190 insertions(+), 190 deletions(-) delete mode 100644 tmk_core/protocol/arm_atsam.mk create mode 100644 tmk_core/protocol/arm_atsam/arm_atsam.mk delete mode 100644 tmk_core/protocol/chibios.mk create mode 100644 tmk_core/protocol/chibios/chibios.mk delete mode 100644 tmk_core/protocol/lufa.mk create mode 100644 tmk_core/protocol/lufa/lufa.mk delete mode 100644 tmk_core/protocol/usb_hid.mk create mode 100644 tmk_core/protocol/usb_hid/usb_hid.mk delete mode 100644 tmk_core/protocol/vusb.mk create mode 100644 tmk_core/protocol/vusb/vusb.mk (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/arm_atsam.mk b/tmk_core/protocol/arm_atsam.mk deleted file mode 100644 index ffd1fa9f50..0000000000 --- a/tmk_core/protocol/arm_atsam.mk +++ /dev/null @@ -1,31 +0,0 @@ -ARM_ATSAM_DIR = protocol/arm_atsam - -SRC += $(ARM_ATSAM_DIR)/adc.c -SRC += $(ARM_ATSAM_DIR)/clks.c -SRC += $(ARM_ATSAM_DIR)/d51_util.c -SRC += $(ARM_ATSAM_DIR)/i2c_master.c -ifeq ($(RGB_MATRIX_DRIVER),custom) - SRC += $(ARM_ATSAM_DIR)/md_rgb_matrix_programs.c - SRC += $(ARM_ATSAM_DIR)/md_rgb_matrix.c -endif -SRC += $(ARM_ATSAM_DIR)/main_arm_atsam.c -SRC += $(ARM_ATSAM_DIR)/shift_register.c -SRC += $(ARM_ATSAM_DIR)/spi_master.c -SRC += $(ARM_ATSAM_DIR)/startup.c - -SRC += $(ARM_ATSAM_DIR)/usb/main_usb.c -SRC += $(ARM_ATSAM_DIR)/usb/udc.c -SRC += $(ARM_ATSAM_DIR)/usb/udi_cdc.c -SRC += $(ARM_ATSAM_DIR)/usb/udi_hid.c -SRC += $(ARM_ATSAM_DIR)/usb/udi_hid_kbd.c -SRC += $(ARM_ATSAM_DIR)/usb/udi_hid_kbd_desc.c -SRC += $(ARM_ATSAM_DIR)/usb/ui.c -SRC += $(ARM_ATSAM_DIR)/usb/usb.c -SRC += $(ARM_ATSAM_DIR)/usb/usb_device_udd.c -SRC += $(ARM_ATSAM_DIR)/usb/usb_hub.c -SRC += $(ARM_ATSAM_DIR)/usb/usb_util.c - -SRC += $(DRIVER_PATH)/usb2422.c - -# Search Path -VPATH += $(TMK_DIR)/$(ARM_ATSAM_DIR) diff --git a/tmk_core/protocol/arm_atsam/arm_atsam.mk b/tmk_core/protocol/arm_atsam/arm_atsam.mk new file mode 100644 index 0000000000..ffd1fa9f50 --- /dev/null +++ b/tmk_core/protocol/arm_atsam/arm_atsam.mk @@ -0,0 +1,31 @@ +ARM_ATSAM_DIR = protocol/arm_atsam + +SRC += $(ARM_ATSAM_DIR)/adc.c +SRC += $(ARM_ATSAM_DIR)/clks.c +SRC += $(ARM_ATSAM_DIR)/d51_util.c +SRC += $(ARM_ATSAM_DIR)/i2c_master.c +ifeq ($(RGB_MATRIX_DRIVER),custom) + SRC += $(ARM_ATSAM_DIR)/md_rgb_matrix_programs.c + SRC += $(ARM_ATSAM_DIR)/md_rgb_matrix.c +endif +SRC += $(ARM_ATSAM_DIR)/main_arm_atsam.c +SRC += $(ARM_ATSAM_DIR)/shift_register.c +SRC += $(ARM_ATSAM_DIR)/spi_master.c +SRC += $(ARM_ATSAM_DIR)/startup.c + +SRC += $(ARM_ATSAM_DIR)/usb/main_usb.c +SRC += $(ARM_ATSAM_DIR)/usb/udc.c +SRC += $(ARM_ATSAM_DIR)/usb/udi_cdc.c +SRC += $(ARM_ATSAM_DIR)/usb/udi_hid.c +SRC += $(ARM_ATSAM_DIR)/usb/udi_hid_kbd.c +SRC += $(ARM_ATSAM_DIR)/usb/udi_hid_kbd_desc.c +SRC += $(ARM_ATSAM_DIR)/usb/ui.c +SRC += $(ARM_ATSAM_DIR)/usb/usb.c +SRC += $(ARM_ATSAM_DIR)/usb/usb_device_udd.c +SRC += $(ARM_ATSAM_DIR)/usb/usb_hub.c +SRC += $(ARM_ATSAM_DIR)/usb/usb_util.c + +SRC += $(DRIVER_PATH)/usb2422.c + +# Search Path +VPATH += $(TMK_DIR)/$(ARM_ATSAM_DIR) diff --git a/tmk_core/protocol/chibios.mk b/tmk_core/protocol/chibios.mk deleted file mode 100644 index 8eaf5b10d2..0000000000 --- a/tmk_core/protocol/chibios.mk +++ /dev/null @@ -1,17 +0,0 @@ -PROTOCOL_DIR = protocol -CHIBIOS_DIR = $(PROTOCOL_DIR)/chibios - - -SRC += $(CHIBIOS_DIR)/usb_main.c -SRC += $(CHIBIOS_DIR)/chibios.c -SRC += usb_descriptor.c -SRC += $(CHIBIOS_DIR)/usb_driver.c -SRC += $(CHIBIOS_DIR)/usb_util.c -SRC += $(LIBSRC) - -VPATH += $(TMK_PATH)/$(PROTOCOL_DIR) -VPATH += $(TMK_PATH)/$(CHIBIOS_DIR) -VPATH += $(TMK_PATH)/$(CHIBIOS_DIR)/lufa_utils - -OPT_DEFS += -DFIXED_CONTROL_ENDPOINT_SIZE=64 -OPT_DEFS += -DFIXED_NUM_CONFIGURATIONS=1 diff --git a/tmk_core/protocol/chibios/chibios.mk b/tmk_core/protocol/chibios/chibios.mk new file mode 100644 index 0000000000..8eaf5b10d2 --- /dev/null +++ b/tmk_core/protocol/chibios/chibios.mk @@ -0,0 +1,17 @@ +PROTOCOL_DIR = protocol +CHIBIOS_DIR = $(PROTOCOL_DIR)/chibios + + +SRC += $(CHIBIOS_DIR)/usb_main.c +SRC += $(CHIBIOS_DIR)/chibios.c +SRC += usb_descriptor.c +SRC += $(CHIBIOS_DIR)/usb_driver.c +SRC += $(CHIBIOS_DIR)/usb_util.c +SRC += $(LIBSRC) + +VPATH += $(TMK_PATH)/$(PROTOCOL_DIR) +VPATH += $(TMK_PATH)/$(CHIBIOS_DIR) +VPATH += $(TMK_PATH)/$(CHIBIOS_DIR)/lufa_utils + +OPT_DEFS += -DFIXED_CONTROL_ENDPOINT_SIZE=64 +OPT_DEFS += -DFIXED_NUM_CONFIGURATIONS=1 diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk deleted file mode 100644 index b048c1836c..0000000000 --- a/tmk_core/protocol/lufa.mk +++ /dev/null @@ -1,52 +0,0 @@ -LUFA_DIR = protocol/lufa - -# Path to the LUFA library -LUFA_PATH = $(LIB_PATH)/lufa - -# Create the LUFA source path variables by including the LUFA makefile -ifneq (, $(wildcard $(LUFA_PATH)/LUFA/Build/lufa_sources.mk)) - # New build system from 20120730 - LUFA_ROOT_PATH = $(LUFA_PATH)/LUFA - DMBS_LUFA_PATH = $(LUFA_PATH)/LUFA/Build/LUFA - include $(LUFA_PATH)/LUFA/Build/lufa_sources.mk -else - include $(LUFA_PATH)/LUFA/makefile -endif - -LUFA_SRC = lufa.c \ - usb_descriptor.c \ - $(LUFA_SRC_USB) - -ifeq ($(strip $(MIDI_ENABLE)), yes) - LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MIDIClassDevice.c -endif - -ifeq ($(strip $(VIRTSER_ENABLE)), yes) - LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c -endif - -SRC += $(LUFA_SRC) -SRC += $(LUFA_DIR)/usb_util.c - -# Search Path -VPATH += $(TMK_PATH)/$(LUFA_DIR) -VPATH += $(LUFA_PATH) - -# LUFA library compile-time options and predefined tokens -LUFA_OPTS = -DUSB_DEVICE_ONLY -LUFA_OPTS += -DUSE_FLASH_DESCRIPTORS -LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" -LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 -LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1 - -# Remote wakeup fix for ATmega16/32U2 https://github.com/tmk/tmk_keyboard/issues/361 -ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2)) - LUFA_OPTS += -DNO_LIMITED_CONTROLLER_CONNECT -endif - -OPT_DEFS += -DF_USB=$(F_USB)UL -OPT_DEFS += -DARCH=ARCH_$(ARCH) -OPT_DEFS += $(LUFA_OPTS) - -# This indicates using LUFA stack -OPT_DEFS += -DPROTOCOL_LUFA diff --git a/tmk_core/protocol/lufa/lufa.mk b/tmk_core/protocol/lufa/lufa.mk new file mode 100644 index 0000000000..b048c1836c --- /dev/null +++ b/tmk_core/protocol/lufa/lufa.mk @@ -0,0 +1,52 @@ +LUFA_DIR = protocol/lufa + +# Path to the LUFA library +LUFA_PATH = $(LIB_PATH)/lufa + +# Create the LUFA source path variables by including the LUFA makefile +ifneq (, $(wildcard $(LUFA_PATH)/LUFA/Build/lufa_sources.mk)) + # New build system from 20120730 + LUFA_ROOT_PATH = $(LUFA_PATH)/LUFA + DMBS_LUFA_PATH = $(LUFA_PATH)/LUFA/Build/LUFA + include $(LUFA_PATH)/LUFA/Build/lufa_sources.mk +else + include $(LUFA_PATH)/LUFA/makefile +endif + +LUFA_SRC = lufa.c \ + usb_descriptor.c \ + $(LUFA_SRC_USB) + +ifeq ($(strip $(MIDI_ENABLE)), yes) + LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MIDIClassDevice.c +endif + +ifeq ($(strip $(VIRTSER_ENABLE)), yes) + LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c +endif + +SRC += $(LUFA_SRC) +SRC += $(LUFA_DIR)/usb_util.c + +# Search Path +VPATH += $(TMK_PATH)/$(LUFA_DIR) +VPATH += $(LUFA_PATH) + +# LUFA library compile-time options and predefined tokens +LUFA_OPTS = -DUSB_DEVICE_ONLY +LUFA_OPTS += -DUSE_FLASH_DESCRIPTORS +LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" +LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1 + +# Remote wakeup fix for ATmega16/32U2 https://github.com/tmk/tmk_keyboard/issues/361 +ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2)) + LUFA_OPTS += -DNO_LIMITED_CONTROLLER_CONNECT +endif + +OPT_DEFS += -DF_USB=$(F_USB)UL +OPT_DEFS += -DARCH=ARCH_$(ARCH) +OPT_DEFS += $(LUFA_OPTS) + +# This indicates using LUFA stack +OPT_DEFS += -DPROTOCOL_LUFA diff --git a/tmk_core/protocol/usb_hid.mk b/tmk_core/protocol/usb_hid.mk deleted file mode 100644 index c0c157c043..0000000000 --- a/tmk_core/protocol/usb_hid.mk +++ /dev/null @@ -1,73 +0,0 @@ -USB_HID_DIR = protocol/usb_hid -USB_HOST_LIB_DIR = $(LIB_PATH)/usbhost - -# -# USB Host Shield -# -USB_HOST_SHIELD_DIR = $(USB_HOST_LIB_DIR)/USB_Host_Shield_2.0 -USB_HOST_SHIELD_SRC = \ - $(USB_HOST_SHIELD_DIR)/Usb.cpp \ - $(USB_HOST_SHIELD_DIR)/hid.cpp \ - $(USB_HOST_SHIELD_DIR)/usbhub.cpp \ - $(USB_HOST_SHIELD_DIR)/parsetools.cpp \ - $(USB_HOST_SHIELD_DIR)/message.cpp - - - -# -# Arduino -# -ARDUINO_DIR = $(USB_HOST_LIB_DIR)/arduino-1.0.1 -ARDUINO_CORES_DIR = $(ARDUINO_DIR)/cores/arduino -ARDUINO_CORES_SRC = \ - $(ARDUINO_CORES_DIR)/Print.cpp \ - $(ARDUINO_CORES_DIR)/Stream.cpp - -# replaced with override_Serial.c -# $(ARDUINO_CORES_DIR)/CDC.cpp \ -# $(ARDUINO_CORES_DIR)/HID.cpp \ -# $(ARDUINO_CORES_DIR)/USBCore.cpp \ - -# replaced with override_wiring.c and common/timer.c -# $(ARDUINO_CORES_DIR)/wiring.c \ - - - -# -# HID parser -# -SRC += $(USB_HID_DIR)/parser.cpp - -# replace arduino/CDC.cpp -SRC += $(USB_HID_DIR)/override_Serial.cpp - -# replace arduino/wiring.c -SRC += $(USB_HID_DIR)/override_wiring.c - -SRC += $(USB_HOST_SHIELD_SRC) -SRC += $(ARDUINO_CORES_SRC) - - -OPT_DEFS += -DARDUINO=101 -# Arduino USBCore needs USB_VID and USB_PID. -#OPT_DEFS += -DARDUINO=101 -DUSB_VID=0x2341 -DUSB_PID=0x8036 - - - -# -# Search Path -# -VPATH += $(TMK_DIR)/$(USB_HID_DIR) -VPATH += $(USB_HOST_SHIELD_DIR) - -# for #include "Arduino.h" -VPATH += $(ARDUINO_CORES_DIR) - -# for #include "pins_arduino.h" -VPATH += $(ARDUINO_DIR)/variants/leonardo - -# ad hoc workaround for compile problem on Windows: -# Windows doesn't know difference between common/print.h and arduino/Print.h. -# On Linux no problem. -# Change file name common/print.h to console.h ? -VPATH := $(TMK_DIR)/common $(VPATH) diff --git a/tmk_core/protocol/usb_hid/usb_hid.mk b/tmk_core/protocol/usb_hid/usb_hid.mk new file mode 100644 index 0000000000..c0c157c043 --- /dev/null +++ b/tmk_core/protocol/usb_hid/usb_hid.mk @@ -0,0 +1,73 @@ +USB_HID_DIR = protocol/usb_hid +USB_HOST_LIB_DIR = $(LIB_PATH)/usbhost + +# +# USB Host Shield +# +USB_HOST_SHIELD_DIR = $(USB_HOST_LIB_DIR)/USB_Host_Shield_2.0 +USB_HOST_SHIELD_SRC = \ + $(USB_HOST_SHIELD_DIR)/Usb.cpp \ + $(USB_HOST_SHIELD_DIR)/hid.cpp \ + $(USB_HOST_SHIELD_DIR)/usbhub.cpp \ + $(USB_HOST_SHIELD_DIR)/parsetools.cpp \ + $(USB_HOST_SHIELD_DIR)/message.cpp + + + +# +# Arduino +# +ARDUINO_DIR = $(USB_HOST_LIB_DIR)/arduino-1.0.1 +ARDUINO_CORES_DIR = $(ARDUINO_DIR)/cores/arduino +ARDUINO_CORES_SRC = \ + $(ARDUINO_CORES_DIR)/Print.cpp \ + $(ARDUINO_CORES_DIR)/Stream.cpp + +# replaced with override_Serial.c +# $(ARDUINO_CORES_DIR)/CDC.cpp \ +# $(ARDUINO_CORES_DIR)/HID.cpp \ +# $(ARDUINO_CORES_DIR)/USBCore.cpp \ + +# replaced with override_wiring.c and common/timer.c +# $(ARDUINO_CORES_DIR)/wiring.c \ + + + +# +# HID parser +# +SRC += $(USB_HID_DIR)/parser.cpp + +# replace arduino/CDC.cpp +SRC += $(USB_HID_DIR)/override_Serial.cpp + +# replace arduino/wiring.c +SRC += $(USB_HID_DIR)/override_wiring.c + +SRC += $(USB_HOST_SHIELD_SRC) +SRC += $(ARDUINO_CORES_SRC) + + +OPT_DEFS += -DARDUINO=101 +# Arduino USBCore needs USB_VID and USB_PID. +#OPT_DEFS += -DARDUINO=101 -DUSB_VID=0x2341 -DUSB_PID=0x8036 + + + +# +# Search Path +# +VPATH += $(TMK_DIR)/$(USB_HID_DIR) +VPATH += $(USB_HOST_SHIELD_DIR) + +# for #include "Arduino.h" +VPATH += $(ARDUINO_CORES_DIR) + +# for #include "pins_arduino.h" +VPATH += $(ARDUINO_DIR)/variants/leonardo + +# ad hoc workaround for compile problem on Windows: +# Windows doesn't know difference between common/print.h and arduino/Print.h. +# On Linux no problem. +# Change file name common/print.h to console.h ? +VPATH := $(TMK_DIR)/common $(VPATH) diff --git a/tmk_core/protocol/vusb.mk b/tmk_core/protocol/vusb.mk deleted file mode 100644 index 5572597e21..0000000000 --- a/tmk_core/protocol/vusb.mk +++ /dev/null @@ -1,17 +0,0 @@ -VUSB_DIR = protocol/vusb - -# Path to the V-USB library -VUSB_PATH = $(LIB_PATH)/vusb - -SRC += $(VUSB_DIR)/protocol.c \ - $(VUSB_DIR)/vusb.c \ - $(VUSB_DIR)/usb_util.c \ - $(VUSB_PATH)/usbdrv/usbdrv.c \ - $(VUSB_PATH)/usbdrv/usbdrvasm.S \ - $(VUSB_PATH)/usbdrv/oddebug.c - -# Search Path -VPATH += $(TMK_PATH)/$(VUSB_DIR) -VPATH += $(VUSB_PATH) - -OPT_DEFS += -DPROTOCOL_VUSB diff --git a/tmk_core/protocol/vusb/vusb.mk b/tmk_core/protocol/vusb/vusb.mk new file mode 100644 index 0000000000..5572597e21 --- /dev/null +++ b/tmk_core/protocol/vusb/vusb.mk @@ -0,0 +1,17 @@ +VUSB_DIR = protocol/vusb + +# Path to the V-USB library +VUSB_PATH = $(LIB_PATH)/vusb + +SRC += $(VUSB_DIR)/protocol.c \ + $(VUSB_DIR)/vusb.c \ + $(VUSB_DIR)/usb_util.c \ + $(VUSB_PATH)/usbdrv/usbdrv.c \ + $(VUSB_PATH)/usbdrv/usbdrvasm.S \ + $(VUSB_PATH)/usbdrv/oddebug.c + +# Search Path +VPATH += $(TMK_PATH)/$(VUSB_DIR) +VPATH += $(VUSB_PATH) + +OPT_DEFS += -DPROTOCOL_VUSB -- cgit v1.2.3 From 3ebdb1258bce5cd486ca5e76ba56084cc1a0a1ac Mon Sep 17 00:00:00 2001 From: Purdea Andrei Date: Mon, 26 Jun 2023 11:36:32 +0300 Subject: Chibios USB: Take into account if host wants remote wakeup or not (#21287) According to the USB 2.0 spec, remote wakeup should be disabled by default, and should only be enabled if the host explicitly requests it. The chibios driver code already takes care of storing this information, and returning it on GET_STATUS requests. However our application code has been ignoring it so far. This is a USB compliance issue, but also a bug that causes trouble in some cases: On RP2040 targets this has been causing problems if a key is held down while the keyboard is plugged in. The keyboard would fail to enumerate until all keys are released. With this change that behavior is fixed. Note that for LUFA targets this is already done correctly. --- tmk_core/protocol/chibios/chibios.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 10a976608a..52aea241ff 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -49,6 +49,8 @@ #include "suspend.h" #include "wait.h" +#define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED (2U) + /* ------------------------- * TMK host driver defs * ------------------------- @@ -187,7 +189,7 @@ void protocol_pre_task(void) { /* Do this in the suspended state */ suspend_power_down(); // on AVR this deep sleeps for 15ms /* Remote wakeup */ - if (suspend_wakeup_condition()) { + if ((USB_DRIVER.status & USB_GETSTATUS_REMOTE_WAKEUP_ENABLED) && suspend_wakeup_condition()) { usbWakeupHost(&USB_DRIVER); restart_usb_driver(&USB_DRIVER); } -- cgit v1.2.3 From a87c74ebe14aee0d4a82f5ff8a0170afb8105598 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Mon, 26 Jun 2023 23:55:52 +0200 Subject: [Bug] Fix non-functional S3 wakeup / resume from suspense (#19780) * Update ChibiOS-Contrib for USB suspend fixes * Remove S3 wakup workaround ChibiOS OTGv1 driver has a remote wakeup bug that prevents the device to resume it's operation. 02516cbc24647f522eee975e69cc0c8a925470eb introduced a hotfix that forcefully restarted the usb driver as a workaround. This workaround broke multiple boards which do not use this driver / peripheral. With the update of ChibiOS this hotfix is now obsolete. * Remove restart_usb_driver overrides they are no longer necessary as the workaround is not needed anymore for stm32f4 * Remove unused RP_USB_USE_SOF_INTR defines The SOF interrupt is enabled dynamically by the RP2040 usb driver --- tmk_core/protocol/chibios/chibios.c | 22 +++++++++------------- tmk_core/protocol/lufa/lufa.c | 2 +- 2 files changed, 10 insertions(+), 14 deletions(-) (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 52aea241ff..1eebdaf6c3 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -180,28 +180,24 @@ void protocol_post_init(void) { } void protocol_pre_task(void) { - usb_event_queue_task(); - #if !defined(NO_USB_STARTUP_CHECK) if (USB_DRIVER.state == USB_SUSPENDED) { - print("[s]"); + dprintln("suspending keyboard"); while (USB_DRIVER.state == USB_SUSPENDED) { - /* Do this in the suspended state */ - suspend_power_down(); // on AVR this deep sleeps for 15ms - /* Remote wakeup */ + suspend_power_down(); if ((USB_DRIVER.status & USB_GETSTATUS_REMOTE_WAKEUP_ENABLED) && suspend_wakeup_condition()) { + /* issue a remote wakeup event to the host which should resume + * the bus and get our keyboard out of suspension. */ usbWakeupHost(&USB_DRIVER); - restart_usb_driver(&USB_DRIVER); } } - /* Woken up */ - // variables has been already cleared by the wakeup hook - send_keyboard_report(); -# ifdef MOUSEKEY_ENABLE - mousekey_send(); -# endif /* MOUSEKEY_ENABLE */ + /* after a successful wakeup a USB_EVENT_WAKEUP is signaled to QMK by + * ChibiOS, which triggers a wakeup callback that restores the state of + * the keyboard. Therefore we do nothing here. */ } #endif + + usb_event_queue_task(); } void protocol_post_task(void) { diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 20bfc8fb3c..d1cda24227 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -858,7 +858,7 @@ void protocol_post_init(void) { void protocol_pre_task(void) { #if !defined(NO_USB_STARTUP_CHECK) if (USB_DeviceState == DEVICE_STATE_Suspended) { - print("[s]"); + dprintln("suspending keyboard"); while (USB_DeviceState == DEVICE_STATE_Suspended) { suspend_power_down(); if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { -- cgit v1.2.3 From 5542f5ede1356df387dfb10587f2d74e40fa62a8 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 27 Jun 2023 09:15:33 +1000 Subject: Get rid of `USB_LED_KANA` and `USB_LED_COMPOSE` (#21366) --- tmk_core/protocol/arm_atsam/md_rgb_matrix.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/arm_atsam/md_rgb_matrix.c b/tmk_core/protocol/arm_atsam/md_rgb_matrix.c index 52fe86d297..c7d2a7dc8e 100644 --- a/tmk_core/protocol/arm_atsam/md_rgb_matrix.c +++ b/tmk_core/protocol/arm_atsam/md_rgb_matrix.c @@ -347,24 +347,24 @@ static void flush(void) { } void md_rgb_matrix_indicators_advanced(uint8_t led_min, uint8_t led_max) { - uint8_t kbled = keyboard_leds(); - if (kbled && rgb_matrix_config.enable) { + led_t led_state = host_keyboard_led_state(); + if (led_state.raw && rgb_matrix_config.enable) { for (uint8_t i = led_min; i < led_max; i++) { if ( # if USB_LED_NUM_LOCK_SCANCODE != 255 - (led_map[i].scan == USB_LED_NUM_LOCK_SCANCODE && (kbled & (1 << USB_LED_NUM_LOCK))) || + (led_map[i].scan == USB_LED_NUM_LOCK_SCANCODE && led_state.num_lock) || # endif // NUM LOCK # if USB_LED_CAPS_LOCK_SCANCODE != 255 - (led_map[i].scan == USB_LED_CAPS_LOCK_SCANCODE && (kbled & (1 << USB_LED_CAPS_LOCK))) || + (led_map[i].scan == USB_LED_CAPS_LOCK_SCANCODE && led_state.caps_lock) || # endif // CAPS LOCK # if USB_LED_SCROLL_LOCK_SCANCODE != 255 - (led_map[i].scan == USB_LED_SCROLL_LOCK_SCANCODE && (kbled & (1 << USB_LED_SCROLL_LOCK))) || + (led_map[i].scan == USB_LED_SCROLL_LOCK_SCANCODE && led_state.scroll_lock) || # endif // SCROLL LOCK # if USB_LED_COMPOSE_SCANCODE != 255 - (led_map[i].scan == USB_LED_COMPOSE_SCANCODE && (kbled & (1 << USB_LED_COMPOSE))) || + (led_map[i].scan == USB_LED_COMPOSE_SCANCODE && led_state.compose) || # endif // COMPOSE # if USB_LED_KANA_SCANCODE != 255 - (led_map[i].scan == USB_LED_KANA_SCANCODE && (kbled & (1 << USB_LED_KANA))) || + (led_map[i].scan == USB_LED_KANA_SCANCODE && led_state.kana) || # endif // KANA (0)) { if (rgb_matrix_get_flags() & LED_FLAG_INDICATOR) { -- cgit v1.2.3 From 30de598650f368e215ad5f82c7b9de52eceb539e Mon Sep 17 00:00:00 2001 From: Ryan Date: Fri, 7 Jul 2023 21:24:07 +1000 Subject: tmk_core: remove direct `quantum.h` includes (#21465) --- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 1 - tmk_core/protocol/arm_atsam/md_rgb_matrix.c | 1 + tmk_core/protocol/arm_atsam/md_rgb_matrix.h | 8 ++------ tmk_core/protocol/arm_atsam/md_rgb_matrix_programs.c | 1 + tmk_core/protocol/lufa/lufa.c | 2 +- tmk_core/protocol/usb_util.c | 6 +++++- tmk_core/protocol/usb_util.h | 3 +++ 7 files changed, 13 insertions(+), 9 deletions(-) (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index 1ccfbfb54a..5bed9e0cf4 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -23,7 +23,6 @@ along with this program. If not, see . #include "host_driver.h" #include "keycode_config.h" #include -#include "quantum.h" // From protocol directory #include "arm_atsam_protocol.h" diff --git a/tmk_core/protocol/arm_atsam/md_rgb_matrix.c b/tmk_core/protocol/arm_atsam/md_rgb_matrix.c index c7d2a7dc8e..6069d1e609 100644 --- a/tmk_core/protocol/arm_atsam/md_rgb_matrix.c +++ b/tmk_core/protocol/arm_atsam/md_rgb_matrix.c @@ -23,6 +23,7 @@ along with this program. If not, see . # include "arm_atsam_protocol.h" # include "led.h" # include "rgb_matrix.h" +# include "eeprom.h" # include # include diff --git a/tmk_core/protocol/arm_atsam/md_rgb_matrix.h b/tmk_core/protocol/arm_atsam/md_rgb_matrix.h index f27da028a0..bb3312e8e7 100644 --- a/tmk_core/protocol/arm_atsam/md_rgb_matrix.h +++ b/tmk_core/protocol/arm_atsam/md_rgb_matrix.h @@ -15,11 +15,9 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef _LED_MATRIX_H_ -#define _LED_MATRIX_H_ +#pragma once -#include "quantum.h" -#include "eeprom.h" +#include // From keyboard #include "config_led.h" @@ -200,5 +198,3 @@ void md_led_changed(void); #else extern uint8_t gcr_desired; #endif // USE_MASSDROP_CONFIGURATOR - -#endif //_LED_MATRIX_H_ diff --git a/tmk_core/protocol/arm_atsam/md_rgb_matrix_programs.c b/tmk_core/protocol/arm_atsam/md_rgb_matrix_programs.c index 58fc4efd9c..476b605297 100644 --- a/tmk_core/protocol/arm_atsam/md_rgb_matrix_programs.c +++ b/tmk_core/protocol/arm_atsam/md_rgb_matrix_programs.c @@ -19,6 +19,7 @@ along with this program. If not, see . # ifdef USE_MASSDROP_CONFIGURATOR # include "md_rgb_matrix.h" +# include "util.h" // Teal <-> Salmon led_setup_t leds_teal_salmon[] = { diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index d1cda24227..f04ca79a0c 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -48,10 +48,10 @@ # include "sleep_led.h" #endif #include "suspend.h" +#include "wait.h" #include "usb_descriptor.h" #include "lufa.h" -#include "quantum.h" #include "usb_device_state.h" #include diff --git a/tmk_core/protocol/usb_util.c b/tmk_core/protocol/usb_util.c index 49aadedc2a..3b3be4a767 100644 --- a/tmk_core/protocol/usb_util.c +++ b/tmk_core/protocol/usb_util.c @@ -13,13 +13,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "quantum.h" + #include "usb_util.h" +#include "gpio.h" +#include "wait.h" __attribute__((weak)) void usb_disconnect(void) {} + __attribute__((weak)) bool usb_connected_state(void) { return true; } + __attribute__((weak)) bool usb_vbus_state(void) { #ifdef USB_VBUS_PIN setPinInput(USB_VBUS_PIN); diff --git a/tmk_core/protocol/usb_util.h b/tmk_core/protocol/usb_util.h index 13db9fbfbd..6f0e406378 100644 --- a/tmk_core/protocol/usb_util.h +++ b/tmk_core/protocol/usb_util.h @@ -13,10 +13,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #pragma once #include void usb_disconnect(void); + bool usb_connected_state(void); + bool usb_vbus_state(void); -- cgit v1.2.3 From da2d2f947d5c30aebea17f414fb22ad50fe5410b Mon Sep 17 00:00:00 2001 From: Ryan Date: Sun, 16 Jul 2023 23:42:56 +1000 Subject: quantum: remove direct `quantum.h` includes (#21507) --- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 1 + tmk_core/protocol/arm_atsam/md_rgb_matrix.c | 1 + tmk_core/protocol/arm_atsam/spi_master.h | 2 ++ 3 files changed, 4 insertions(+) (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index 5bed9e0cf4..30817c17b6 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -21,6 +21,7 @@ along with this program. If not, see . #include "report.h" #include "host.h" #include "host_driver.h" +#include "suspend.h" #include "keycode_config.h" #include diff --git a/tmk_core/protocol/arm_atsam/md_rgb_matrix.c b/tmk_core/protocol/arm_atsam/md_rgb_matrix.c index 6069d1e609..0f316b256c 100644 --- a/tmk_core/protocol/arm_atsam/md_rgb_matrix.c +++ b/tmk_core/protocol/arm_atsam/md_rgb_matrix.c @@ -24,6 +24,7 @@ along with this program. If not, see . # include "led.h" # include "rgb_matrix.h" # include "eeprom.h" +# include "host.h" # include # include diff --git a/tmk_core/protocol/arm_atsam/spi_master.h b/tmk_core/protocol/arm_atsam/spi_master.h index 26c55128be..80678a5707 100644 --- a/tmk_core/protocol/arm_atsam/spi_master.h +++ b/tmk_core/protocol/arm_atsam/spi_master.h @@ -16,7 +16,9 @@ #pragma once +#include #include +#include "gpio.h" typedef int16_t spi_status_t; -- cgit v1.2.3 From 32174abcfae373eac2659dd9de255b3c1792d238 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Fri, 28 Jul 2023 02:05:01 +0200 Subject: Update keyboard report descriptor for USB compliance (#21626) Running the "HID Tests" suite of the USB 3 Command Verifier (USB3CV) tool resulted in the following error: (HID: 3.2.61) The report descriptor returned in response to a GetDescriptor(Report) must be compliant with the HID specification. Byte Number: 37h ( 55d) Data Field: 91 02 Mnemonic: Output Value: (Variable) Errors: Error: LOGICAL MAX MUST be bounded by Report Size The error stems from the fact that logical minimum and maximum are global items, which means that the next item in a report descriptor inherits the value from the previously set value. In this case the status leds item inherited the logical minimum (=0) and maximum (=255) from the keycodes item. As the status leds set a report size of 1 bit, wich can only hold a boolean, it becomes clear that this range would never fit. The fix is straightforward, we just define a appropriate logical maximum (=1), the mismatch is solved and our keyboard now passes the compliance tests. Defining the logical minimum is redundant in this case but is kept to form a logical block. --- tmk_core/protocol/usb_descriptor.c | 2 ++ tmk_core/protocol/vusb/vusb.c | 2 ++ 2 files changed, 4 insertions(+) (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index 5ab9e3ff4f..e215c90900 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -93,6 +93,8 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = { HID_RI_USAGE_PAGE(8, 0x08), // LED HID_RI_USAGE_MINIMUM(8, 0x01), // Num Lock HID_RI_USAGE_MAXIMUM(8, 0x05), // Kana + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), HID_RI_REPORT_COUNT(8, 0x05), HID_RI_REPORT_SIZE(8, 0x01), HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index b3eeff9e01..d74f375f66 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -435,6 +435,8 @@ const PROGMEM uchar keyboard_hid_report[] = { 0x05, 0x08, // Usage Page (LED) 0x19, 0x01, // Usage Minimum (Num Lock) 0x29, 0x05, // Usage Maximum (Kana) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) 0x95, 0x05, // Report Count (5) 0x75, 0x01, // Report Size (1) 0x91, 0x02, // Output (Data, Variable, Absolute) -- cgit v1.2.3 From b2d068d1aa95265f16670cbf5a68da745602fc12 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Wed, 2 Aug 2023 13:47:25 +0200 Subject: Fix mouse-key spamming empty reports (#21663) Problem: `mousekey_task` spams empty hid reports with when a mouse key is pressed, causing resource exhaustion in the USB mouse endpoint. Cause: The check whether or not to send a new mouse report would always evaluate to true if a mouse key is pressed: 1. `mouse_report` has non-zero fields and `tmpmr` is a copy of this fields. 2. `mouse_report` is set to zero, `tmpmr` has now non-zero fields. 3. `has_mouse_report_changed` compares the two and evaluates to true 4. a mouse report is sent. Fix: The check condition of `has_mouse_report_changed` will evaluate any empty record as unchanged, as mouse report data is relative and doesn't need to return to zero. An empty report will still be send by `register_mouse` on release of all mouse buttons. --- tmk_core/protocol/report.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/report.c b/tmk_core/protocol/report.c index 5755098c60..1ba3be4604 100644 --- a/tmk_core/protocol/report.c +++ b/tmk_core/protocol/report.c @@ -281,13 +281,21 @@ void clear_keys_from_report(report_keyboard_t* keyboard_report) { #ifdef MOUSE_ENABLE /** - * @brief Compares 2 mouse reports for difference and returns result + * @brief Compares 2 mouse reports for difference and returns result. Empty + * reports always evaluate as unchanged. * * @param[in] new_report report_mouse_t * @param[in] old_report report_mouse_t * @return bool result */ __attribute__((weak)) bool has_mouse_report_changed(report_mouse_t* new_report, report_mouse_t* old_report) { - return memcmp(new_report, old_report, sizeof(report_mouse_t)); + // memcmp doesn't work here because of the `report_id` field when using + // shared mouse endpoint + bool changed = ((new_report->buttons != old_report->buttons) || +# ifdef MOUSE_EXTENDED_REPORT + (new_report->boot_x != 0 && new_report->boot_x != old_report->boot_x) || (new_report->boot_y != 0 && new_report->boot_y != old_report->boot_y) || +# endif + (new_report->x != 0 && new_report->x != old_report->x) || (new_report->y != 0 && new_report->y != old_report->y) || (new_report->h != 0 && new_report->h != old_report->h) || (new_report->v != 0 && new_report->v != old_report->v)); + return changed; } #endif -- cgit v1.2.3 From e8e989fd7ad7c10e725e50ae8b0a4426e09f7f30 Mon Sep 17 00:00:00 2001 From: Stefan Kerkmann Date: Thu, 3 Aug 2023 00:42:57 +0200 Subject: [Bug] Restore usb suspend wakeup delay (#21676) * Respect USB_SUSPEND_WAKEUP_DELAY on wakeup This delay wasn't honored after removing `restart_usb_driver` from the suspend and wakeup handling. It is now re-introduced in the appropriate spot, namely after issuing a remote wakeup to a sleeping host. * Remove old, unused and commented testing code --- tmk_core/protocol/chibios/chibios.c | 31 ++++++++----------------------- tmk_core/protocol/chibios/usb_main.c | 27 ++++++--------------------- 2 files changed, 14 insertions(+), 44 deletions(-) (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 1eebdaf6c3..ac39606179 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -80,26 +80,6 @@ void console_task(void); void midi_ep_task(void); #endif -/* TESTING - * Amber LED blinker thread, times are in milliseconds. - */ -/* set this variable to non-zero anywhere to blink once */ -// static THD_WORKING_AREA(waThread1, 128); -// static THD_FUNCTION(Thread1, arg) { - -// (void)arg; -// chRegSetThreadName("blinker"); -// while (true) { -// systime_t time; - -// time = USB_DRIVER.state == USB_ACTIVE ? 250 : 500; -// palClearLine(LINE_CAPS_LOCK); -// chSysPolledDelayX(MS2RTC(STM32_HCLK, time)); -// palSetLine(LINE_CAPS_LOCK); -// chSysPolledDelayX(MS2RTC(STM32_HCLK, time)); -// } -// } - /* Early initialisation */ __attribute__((weak)) void early_hardware_init_pre(void) { @@ -135,9 +115,6 @@ void boardInit(void) { void protocol_setup(void) { usb_device_state_init(); - - // TESTING - // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); } static host_driver_t *driver = NULL; @@ -189,6 +166,14 @@ void protocol_pre_task(void) { /* issue a remote wakeup event to the host which should resume * the bus and get our keyboard out of suspension. */ usbWakeupHost(&USB_DRIVER); +# if USB_SUSPEND_WAKEUP_DELAY > 0 + /* Some hubs, kvm switches, and monitors do weird things, with + * USB device state bouncing around wildly on wakeup, yielding + * race conditions that can corrupt the keyboard state. + * + * Pause for a while to let things settle... */ + wait_ms(USB_SUSPEND_WAKEUP_DELAY); +# endif } } /* after a successful wakeup a USB_EVENT_WAKEUP is signaled to QMK by diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index b14ca30c1a..e1327f065c 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -784,34 +784,19 @@ void init_usb_driver(USBDriver *usbp) { #endif } - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(usbp); - usbStop(usbp); - wait_ms(50); - usbStart(usbp, &usbcfg); - usbConnectBus(usbp); + restart_usb_driver(usbp); chVTObjectInit(&keyboard_idle_timer); } +/** @brief Restarts the USB driver and emulates a physical bus reconnection. + * Note that the bus reconnection is MCU and even board specific, so it might + * be a NOP on some hardware platforms. + */ __attribute__((weak)) void restart_usb_driver(USBDriver *usbp) { usbDisconnectBus(usbp); usbStop(usbp); - -#if USB_SUSPEND_WAKEUP_DELAY > 0 - // Some hubs, kvm switches, and monitors do - // weird things, with USB device state bouncing - // around wildly on wakeup, yielding race - // conditions that can corrupt the keyboard state. - // - // Pause for a while to let things settle... - wait_ms(USB_SUSPEND_WAKEUP_DELAY); -#endif - + wait_ms(50); usbStart(usbp, &usbcfg); usbConnectBus(usbp); } -- cgit v1.2.3 From 25331be3164ca609ebecbfcc727ce904e3676594 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 26 Aug 2023 19:52:12 -0700 Subject: Revert changes to ChibiOS Suspend Code (#21830) * Partially revert #19780 * Finish * Get teensy 3.5/3.6 board files too * fix lint issue * Revert "[Bug] Restore usb suspend wakeup delay (#21676)" This reverts commit e8e989fd7ad7c10e725e50ae8b0a4426e09f7f30. * Apply suggestions from code review Co-authored-by: Joel Challis --------- Co-authored-by: Joel Challis --- tmk_core/protocol/chibios/chibios.c | 51 +++++++++++++++++++++++++----------- tmk_core/protocol/chibios/usb_main.c | 27 ++++++++++++++----- 2 files changed, 56 insertions(+), 22 deletions(-) (limited to 'tmk_core/protocol') diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index ac39606179..4d97f1cd82 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -80,6 +80,26 @@ void console_task(void); void midi_ep_task(void); #endif +/* TESTING + * Amber LED blinker thread, times are in milliseconds. + */ +/* set this variable to non-zero anywhere to blink once */ +// static THD_WORKING_AREA(waThread1, 128); +// static THD_FUNCTION(Thread1, arg) { + +// (void)arg; +// chRegSetThreadName("blinker"); +// while (true) { +// systime_t time; + +// time = USB_DRIVER.state == USB_ACTIVE ? 250 : 500; +// palClearLine(LINE_CAPS_LOCK); +// chSysPolledDelayX(MS2RTC(STM32_HCLK, time)); +// palSetLine(LINE_CAPS_LOCK); +// chSysPolledDelayX(MS2RTC(STM32_HCLK, time)); +// } +// } + /* Early initialisation */ __attribute__((weak)) void early_hardware_init_pre(void) { @@ -115,6 +135,9 @@ void boardInit(void) { void protocol_setup(void) { usb_device_state_init(); + + // TESTING + // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); } static host_driver_t *driver = NULL; @@ -157,32 +180,28 @@ void protocol_post_init(void) { } void protocol_pre_task(void) { + usb_event_queue_task(); + #if !defined(NO_USB_STARTUP_CHECK) if (USB_DRIVER.state == USB_SUSPENDED) { dprintln("suspending keyboard"); while (USB_DRIVER.state == USB_SUSPENDED) { - suspend_power_down(); + /* Do this in the suspended state */ + suspend_power_down(); // on AVR this deep sleeps for 15ms + /* Remote wakeup */ if ((USB_DRIVER.status & USB_GETSTATUS_REMOTE_WAKEUP_ENABLED) && suspend_wakeup_condition()) { - /* issue a remote wakeup event to the host which should resume - * the bus and get our keyboard out of suspension. */ usbWakeupHost(&USB_DRIVER); -# if USB_SUSPEND_WAKEUP_DELAY > 0 - /* Some hubs, kvm switches, and monitors do weird things, with - * USB device state bouncing around wildly on wakeup, yielding - * race conditions that can corrupt the keyboard state. - * - * Pause for a while to let things settle... */ - wait_ms(USB_SUSPEND_WAKEUP_DELAY); -# endif + restart_usb_driver(&USB_DRIVER); } } - /* after a successful wakeup a USB_EVENT_WAKEUP is signaled to QMK by - * ChibiOS, which triggers a wakeup callback that restores the state of - * the keyboard. Therefore we do nothing here. */ + /* Woken up */ + // variables has been already cleared by the wakeup hook + send_keyboard_report(); +# ifdef MOUSEKEY_ENABLE + mousekey_send(); +# endif /* MOUSEKEY_ENABLE */ } #endif - - usb_event_queue_task(); } void protocol_post_task(void) { diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index e1327f065c..b14ca30c1a 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -784,19 +784,34 @@ void init_usb_driver(USBDriver *usbp) { #endif } - restart_usb_driver(usbp); + /* + * Activates the USB driver and then the USB bus pull-up on D+. + * Note, a delay is inserted in order to not have to disconnect the cable + * after a reset. + */ + usbDisconnectBus(usbp); + usbStop(usbp); + wait_ms(50); + usbStart(usbp, &usbcfg); + usbConnectBus(usbp); chVTObjectInit(&keyboard_idle_timer); } -/** @brief Restarts the USB driver and emulates a physical bus reconnection. - * Note that the bus reconnection is MCU and even board specific, so it might - * be a NOP on some hardware platforms. - */ __attribute__((weak)) void restart_usb_driver(USBDriver *usbp) { usbDisconnectBus(usbp); usbStop(usbp); - wait_ms(50); + +#if USB_SUSPEND_WAKEUP_DELAY > 0 + // Some hubs, kvm switches, and monitors do + // weird things, with USB device state bouncing + // around wildly on wakeup, yielding race + // conditions that can corrupt the keyboard state. + // + // Pause for a while to let things settle... + wait_ms(USB_SUSPEND_WAKEUP_DELAY); +#endif + usbStart(usbp, &usbcfg); usbConnectBus(usbp); } -- cgit v1.2.3