diff options
| author | William D. Jones <[email protected]> | 2019-01-24 04:17:23 -0500 |
|---|---|---|
| committer | William D. Jones <[email protected]> | 2019-01-24 04:18:53 -0500 |
| commit | 9e76635465f5dedc3427be5647836750067d3554 (patch) | |
| tree | 10449e36a9a0efcefeb03837c8988162ef967497 /src | |
| parent | fe7f304ad42df3f84c5a07228eb6add57179bc78 (diff) | |
stm32f4: Clarify required FIFO sizes and observed behavior.
Diffstat (limited to 'src')
| -rw-r--r-- | src/portable/stm/stm32f4/dcd_stm32f4.c | 13 |
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); |
