forked from mirrors/qmk_userspace
		
	[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
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_USE_USBD0                    TRUE
 | 
				
			||||||
#define RP_USB_FORCE_VBUS_DETECT            TRUE
 | 
					#define RP_USB_FORCE_VBUS_DETECT            TRUE
 | 
				
			||||||
#define RP_USE_EXTERNAL_VBUS_DETECT         FALSE
 | 
					#define RP_USE_EXTERNAL_VBUS_DETECT         FALSE
 | 
				
			||||||
#define RP_USB_USE_SOF_INTR                 TRUE
 | 
					 | 
				
			||||||
#define RP_USB_USE_ERROR_DATA_SEQ_INTR      FALSE
 | 
					#define RP_USB_USE_ERROR_DATA_SEQ_INTR      FALSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* MCUCONF_H */
 | 
					#endif /* MCUCONF_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -106,7 +106,6 @@
 | 
				
			||||||
#define RP_USB_USE_USBD0                    TRUE
 | 
					#define RP_USB_USE_USBD0                    TRUE
 | 
				
			||||||
#define RP_USB_FORCE_VBUS_DETECT            TRUE
 | 
					#define RP_USB_FORCE_VBUS_DETECT            TRUE
 | 
				
			||||||
#define RP_USE_EXTERNAL_VBUS_DETECT         FALSE
 | 
					#define RP_USE_EXTERNAL_VBUS_DETECT         FALSE
 | 
				
			||||||
#define RP_USB_USE_SOF_INTR                 TRUE
 | 
					 | 
				
			||||||
#define RP_USB_USE_ERROR_DATA_SEQ_INTR      FALSE
 | 
					#define RP_USB_USE_ERROR_DATA_SEQ_INTR      FALSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* MCUCONF_H */
 | 
					#endif /* MCUCONF_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,7 +80,3 @@ void __early_init(void) {
 | 
				
			||||||
void boardInit(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 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.
 | 
					 * @todo    Add your board-specific code, if any.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void boardInit(void) {}
 | 
					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
 | 
					include $(CHIBIOS_CONTRIB)/os/hal/boards/PJRC_TEENSY_3_5/board.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# List of all the board related files.
 | 
					# List of all the board related files.
 | 
				
			||||||
BOARDSRC += $(BOARD_PATH)/board/extra.c
 | 
					BOARDSRC +=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Required include directories
 | 
					# Required include directories
 | 
				
			||||||
BOARDINC += $(BOARD_PATH)/board
 | 
					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
 | 
					include $(CHIBIOS_CONTRIB)/os/hal/boards/PJRC_TEENSY_3_6/board.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# List of all the board related files.
 | 
					# List of all the board related files.
 | 
				
			||||||
BOARDSRC += $(BOARD_PATH)/board/extra.c
 | 
					BOARDSRC +=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Required include directories
 | 
					# Required include directories
 | 
				
			||||||
BOARDINC += $(BOARD_PATH)/board
 | 
					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_USE_USBD0                    TRUE
 | 
				
			||||||
#define RP_USB_FORCE_VBUS_DETECT            TRUE
 | 
					#define RP_USB_FORCE_VBUS_DETECT            TRUE
 | 
				
			||||||
#define RP_USE_EXTERNAL_VBUS_DETECT         FALSE
 | 
					#define RP_USE_EXTERNAL_VBUS_DETECT         FALSE
 | 
				
			||||||
#define RP_USB_USE_SOF_INTR                 TRUE
 | 
					 | 
				
			||||||
#define RP_USB_USE_ERROR_DATA_SEQ_INTR      FALSE
 | 
					#define RP_USB_USE_ERROR_DATA_SEQ_INTR      FALSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* MCUCONF_H */
 | 
					#endif /* MCUCONF_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,6 +42,7 @@ void suspend_wakeup_init(void) {
 | 
				
			||||||
    clear_keys();
 | 
					    clear_keys();
 | 
				
			||||||
#ifdef MOUSEKEY_ENABLE
 | 
					#ifdef MOUSEKEY_ENABLE
 | 
				
			||||||
    mousekey_clear();
 | 
					    mousekey_clear();
 | 
				
			||||||
 | 
					    mousekey_send();
 | 
				
			||||||
#endif /* MOUSEKEY_ENABLE */
 | 
					#endif /* MOUSEKEY_ENABLE */
 | 
				
			||||||
#ifdef PROGRAMMABLE_BUTTON_ENABLE
 | 
					#ifdef PROGRAMMABLE_BUTTON_ENABLE
 | 
				
			||||||
    programmable_button_clear();
 | 
					    programmable_button_clear();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -180,28 +180,24 @@ void protocol_post_init(void) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void protocol_pre_task(void) {
 | 
					void protocol_pre_task(void) {
 | 
				
			||||||
    usb_event_queue_task();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if !defined(NO_USB_STARTUP_CHECK)
 | 
					#if !defined(NO_USB_STARTUP_CHECK)
 | 
				
			||||||
    if (USB_DRIVER.state == USB_SUSPENDED) {
 | 
					    if (USB_DRIVER.state == USB_SUSPENDED) {
 | 
				
			||||||
        print("[s]");
 | 
					        dprintln("suspending keyboard");
 | 
				
			||||||
        while (USB_DRIVER.state == USB_SUSPENDED) {
 | 
					        while (USB_DRIVER.state == USB_SUSPENDED) {
 | 
				
			||||||
            /* Do this in the suspended state */
 | 
					            suspend_power_down();
 | 
				
			||||||
            suspend_power_down(); // on AVR this deep sleeps for 15ms
 | 
					 | 
				
			||||||
            /* Remote wakeup */
 | 
					 | 
				
			||||||
            if ((USB_DRIVER.status & USB_GETSTATUS_REMOTE_WAKEUP_ENABLED) && suspend_wakeup_condition()) {
 | 
					            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);
 | 
					                usbWakeupHost(&USB_DRIVER);
 | 
				
			||||||
                restart_usb_driver(&USB_DRIVER);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        /* Woken up */
 | 
					        /* after a successful wakeup a USB_EVENT_WAKEUP is signaled to QMK by
 | 
				
			||||||
        // variables has been already cleared by the wakeup hook
 | 
					         * ChibiOS, which triggers a wakeup callback that restores the state of
 | 
				
			||||||
        send_keyboard_report();
 | 
					         * the keyboard. Therefore we do nothing here. */
 | 
				
			||||||
#    ifdef MOUSEKEY_ENABLE
 | 
					 | 
				
			||||||
        mousekey_send();
 | 
					 | 
				
			||||||
#    endif /* MOUSEKEY_ENABLE */
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    usb_event_queue_task();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void protocol_post_task(void) {
 | 
					void protocol_post_task(void) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -858,7 +858,7 @@ void protocol_post_init(void) {
 | 
				
			||||||
void protocol_pre_task(void) {
 | 
					void protocol_pre_task(void) {
 | 
				
			||||||
#if !defined(NO_USB_STARTUP_CHECK)
 | 
					#if !defined(NO_USB_STARTUP_CHECK)
 | 
				
			||||||
    if (USB_DeviceState == DEVICE_STATE_Suspended) {
 | 
					    if (USB_DeviceState == DEVICE_STATE_Suspended) {
 | 
				
			||||||
        print("[s]");
 | 
					        dprintln("suspending keyboard");
 | 
				
			||||||
        while (USB_DeviceState == DEVICE_STATE_Suspended) {
 | 
					        while (USB_DeviceState == DEVICE_STATE_Suspended) {
 | 
				
			||||||
            suspend_power_down();
 | 
					            suspend_power_down();
 | 
				
			||||||
            if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) {
 | 
					            if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue