36#if CFG_TUSB_MCU == OPT_MCU_STM32F1
37 #include "stm32f1xx.h"
39 #define EP_FIFO_SIZE_FS 1280
41#elif CFG_TUSB_MCU == OPT_MCU_STM32F2
42 #include "stm32f2xx.h"
43 #define EP_MAX_FS USB_OTG_FS_MAX_IN_ENDPOINTS
44 #define EP_FIFO_SIZE_FS USB_OTG_FS_TOTAL_FIFO_SIZE
46 #define EP_MAX_HS USB_OTG_HS_MAX_IN_ENDPOINTS
47 #define EP_FIFO_SIZE_HS USB_OTG_HS_TOTAL_FIFO_SIZE
49#elif CFG_TUSB_MCU == OPT_MCU_STM32F4
50 #include "stm32f4xx.h"
51 #define EP_MAX_FS USB_OTG_FS_MAX_IN_ENDPOINTS
52 #define EP_FIFO_SIZE_FS USB_OTG_FS_TOTAL_FIFO_SIZE
54 #define EP_MAX_HS USB_OTG_HS_MAX_IN_ENDPOINTS
55 #define EP_FIFO_SIZE_HS USB_OTG_HS_TOTAL_FIFO_SIZE
57#elif CFG_TUSB_MCU == OPT_MCU_STM32H7
58 #include "stm32h7xx.h"
60 #define EP_FIFO_SIZE_FS 4096
63 #define EP_FIFO_SIZE_HS 4096
67 #if (! defined USB2_OTG_FS)
68 #define USB_OTG_FS_PERIPH_BASE USB1_OTG_HS_PERIPH_BASE
69 #define OTG_FS_IRQn OTG_HS_IRQn
72#elif CFG_TUSB_MCU == OPT_MCU_STM32H7RS
73 #include "stm32h7rsxx.h"
75 #define EP_FIFO_SIZE_FS 1280
78 #define EP_FIFO_SIZE_HS 4096
80#elif CFG_TUSB_MCU == OPT_MCU_STM32F7
81 #include "stm32f7xx.h"
83 #define EP_FIFO_SIZE_FS 1280
86 #define EP_FIFO_SIZE_HS 4096
88#elif CFG_TUSB_MCU == OPT_MCU_STM32L4
89 #include "stm32l4xx.h"
91 #define EP_FIFO_SIZE_FS 1280
93#elif CFG_TUSB_MCU == OPT_MCU_STM32U5
94 #include "stm32u5xx.h"
97 #define USB_OTG_FS_PERIPH_BASE USB_OTG_FS_BASE
99 #define EP_FIFO_SIZE_FS 1280
101 #define USB_OTG_HS_PERIPH_BASE USB_OTG_HS_BASE
103 #define EP_FIFO_SIZE_HS 4096
106 #error "Unsupported MCUs"
110#ifdef USB_OTG_HS_PERIPH_BASE
111 #define DWC2_EP_MAX EP_MAX_HS
113 #define DWC2_EP_MAX EP_MAX_FS
119 #ifdef USB_OTG_FS_PERIPH_BASE
120 { .reg_base = USB_OTG_FS_PERIPH_BASE, .irqnum = OTG_FS_IRQn, .ep_count = EP_MAX_FS, .ep_fifo_size = EP_FIFO_SIZE_FS },
123 #ifdef USB_OTG_HS_PERIPH_BASE
124 { .reg_base = USB_OTG_HS_PERIPH_BASE, .irqnum = OTG_HS_IRQn, .ep_count = EP_MAX_HS, .ep_fifo_size = EP_FIFO_SIZE_HS },
135TU_ATTR_ALWAYS_INLINE
static inline void dwc2_int_set(uint8_t rhport, tusb_role_t role,
bool enabled) {
139 NVIC_EnableIRQ(irqn);
141 NVIC_DisableIRQ(irqn);
145#define dwc2_dcd_int_enable(_rhport) dwc2_int_set(_rhport, TUSB_ROLE_DEVICE, true)
146#define dwc2_dcd_int_disable(_rhport) dwc2_int_set(_rhport, TUSB_ROLE_DEVICE, false)
152 while (count--) __NOP();
167 #if defined(USB_OTG_FS_PERIPH_BASE) && defined(RCC_AHB1LPENR_USB2OTGFSULPILPEN)
168 if ( USB_OTG_FS_PERIPH_BASE == (uint32_t) dwc2 ) {
169 RCC->AHB1LPENR &= ~RCC_AHB1LPENR_USB2OTGFSULPILPEN;
173 #if defined(USB_OTG_HS_PERIPH_BASE) && defined(RCC_AHB1LPENR_USB1OTGHSULPILPEN)
174 if ( USB_OTG_HS_PERIPH_BASE == (uint32_t) dwc2 ) {
175 RCC->AHB1LPENR &= ~RCC_AHB1LPENR_USB1OTGHSULPILPEN;
179 #if defined(USB_OTG_HS_PERIPH_BASE) && defined(RCC_AHB1LPENR_OTGHSULPILPEN)
180 if ( USB_OTG_HS_PERIPH_BASE == (uint32_t) dwc2 ) {
181 RCC->AHB1LPENR &= ~RCC_AHB1LPENR_OTGHSULPILPEN;
186#if CFG_TUSB_MCU != OPT_MCU_STM32U5
198 USB_HS_PHYC->USB_HS_PHYC_LDO |= USB_HS_PHYC_LDO_ENABLE;
201 while ( 0 == (USB_HS_PHYC->USB_HS_PHYC_LDO & USB_HS_PHYC_LDO_STATUS) ) {}
203 uint32_t phyc_pll = 0;
208 case 12000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_12MHZ ;
break;
209 case 12500000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_12_5MHZ ;
break;
210 case 16000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_16MHZ ;
break;
211 case 24000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_24MHZ ;
break;
212 case 25000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_25MHZ ;
break;
213 case 32000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_Msk ;
break;
217 USB_HS_PHYC->USB_HS_PHYC_PLL = phyc_pll;
221 USB_HS_PHYC->USB_HS_PHYC_TUNE |= 0x00000F13U;
224 USB_HS_PHYC->USB_HS_PHYC_PLL |= USB_HS_PHYC_PLL_PLLEN;
267 dwc2->
gusbcfg = (dwc2->
gusbcfg & ~GUSBCFG_TRDT_Msk) | (turnaround << GUSBCFG_TRDT_Pos);
static TU_ATTR_ALWAYS_INLINE void dwc2_int_set(uint8_t rhport, tusb_role_t role, bool enabled)
static const dwc2_controller_t _dwc2_controller[]
static TU_ATTR_ALWAYS_INLINE void dwc2_remote_wakeup_delay(void)
static void dwc2_phy_init(dwc2_regs_t *dwc2, uint8_t hs_phy_type)
static void dwc2_phy_update(dwc2_regs_t *dwc2, uint8_t hs_phy_type)
@ GHWCFG2_HSPHY_NOT_SUPPORTED
@ GHWCFG2_HSPHY_UTMI_ULPI
volatile uint32_t stm32_gccfg
volatile uint32_t gusbcfg