summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilliam D. Jones <[email protected]>2019-01-24 04:17:23 -0500
committerWilliam D. Jones <[email protected]>2019-01-24 04:18:53 -0500
commit9e76635465f5dedc3427be5647836750067d3554 (patch)
tree10449e36a9a0efcefeb03837c8988162ef967497 /src
parentfe7f304ad42df3f84c5a07228eb6add57179bc78 (diff)
stm32f4: Clarify required FIFO sizes and observed behavior.
Diffstat (limited to 'src')
-rw-r--r--src/portable/stm/stm32f4/dcd_stm32f4.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/portable/stm/stm32f4/dcd_stm32f4.c b/src/portable/stm/stm32f4/dcd_stm32f4.c
index 586de29c0..11e89c67b 100644
--- a/src/portable/stm/stm32f4/dcd_stm32f4.c
+++ b/src/portable/stm/stm32f4/dcd_stm32f4.c
@@ -80,14 +80,19 @@ static void bus_reset(void) {
dev->DOEPMSK |= USB_OTG_DOEPMSK_STUPM | USB_OTG_DOEPMSK_XFRCM;
dev->DIEPMSK |= USB_OTG_DIEPMSK_TOM | USB_OTG_DIEPMSK_XFRCM;
- // FIFO sizes are set up by the following rules:
- // OUT FIFO uses:
+ // FIFO sizes are set up by the following rules (each word 32-bits):
+ // OUT FIFO uses (based on page 1354 of Rev 17 of reference manual):
// * 10 locations in hardware for setup packets + setup control words
// (up to 3 setup packets).
// * 2 locations for OUT endpoint control words.
// * 64 bytes for maximum control packet size.
- // IN FIFO uses 64 words for maximum control packet size.
- USB_OTG_FS->GRXFSIZ = 40; // 10 + 2 + 16 = 28 32-bit words
+ // * 1 location for global NAK (not required/used here).
+ // IN FIFO uses 64 bytes for maximum control packet size.
+ //
+ // However, for OUT FIFO, 10 + 2 + 16 = 28 doesn't seem to work (TODO: why?).
+ // Minimum that works in practice is 35, so allocate 40 32-bit locations
+ // as a buffer.
+ USB_OTG_FS->GRXFSIZ = 40;
USB_OTG_FS->DIEPTXF0_HNPTXFSIZ |= (16 << USB_OTG_TX0FD_Pos); // 16 32-bit words = 64 bytes
out_ep[0].DOEPTSIZ |= (3 << USB_OTG_DOEPTSIZ_STUPCNT_Pos);