chThdSleepMilliseconds(15);
USB0->CTL &= ~USBx_CTL_RESUME;
#endif /* KINETIS_USB_USE_USB0 */
-#else /* K20x || KL2x */
+#elif defined(STM32F0XX) || defined(STM32F1XX) /* K20x || KL2x */
+ STM32_USB->CNTR |= CNTR_RESUME;
+ chThdSleepMilliseconds(15);
+ STM32_USB->CNTR &= ~CNTR_RESUME;
+#else /* STM32F0XX || STM32F1XX */
#warning Sending remote wakeup packet not implemented for your platform.
#endif /* K20x || KL2x */
}
}
osalSysUnlock();
+ bool ep_not_ready;
#ifdef NKRO_ENABLE
if(keyboard_nkro) { /* NKRO protocol */
usbPrepareTransmit(&USB_DRIVER, NKRO_ENDPOINT, (uint8_t *)report, sizeof(report_keyboard_t));
- osalSysLock();
- usbStartTransmitI(&USB_DRIVER, NKRO_ENDPOINT);
- osalSysUnlock();
+ /* need to wait until the previous packet has made it through */
+ do {
+ osalSysLock();
+ ep_not_ready = usbStartTransmitI(&USB_DRIVER, NKRO_ENDPOINT);
+ osalSysUnlock();
+ } while (ep_not_ready);
} else
#endif /* NKRO_ENABLE */
{ /* boot protocol */
- usbPrepareTransmit(&USB_DRIVER, KBD_ENDPOINT, (uint8_t *)report, sizeof(report_keyboard_t));
- osalSysLock();
- usbStartTransmitI(&USB_DRIVER, KBD_ENDPOINT);
- osalSysUnlock();
+ usbPrepareTransmit(&USB_DRIVER, KBD_ENDPOINT, (uint8_t *)report, KBD_EPSIZE);
+ /* need to wait until the previous packet has made it through */
+ do {
+ osalSysLock();
+ ep_not_ready = usbStartTransmitI(&USB_DRIVER, KBD_ENDPOINT);
+ osalSysUnlock();
+ } while (ep_not_ready);
}
keyboard_report_sent = *report;
}
return 0;
}
osalSysUnlock();
- /* should get suspended and wait if the queue is full
- * but it's not blocking even if noone is listening,
- * because the USB packets are sent anyway */
- return(chOQPut(&console_queue, c));
+ /* Timeout after 5us if the queue is full.
+ * Increase this timeout if too much stuff is getting
+ * dropped (i.e. the buffer is getting full too fast
+ * for USB/HIDRAW to dequeue). Another possibility
+ * for fixing this kind of thing is to increase
+ * CONSOLE_QUEUE_CAPACITY. */
+ return(chOQPutTimeout(&console_queue, c, US2ST(5)));
}
#else /* CONSOLE_ENABLE */