mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01: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. 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
					
				| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Stefan Kerkmann
						Stefan Kerkmann