mirror of
https://github.com/qmk/qmk_firmware
synced 2024-11-10 05:59:44 +00:00
[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. 02516cbc24
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
This commit is contained in:
parent
4aa765b72e
commit
a87c74ebe1
14 changed files with 14 additions and 47 deletions
|
@ -1 +1 @@
|
|||
Subproject commit a224be155ae18d38deccf33a6c1d259b9a5ad8d3
|
||||
Subproject commit 5d2d95c520a13d2c3e42343f51b18822d63781d6
|
|
@ -106,7 +106,6 @@
|
|||
#define RP_USB_USE_USBD0 TRUE
|
||||
#define RP_USB_FORCE_VBUS_DETECT TRUE
|
||||
#define RP_USE_EXTERNAL_VBUS_DETECT FALSE
|
||||
#define RP_USB_USE_SOF_INTR TRUE
|
||||
#define RP_USB_USE_ERROR_DATA_SEQ_INTR FALSE
|
||||
|
||||
#endif /* MCUCONF_H */
|
||||
|
|
|
@ -106,7 +106,6 @@
|
|||
#define RP_USB_USE_USBD0 TRUE
|
||||
#define RP_USB_FORCE_VBUS_DETECT TRUE
|
||||
#define RP_USE_EXTERNAL_VBUS_DETECT FALSE
|
||||
#define RP_USB_USE_SOF_INTR TRUE
|
||||
#define RP_USB_USE_ERROR_DATA_SEQ_INTR FALSE
|
||||
|
||||
#endif /* MCUCONF_H */
|
||||
|
|
|
@ -80,7 +80,3 @@ void __early_init(void) {
|
|||
void boardInit(void) {
|
||||
|
||||
}
|
||||
|
||||
void restart_usb_driver(USBDriver *usbp) {
|
||||
// Do nothing. Restarting the USB driver on these boards breaks it.
|
||||
}
|
||||
|
|
|
@ -80,7 +80,3 @@ void __early_init(void) {
|
|||
void boardInit(void) {
|
||||
|
||||
}
|
||||
|
||||
void restart_usb_driver(USBDriver *usbp) {
|
||||
// Do nothing. Restarting the USB driver on these boards breaks it.
|
||||
}
|
||||
|
|
|
@ -144,8 +144,3 @@ void __early_init(void) {
|
|||
* @todo Add your board-specific code, if any.
|
||||
*/
|
||||
void boardInit(void) {}
|
||||
|
||||
|
||||
void restart_usb_driver(USBDriver *usbp) {
|
||||
// Do nothing. Restarting the USB driver on these boards breaks it.
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
include $(CHIBIOS_CONTRIB)/os/hal/boards/PJRC_TEENSY_3_5/board.mk
|
||||
|
||||
# List of all the board related files.
|
||||
BOARDSRC += $(BOARD_PATH)/board/extra.c
|
||||
BOARDSRC +=
|
||||
|
||||
# Required include directories
|
||||
BOARDINC += $(BOARD_PATH)/board
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
#include <hal.h>
|
||||
|
||||
void restart_usb_driver(USBDriver *usbp) {
|
||||
// Do nothing. Restarting the USB driver on the Teensy 3.6 breaks it,
|
||||
// resulting in a keyboard which can wake up a PC from Suspend-to-RAM, but
|
||||
// does not actually produce any keypresses until you un-plug and re-plug.
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
include $(CHIBIOS_CONTRIB)/os/hal/boards/PJRC_TEENSY_3_6/board.mk
|
||||
|
||||
# List of all the board related files.
|
||||
BOARDSRC += $(BOARD_PATH)/board/extra.c
|
||||
BOARDSRC +=
|
||||
|
||||
# Required include directories
|
||||
BOARDINC += $(BOARD_PATH)/board
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
#include <hal.h>
|
||||
|
||||
void restart_usb_driver(USBDriver *usbp) {
|
||||
// Do nothing. Restarting the USB driver on the Teensy 3.6 breaks it,
|
||||
// resulting in a keyboard which can wake up a PC from Suspend-to-RAM, but
|
||||
// does not actually produce any keypresses until you un-plug and re-plug.
|
||||
}
|
|
@ -106,7 +106,6 @@
|
|||
#define RP_USB_USE_USBD0 TRUE
|
||||
#define RP_USB_FORCE_VBUS_DETECT TRUE
|
||||
#define RP_USE_EXTERNAL_VBUS_DETECT FALSE
|
||||
#define RP_USB_USE_SOF_INTR TRUE
|
||||
#define RP_USB_USE_ERROR_DATA_SEQ_INTR FALSE
|
||||
|
||||
#endif /* MCUCONF_H */
|
||||
|
|
|
@ -42,6 +42,7 @@ void suspend_wakeup_init(void) {
|
|||
clear_keys();
|
||||
#ifdef MOUSEKEY_ENABLE
|
||||
mousekey_clear();
|
||||
mousekey_send();
|
||||
#endif /* MOUSEKEY_ENABLE */
|
||||
#ifdef PROGRAMMABLE_BUTTON_ENABLE
|
||||
programmable_button_clear();
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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()) {
|
||||
|
|
Loading…
Reference in a new issue