@@ -121,10 +121,10 @@ int main(void) { | |||
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 |
@@ -1024,6 +1024,23 @@ void init_usb_driver(USBDriver *usbp) { | |||
#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 | |||
* --------------------------------------------------------- |
@@ -36,6 +36,9 @@ | |||
/* Initialize the USB driver and bus */ | |||
void init_usb_driver(USBDriver *usbp); | |||
/* Send remote wakeup packet */ | |||
void send_remote_wakeup(USBDriver *usbp); | |||
/* --------------- | |||
* Keyboard header | |||
* --------------- |