[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
This commit is contained in:
Stefan Kerkmann 2023-08-03 00:42:57 +02:00 committed by GitHub
parent d232f60c01
commit e8e989fd7a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 44 deletions

View File

@ -80,26 +80,6 @@ void console_task(void);
void midi_ep_task(void); void midi_ep_task(void);
#endif #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 /* Early initialisation
*/ */
__attribute__((weak)) void early_hardware_init_pre(void) { __attribute__((weak)) void early_hardware_init_pre(void) {
@ -135,9 +115,6 @@ void boardInit(void) {
void protocol_setup(void) { void protocol_setup(void) {
usb_device_state_init(); usb_device_state_init();
// TESTING
// chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);
} }
static host_driver_t *driver = 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 /* issue a remote wakeup event to the host which should resume
* the bus and get our keyboard out of suspension. */ * the bus and get our keyboard out of suspension. */
usbWakeupHost(&USB_DRIVER); 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 /* after a successful wakeup a USB_EVENT_WAKEUP is signaled to QMK by

View File

@ -784,34 +784,19 @@ void init_usb_driver(USBDriver *usbp) {
#endif #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); 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) { __attribute__((weak)) void restart_usb_driver(USBDriver *usbp) {
usbDisconnectBus(usbp); usbDisconnectBus(usbp);
usbStop(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); usbStart(usbp, &usbcfg);
usbConnectBus(usbp); usbConnectBus(usbp);
} }