usb/dwc: Fixed how the endpoints were configured and brought up during endpoint setup for the H7

This commit is contained in:
dragonmux
2024-04-18 18:49:51 +01:00
committed by Piotr Esden-Tempski
parent 484bfee238
commit c3d972632a
2 changed files with 90 additions and 51 deletions

View File

@@ -313,7 +313,7 @@
#define OTG_DIEPCTL0_MPSIZ_16 (0x2U << 0U) #define OTG_DIEPCTL0_MPSIZ_16 (0x2U << 0U)
#define OTG_DIEPCTL0_MPSIZ_8 (0x3U << 0U) #define OTG_DIEPCTL0_MPSIZ_8 (0x3U << 0U)
/* OTG Device IN Endpoint X Control Register (OTG_DOEPCTLX) */ /* OTG Device IN Endpoint X Control Register (OTG_DIEPCTLX) */
#define OTG_DIEPCTLX_EPTYP_SHIFT 18U #define OTG_DIEPCTLX_EPTYP_SHIFT 18U
#define OTG_DIEPCTLX_TXFNUM_SHIFT 22U #define OTG_DIEPCTLX_TXFNUM_SHIFT 22U
#define OTG_DIEPCTLX_MPSIZ_MASK (0x000007ffU) #define OTG_DIEPCTLX_MPSIZ_MASK (0x000007ffU)
@@ -322,7 +322,6 @@
#define OTG_DOEPCTL0_EPENA (1U << 31U) #define OTG_DOEPCTL0_EPENA (1U << 31U)
#define OTG_DOEPCTL0_EPDIS (1U << 30U) #define OTG_DOEPCTL0_EPDIS (1U << 30U)
/* Bits 29:28 - Reserved */ /* Bits 29:28 - Reserved */
#define OTG_DOEPCTLX_SD0PID (1U << 28U)
#define OTG_DOEPCTL0_SNAK (1U << 27U) #define OTG_DOEPCTL0_SNAK (1U << 27U)
#define OTG_DOEPCTL0_CNAK (1U << 26U) #define OTG_DOEPCTL0_CNAK (1U << 26U)
/* Bits 25:22 - Reserved */ /* Bits 25:22 - Reserved */
@@ -340,6 +339,9 @@
#define OTG_DOEPCTL0_MPSIZ_8 (0x3U << 0U) #define OTG_DOEPCTL0_MPSIZ_8 (0x3U << 0U)
/* OTG Device OUT Endpoint X Control Register (OTG_DOEPCTLX) */ /* OTG Device OUT Endpoint X Control Register (OTG_DOEPCTLX) */
#define OTG_DOEPCTLX_SD1PID (1U << 29U)
#define OTG_DOEPCTLX_SD0PID (1U << 28U)
#define OTG_DIEPCTLX_EPTYP_SHIFT 18U
#define OTG_DOEPCTLX_MPSIZ_MASK (0x000007ffU) #define OTG_DOEPCTLX_MPSIZ_MASK (0x000007ffU)
/* OTG Device IN Endpoint Interrupt Register (OTG_DIEPINTx) */ /* OTG Device IN Endpoint Interrupt Register (OTG_DIEPINTx) */
@@ -363,20 +365,42 @@
#define OTG_DOEPINTX_EPDISD (1U << 1U) #define OTG_DOEPINTX_EPDISD (1U << 1U)
#define OTG_DOEPINTX_XFRC (1U << 0U) #define OTG_DOEPINTX_XFRC (1U << 0U)
/* OTG Device OUT Endpoint 0 Transfer Size Register (OTG_DOEPTSIZ0) */ /* OTG Device IN Endpoint 0 Transfer Size Register (OTG_DIEPTSIZ0) */
/* Bit 31 - Reserved */ /* Bits 31:21 - Reserved */
#define OTG_DIEPSIZ0_STUPCNT_1 (0x1U << 29U)
#define OTG_DIEPSIZ0_STUPCNT_2 (0x2U << 29U)
#define OTG_DIEPSIZ0_STUPCNT_3 (0x3U << 29U)
#define OTG_DIEPSIZ0_STUPCNT_MASK (0x3U << 29U)
/* Bits 28:20 - Reserved */
#define OTG_DIEPSIZ0_PKTCNT (1U << 19U) #define OTG_DIEPSIZ0_PKTCNT (1U << 19U)
/* Bits 18:7 - Reserved */ /* Bits 18:7 - Reserved */
#define OTG_DIEPSIZ0_XFRSIZ_MASK (0x0000007fU) #define OTG_DIEPSIZ0_XFRSIZ_MASK (0x0000007fU)
/* OTG Device OUT Endpoint X Transfer Size Register (OTG_DOEPTSIZX) */ /* OTG Device IN Endpoint X Transfer Size Register (OTG_DIEPTSIZX) */
/* Bit 31 - Reserved */
#define OTG_DIEPSIZX_MCNT_1 (0x1U << 29U)
#define OTG_DIEPSIZX_MCNT_2 (0x2U << 29U)
#define OTG_DIEPSIZX_MCNT_3 (0x3U << 29U)
#define OTG_DIEPSIZX_MCNT_MASK (0x3U << 29U)
#define OTG_DIEPSIZX_PKTCNT_MASK (0x1ff80000U)
#define OTG_DIEPSIZX_PKTCNT_SHIFT (19U)
#define OTG_DIEPSIZX_PKTCNT(x) (((x) << OTG_DIEPSIZX_PKTCNT_SHIFT) & OTG_DIEPSIZX_PKTCNT_MASK)
#define OTG_DIEPSIZX_XFRSIZ_MASK (0x0007ffffU) #define OTG_DIEPSIZX_XFRSIZ_MASK (0x0007ffffU)
/* OTG Device OUT Endpoint 0 Transfer Size Register (OTG_DOEPTSIZ0) */
/* Bit 31 - Reserved */
#define OTG_DOEPSIZ0_STUPCNT_1 (0x1U << 29U)
#define OTG_DOEPSIZ0_STUPCNT_2 (0x2U << 29U)
#define OTG_DOEPSIZ0_STUPCNT_3 (0x3U << 29U)
#define OTG_DOEPSIZ0_STUPCNT_MASK (0x3U << 29U)
/* Bits 28:20 - Reserved */
#define OTG_DOEPSIZ0_PKTCNT (1U << 19U)
/* Bits 18:7 - Reserved */
#define OTG_DOEPSIZ0_XFRSIZ_MASK (0x0000007fU)
/* OTG Device OUT Endpoint X Transfer Size Register (OTG_DOEPTSIZX) */
/* Bit 31 - Reserved */
/* Bit 30:29 - RXDPID */
#define OTG_DOEPSIZX_PKTCNT_MASK (0x1ff80000U)
#define OTG_DOEPSIZX_PKTCNT_SHIFT (19U)
#define OTG_DOEPSIZX_PKTCNT(x) (((x) << OTG_DIEPSIZX_PKTCNT_SHIFT) & OTG_DIEPSIZX_PKTCNT_MASK)
#define OTG_DOEPSIZX_XFRSIZ_MASK (0x0007ffffU)
/* Host-mode CSRs */ /* Host-mode CSRs */
/* OTG Host non-periodic transmit FIFO size register /* OTG Host non-periodic transmit FIFO size register

View File

@@ -67,7 +67,7 @@ void dwc_ep_setup(usbd_device *const usbd_dev, const uint8_t addr, const uint8_t
#endif #endif
/* Configure OUT part. */ /* Configure OUT part. */
usbd_dev->doeptsiz[0] = OTG_DIEPSIZ0_STUPCNT_1 | OTG_DIEPSIZ0_PKTCNT | (max_size & OTG_DIEPSIZ0_XFRSIZ_MASK); usbd_dev->doeptsiz[0] = OTG_DOEPSIZ0_STUPCNT_1 | OTG_DOEPSIZ0_PKTCNT | (max_size & OTG_DOEPSIZ0_XFRSIZ_MASK);
REBASE(OTG_DOEPTSIZ(0)) = usbd_dev->doeptsiz[0]; REBASE(OTG_DOEPTSIZ(0)) = usbd_dev->doeptsiz[0];
#if defined(STM32H7) #if defined(STM32H7)
/* However, *do* arm the OUT endpoint so we can receive the first SETUP packet */ /* However, *do* arm the OUT endpoint so we can receive the first SETUP packet */
@@ -93,21 +93,32 @@ void dwc_ep_setup(usbd_device *const usbd_dev, const uint8_t addr, const uint8_t
} }
if (addr & 0x80U) { if (addr & 0x80U) {
/* Configure an IN endpoint */
REBASE(OTG_DIEPTXF(ep)) = ((max_size / 4) << 16) | usbd_dev->fifo_mem_top; REBASE(OTG_DIEPTXF(ep)) = ((max_size / 4) << 16) | usbd_dev->fifo_mem_top;
usbd_dev->fifo_mem_top += max_size / 4; usbd_dev->fifo_mem_top += max_size / 4;
REBASE(OTG_DIEPTSIZ(ep)) = (max_size & OTG_DIEPSIZ0_XFRSIZ_MASK); #if defined(STM32H7)
REBASE(OTG_DIEPCTL(ep)) |= OTG_DIEPCTL0_EPENA | OTG_DIEPCTL0_SNAK | (type << 18) | OTG_DIEPCTL0_USBAEP | /* Do not initially arm the IN endpoint - we've got nothing to send the host at first */
OTG_DIEPCTLX_SD0PID | (ep << 22) | max_size; REBASE(OTG_DIEPTSIZ(ep)) = 0U;
REBASE(OTG_DIEPCTL(ep)) = (max_size & OTG_DIEPCTLX_MPSIZ_MASK) | OTG_DIEPCTL0_SNAK | OTG_DIEPCTL0_USBAEP |
(type << OTG_DIEPCTLX_EPTYP_SHIFT) | OTG_DIEPCTLX_SD0PID | (ep << OTG_DIEPCTLX_TXFNUM_SHIFT);
#else
REBASE(OTG_DIEPTSIZ(ep)) = max_size & OTG_DIEPSIZ0_XFRSIZ_MASK;
REBASE(OTG_DIEPCTL(ep)) |= OTG_DIEPCTL0_EPENA | OTG_DIEPCTL0_SNAK | (type << OTG_DIEPCTLX_EPTYP_SHIFT) |
OTG_DIEPCTL0_USBAEP | OTG_DIEPCTLX_SD0PID | (ep << OTG_DIEPCTLX_TXFNUM_SHIFT) |
(max_size & OTG_DIEPCTLX_MPSIZ_MASK);
#endif
if (callback) { if (callback) {
usbd_dev->user_callback_ctr[ep][USB_TRANSACTION_IN] = (void *)callback; usbd_dev->user_callback_ctr[ep][USB_TRANSACTION_IN] = (void *)callback;
} }
} else { } else {
usbd_dev->doeptsiz[ep] = OTG_DIEPSIZ0_PKTCNT | (max_size & OTG_DIEPSIZ0_XFRSIZ_MASK); /* Configure an OUT endpoint */
usbd_dev->doeptsiz[ep] = OTG_DOEPSIZX_PKTCNT(1U) | (max_size & OTG_DOEPSIZX_XFRSIZ_MASK);
REBASE(OTG_DOEPTSIZ(ep)) = usbd_dev->doeptsiz[ep]; REBASE(OTG_DOEPTSIZ(ep)) = usbd_dev->doeptsiz[ep];
REBASE(OTG_DOEPCTL(ep)) |= OTG_DOEPCTL0_EPENA | OTG_DOEPCTL0_USBAEP | OTG_DIEPCTL0_CNAK | OTG_DOEPCTLX_SD0PID | /* Make sure to arm the endpoint as part of enabling it so we can get the first data from it */
(type << 18) | max_size; REBASE(OTG_DOEPCTL(ep)) = OTG_DOEPCTL0_EPENA | OTG_DIEPCTL0_CNAK | OTG_DOEPCTL0_USBAEP | OTG_DOEPCTLX_SD0PID |
(type << OTG_DIEPCTLX_EPTYP_SHIFT) | (max_size & OTG_DOEPCTLX_MPSIZ_MASK);
if (callback) { if (callback) {
usbd_dev->user_callback_ctr[ep][USB_TRANSACTION_OUT] = (void *)callback; usbd_dev->user_callback_ctr[ep][USB_TRANSACTION_OUT] = (void *)callback;
@@ -200,7 +211,11 @@ uint16_t dwc_ep_write_packet(usbd_device *const usbd_dev, const uint8_t addr, co
} }
/* Enable endpoint for transmission. */ /* Enable endpoint for transmission. */
if (ep == 0U) {
REBASE(OTG_DIEPTSIZ(ep)) = OTG_DIEPSIZ0_PKTCNT | (len & OTG_DIEPSIZ0_XFRSIZ_MASK);
} else {
REBASE(OTG_DIEPTSIZ(ep)) = OTG_DIEPSIZ0_PKTCNT | (len & OTG_DIEPSIZX_XFRSIZ_MASK); REBASE(OTG_DIEPTSIZ(ep)) = OTG_DIEPSIZ0_PKTCNT | (len & OTG_DIEPSIZX_XFRSIZ_MASK);
}
REBASE(OTG_DIEPCTL(ep)) |= OTG_DIEPCTL0_EPENA | OTG_DIEPCTL0_CNAK; REBASE(OTG_DIEPCTL(ep)) |= OTG_DIEPCTL0_EPENA | OTG_DIEPCTL0_CNAK;
const uint8_t *const buf8 = buf; const uint8_t *const buf8 = buf;