diff options
author | Joshua Diamond <josh@windowoffire.com> | 2021-02-01 19:12:41 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-02 11:12:41 +1100 |
commit | 9a4618b05b9f1093908c2153c719c5eb5d4a79ee (patch) | |
tree | 7487e6226c72d2c3d09749d60ce8df18a2c40d59 /tmk_core/protocol/chibios | |
parent | 85079d6a2ecfd55d0d33ce32cd1ad137f1c1df55 (diff) | |
download | qmk_firmware-9a4618b05b9f1093908c2153c719c5eb5d4a79ee.tar.gz qmk_firmware-9a4618b05b9f1093908c2153c719c5eb5d4a79ee.zip |
Address wake from sleep instability (#11450)
* resolve race condition between suspend and wake in LUFA
* avoid multiple calls to suspend_power_down() / suspend_wakeup_init()
* Remove duplicate suspend_power_down_kb() call
* pause on wakeup to wait for USB state to settle
* need the repeated suspend_power_down() (that's where the sleep is)
* more efficient implementation
* fine tune the pause after sending wakeup
* speculative chibios version of pause-after-wake
* make wakeup delay configurable, and adjust value
* better location for wakeup delay
Diffstat (limited to 'tmk_core/protocol/chibios')
-rw-r--r-- | tmk_core/protocol/chibios/usb_main.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index cb7aeb23b2..13b1e34d28 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -708,6 +708,17 @@ void init_usb_driver(USBDriver *usbp) { void restart_usb_driver(USBDriver *usbp) { usbStop(usbp); usbDisconnectBus(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 + usbStart(usbp, &usbcfg); usbConnectBus(usbp); } |