From 385ed1a2911b114466eeae10ea2664692cf175a8 Mon Sep 17 00:00:00 2001 From: Kieran Levin Date: Tue, 14 Nov 2023 22:39:49 -0600 Subject: [PATCH] fix selective suspend on RP2040 the tmk_core chibios protocol_pre_task does not process any usb events when the host is in suspend. I think there is a race condition where the usb_event_queue_task will not be processed depending on when usb goes to sleep. so we may fall into the while (USB_DRIVER.state == USB_SUSPENDED) { which comes directly from the hardware interrupt. and never process pending events in usb_event_queue_task(); Signed-off-by: Kieran Levin --- platforms/chibios/suspend.c | 2 +- tmk_core/protocol/chibios/chibios.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/platforms/chibios/suspend.c b/platforms/chibios/suspend.c index a937ccf059..4b9b79f9d4 100644 --- a/platforms/chibios/suspend.c +++ b/platforms/chibios/suspend.c @@ -22,7 +22,7 @@ void suspend_power_down(void) { // on AVR, this enables the watchdog for 15ms (max), and goes to // SLEEP_MODE_PWR_DOWN - wait_ms(17); + wait_ms(5); } /** \brief suspend wakeup condition diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 1eebdaf6c3..fc73da48f0 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -190,6 +190,7 @@ void protocol_pre_task(void) { * the bus and get our keyboard out of suspension. */ usbWakeupHost(&USB_DRIVER); } + usb_event_queue_task(); } /* after a successful wakeup a USB_EVENT_WAKEUP is signaled to QMK by * ChibiOS, which triggers a wakeup callback that restores the state of