From 9e76635465f5dedc3427be5647836750067d3554 Mon Sep 17 00:00:00 2001 From: "William D. Jones" Date: Thu, 24 Jan 2019 04:17:23 -0500 Subject: [PATCH] stm32f4: Clarify required FIFO sizes and observed behavior. --- src/portable/stm/stm32f4/dcd_stm32f4.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/portable/stm/stm32f4/dcd_stm32f4.c b/src/portable/stm/stm32f4/dcd_stm32f4.c index 586de29c..11e89c67 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);