while(USB_DRIVER.state == USB_SUSPENDED) {
/* Do this in the suspended state */
suspend_power_down(); // on AVR this deep sleeps for 15ms
- // TODO: remote wakeup
- // if(USB_Device_RemoteWakeupEnabled (USB_DRIVER.status & 2) && suspend_wakeup_condition()) {
- // USB_Device_SendRemoteWakeup();
- // }
+ /* Remote wakeup */
+ if((USB_DRIVER.status & 2) && suspend_wakeup_condition()) {
+ send_remote_wakeup(&USB_DRIVER);
+ }
}
/* Woken up */
// variables has been already cleared by the wakeup hook
#endif
}
+/*
+ * Send remote wakeup packet
+ * Note: should not be called from ISR
+ */
+void send_remote_wakeup(USBDriver *usbp) {
+ (void)usbp;
+#if defined(K20x) || defined(KL2x)
+#if KINETIS_USB_USE_USB0
+ USB0->CTL |= USBx_CTL_RESUME;
+ chThdSleepMilliseconds(15);
+ USB0->CTL &= ~USBx_CTL_RESUME;
+#endif /* KINETIS_USB_USE_USB0 */
+#else /* K20x || KL2x */
+#warning Sending remote wakeup packet not implemented for your platform.
+#endif /* K20x || KL2x */
+}
+
/* ---------------------------------------------------------
* Keyboard functions
* ---------------------------------------------------------
/* Initialize the USB driver and bus */
void init_usb_driver(USBDriver *usbp);
+/* Send remote wakeup packet */
+void send_remote_wakeup(USBDriver *usbp);
+
/* ---------------
* Keyboard header
* ---------------