aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal')
-rw-r--r--os/hal/include/usb.h3
-rw-r--r--os/hal/src/usb.c7
2 files changed, 6 insertions, 4 deletions
diff --git a/os/hal/include/usb.h b/os/hal/include/usb.h
index 8d3bcde6b..6f18d7c55 100644
--- a/os/hal/include/usb.h
+++ b/os/hal/include/usb.h
@@ -249,7 +249,8 @@ typedef enum {
*/
typedef enum {
USB_EP0_WAITING_SETUP, /**< Waiting for SETUP data. */
- USB_EP0_TX, /**< Transmitting. */
+ USB_EP0_TX, /**< Trasmitting. */
+ USB_EP0_WAITING_TX0, /**< Waiting transmit 0 */
USB_EP0_WAITING_STS, /**< Waiting status. */
USB_EP0_RX, /**< Receiving. */
USB_EP0_SENDING_STS, /**< Sending status. */
diff --git a/os/hal/src/usb.c b/os/hal/src/usb.c
index 9c3825910..745b2d436 100644
--- a/os/hal/src/usb.c
+++ b/os/hal/src/usb.c
@@ -693,15 +693,16 @@ void _usb_ep0in(USBDriver *usbp, usbep_t ep) {
/* If the transmitted size is less than the requested size and it is a
multiple of the maximum packet size then a zero size packet must be
transmitted.*/
- if ((usbp->ep0n < max) &&
- ((usbp->ep0n % usbp->epc[0]->in_maxsize) == 0)) {
+ if ((usbp->ep0n < max) && ((usbp->ep0n % usbp->epc[0]->in_maxsize) == 0)) {
usbPrepareTransmit(usbp, 0, NULL, 0);
chSysLockFromIsr();
usbStartTransmitI(usbp, 0);
chSysUnlockFromIsr();
+ usbp->ep0state = USB_EP0_WAITING_TX0;
return;
}
-
+ /* Falls into, it is intentional.*/
+ case USB_EP0_WAITING_TX0:
/* Transmit phase over, receiving the zero sized status packet.*/
usbp->ep0state = USB_EP0_WAITING_STS;
usbPrepareReceive(usbp, 0, NULL, 0);