summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilliam D. Jones <[email protected]>2019-02-08 11:51:29 -0500
committerWilliam D. Jones <[email protected]>2019-02-08 11:51:29 -0500
commitc7a52829f4083f925b057191e65682a8030a4475 (patch)
tree0676be4a976112218be81971c5d97ef1d5198a97 /src
parent5645d44127ec5557da907f7784698c64414e4834 (diff)
Clarify receive_packet comment, add SOF handling.
Diffstat (limited to 'src')
-rw-r--r--src/portable/stm/stm32f4/dcd_stm32f4.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/portable/stm/stm32f4/dcd_stm32f4.c b/src/portable/stm/stm32f4/dcd_stm32f4.c
index 034e6c4fa..4a99d6ecd 100644
--- a/src/portable/stm/stm32f4/dcd_stm32f4.c
+++ b/src/portable/stm/stm32f4/dcd_stm32f4.c
@@ -154,7 +154,8 @@ bool dcd_init (uint8_t rhport)
/* USB_OTG_FS->GINTMSK |= USB_OTG_GINTMSK_USBRST | USB_OTG_GINTMSK_ENUMDNEM | \
USB_OTG_GINTMSK_ESUSPM | USB_OTG_GINTMSK_USBSUSPM | \
USB_OTG_GINTMSK_SOFM; */
- USB_OTG_FS->GINTMSK |= USB_OTG_GINTMSK_USBRST | USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_RXFLVLM;
+ USB_OTG_FS->GINTMSK |= USB_OTG_GINTMSK_USBRST | USB_OTG_GINTMSK_ENUMDNEM | \
+ USB_OTG_GINTMSK_SOFM | USB_OTG_GINTMSK_RXFLVLM;
// Enable pullup, enable peripheral.
USB_OTG_FS->GCCFG |= USB_OTG_GCCFG_VBUSBSEN | USB_OTG_GCCFG_PWRDWN;
@@ -412,6 +413,9 @@ static void receive_packet(xfer_ctl_t * xfer, /* USB_OTG_OUTEndpointTypeDef * ou
}
xfer->queued_len += xfer_size;
+
+ // Per USB spec, a short OUT packet (including length 0) is always
+ // indicative of the end of a transfer (at least for ctl, bulk, int).
xfer->short_packet = (xfer_size < xfer->max_size);
}
@@ -479,6 +483,11 @@ void OTG_FS_IRQHandler(void) {
dcd_event_bus_signal(0, DCD_EVENT_BUS_RESET, true);
}
+ if(int_status & USB_OTG_GINTSTS_SOF) {
+ USB_OTG_FS->GINTSTS = USB_OTG_GINTSTS_SOF;
+ dcd_event_bus_signal(0, DCD_EVENT_SOF, true);
+ }
+
if(int_status & USB_OTG_GINTSTS_RXFLVL) {
USB_OTG_FS->GINTSTS = USB_OTG_GINTSTS_RXFLVL;