32#ifndef TUSB_FSDEV_STM32_H
33#define TUSB_FSDEV_STM32_H
35#if CFG_TUSB_MCU == OPT_MCU_STM32F0
36 #include "stm32f0xx.h"
37 #define FSDEV_PMA_SIZE (1024u)
38 #define FSDEV_REG_BASE USB_BASE
44#elif CFG_TUSB_MCU == OPT_MCU_STM32F1
45 #include "stm32f1xx.h"
46 #define FSDEV_PMA_SIZE (512u)
51 #define USB_CNTR_LPMODE USB_CNTR_LP_MODE
53#elif defined(STM32F302xB) || defined(STM32F302xC) || \
54 defined(STM32F303xB) || defined(STM32F303xC) || \
56 #include "stm32f3xx.h"
57 #define FSDEV_PMA_SIZE (512u)
62#elif defined(STM32F302x6) || defined(STM32F302x8) || \
63 defined(STM32F302xD) || defined(STM32F302xE) || \
64 defined(STM32F303xD) || defined(STM32F303xE)
65 #include "stm32f3xx.h"
66 #define FSDEV_PMA_SIZE (1024u)
71#elif CFG_TUSB_MCU == OPT_MCU_STM32L0
72 #include "stm32l0xx.h"
73 #define FSDEV_PMA_SIZE (1024u)
75#elif CFG_TUSB_MCU == OPT_MCU_STM32L1
76 #include "stm32l1xx.h"
77 #define FSDEV_PMA_SIZE (512u)
79#elif CFG_TUSB_MCU == OPT_MCU_STM32G4
80 #include "stm32g4xx.h"
81 #define FSDEV_PMA_SIZE (1024u)
83#elif CFG_TUSB_MCU == OPT_MCU_STM32G0
84 #include "stm32g0xx.h"
85 #define FSDEV_PMA_SIZE (2048u)
86 #define USB USB_DRD_FS
88 #define USB_EP_CTR_RX USB_EP_VTRX
89 #define USB_EP_CTR_TX USB_EP_VTTX
90 #define USB_EP_T_FIELD USB_CHEP_UTYPE
91 #define USB_EPREG_MASK USB_CHEP_REG_MASK
92 #define USB_EPTX_DTOGMASK USB_CHEP_TX_DTOGMASK
93 #define USB_EPRX_DTOGMASK USB_CHEP_RX_DTOGMASK
94 #define USB_EPTX_DTOG1 USB_CHEP_TX_DTOG1
95 #define USB_EPTX_DTOG2 USB_CHEP_TX_DTOG2
96 #define USB_EPRX_DTOG1 USB_CHEP_RX_DTOG1
97 #define USB_EPRX_DTOG2 USB_CHEP_RX_DTOG2
98 #define USB_EPRX_STAT USB_CH_RX_VALID
99 #define USB_EPKIND_MASK USB_EP_KIND_MASK
100 #define USB_CNTR_FRES USB_CNTR_USBRST
101 #define USB_CNTR_RESUME USB_CNTR_L2RES
102 #define USB_ISTR_EP_ID USB_ISTR_IDN
103 #define USB_EPADDR_FIELD USB_CHEP_ADDR
104 #define USB_CNTR_LPMODE USB_CNTR_SUSPRDY
105 #define USB_CNTR_FSUSP USB_CNTR_SUSPEN
107#elif CFG_TUSB_MCU == OPT_MCU_STM32H5
108 #include "stm32h5xx.h"
109 #define FSDEV_PMA_SIZE (2048u)
110 #define USB USB_DRD_FS
112 #define USB_EP_CTR_RX USB_EP_VTRX
113 #define USB_EP_CTR_TX USB_EP_VTTX
114 #define USB_EP_T_FIELD USB_CHEP_UTYPE
115 #define USB_EPREG_MASK USB_CHEP_REG_MASK
116 #define USB_EPTX_DTOGMASK USB_CHEP_TX_DTOGMASK
117 #define USB_EPRX_DTOGMASK USB_CHEP_RX_DTOGMASK
118 #define USB_EPTX_DTOG1 USB_CHEP_TX_DTOG1
119 #define USB_EPTX_DTOG2 USB_CHEP_TX_DTOG2
120 #define USB_EPRX_DTOG1 USB_CHEP_RX_DTOG1
121 #define USB_EPRX_DTOG2 USB_CHEP_RX_DTOG2
122 #define USB_EPRX_STAT USB_CH_RX_VALID
123 #define USB_EPKIND_MASK USB_EP_KIND_MASK
124 #define USB_CNTR_FRES USB_CNTR_USBRST
125 #define USB_CNTR_RESUME USB_CNTR_L2RES
126 #define USB_ISTR_EP_ID USB_ISTR_IDN
127 #define USB_EPADDR_FIELD USB_CHEP_ADDR
128 #define USB_CNTR_LPMODE USB_CNTR_SUSPRDY
129 #define USB_CNTR_FSUSP USB_CNTR_SUSPEN
131#elif CFG_TUSB_MCU == OPT_MCU_STM32WB
132 #include "stm32wbxx.h"
133 #define FSDEV_PMA_SIZE (1024u)
135 #define FSDEV_PMA_BASE USB1_PMAADDR
137#elif CFG_TUSB_MCU == OPT_MCU_STM32L4
138 #include "stm32l4xx.h"
139 #define FSDEV_PMA_SIZE (1024u)
141#elif CFG_TUSB_MCU == OPT_MCU_STM32L5
142 #include "stm32l5xx.h"
143 #define FSDEV_PMA_SIZE (1024u)
146 #define USB_PMAADDR (USB_BASE + (USB_PMAADDR_NS - USB_BASE_NS))
149#elif CFG_TUSB_MCU == OPT_MCU_STM32U5
150 #include "stm32u5xx.h"
151 #define FSDEV_PMA_SIZE (2048u)
152 #define USB USB_DRD_FS
154 #define USB_EP_CTR_RX USB_EP_VTRX
155 #define USB_EP_CTR_TX USB_EP_VTTX
156 #define USB_EP_T_FIELD USB_CHEP_UTYPE
157 #define USB_EPREG_MASK USB_CHEP_REG_MASK
158 #define USB_EPTX_DTOGMASK USB_CHEP_TX_DTOGMASK
159 #define USB_EPRX_DTOGMASK USB_CHEP_RX_DTOGMASK
160 #define USB_EPTX_DTOG1 USB_CHEP_TX_DTOG1
161 #define USB_EPTX_DTOG2 USB_CHEP_TX_DTOG2
162 #define USB_EPRX_DTOG1 USB_CHEP_RX_DTOG1
163 #define USB_EPRX_DTOG2 USB_CHEP_RX_DTOG2
164 #define USB_EPRX_STAT USB_CH_RX_VALID
165 #define USB_EPKIND_MASK USB_EP_KIND_MASK
166 #define USB_CNTR_FRES USB_CNTR_USBRST
167 #define USB_CNTR_RESUME USB_CNTR_L2RES
168 #define USB_ISTR_EP_ID USB_ISTR_IDN
169 #define USB_EPADDR_FIELD USB_CHEP_ADDR
170 #define USB_CNTR_LPMODE USB_CNTR_SUSPRDY
171 #define USB_CNTR_FSUSP USB_CNTR_SUSPEN
173#elif CFG_TUSB_MCU == OPT_MCU_STM32U0
174 #include "stm32u0xx.h"
175 #define FSDEV_PMA_SIZE (2048u)
176 #define USB USB_DRD_FS
178 #define USB_EP_CTR_RX USB_EP_VTRX
179 #define USB_EP_CTR_TX USB_EP_VTTX
180 #define USB_EP_T_FIELD USB_CHEP_UTYPE
181 #define USB_EPREG_MASK USB_CHEP_REG_MASK
182 #define USB_EPTX_DTOGMASK USB_CHEP_TX_DTOGMASK
183 #define USB_EPRX_DTOGMASK USB_CHEP_RX_DTOGMASK
184 #define USB_EPTX_DTOG1 USB_CHEP_TX_DTOG1
185 #define USB_EPTX_DTOG2 USB_CHEP_TX_DTOG2
186 #define USB_EPRX_DTOG1 USB_CHEP_RX_DTOG1
187 #define USB_EPRX_DTOG2 USB_CHEP_RX_DTOG2
188 #define USB_EPRX_STAT USB_CH_RX_VALID
189 #define USB_EPKIND_MASK USB_EP_KIND_MASK
190 #define USB_CNTR_FRES USB_CNTR_USBRST
191 #define USB_CNTR_RESUME USB_CNTR_L2RES
192 #define USB_ISTR_EP_ID USB_ISTR_IDN
193 #define USB_EPADDR_FIELD USB_CHEP_ADDR
194 #define USB_CNTR_LPMODE USB_CNTR_SUSPRDY
195 #define USB_CNTR_FSUSP USB_CNTR_SUSPEN
198 #error You are using an untested or unimplemented STM32 variant. Please update the driver.
205#ifndef FSDEV_REG_BASE
207 #define FSDEV_REG_BASE USB_BASE
208#elif defined(USB_DRD_BASE)
209 #define FSDEV_REG_BASE USB_DRD_BASE
210#elif defined(USB_DRD_FS_BASE)
211 #define FSDEV_REG_BASE USB_DRD_FS_BASE
213 #error "FSDEV_REG_BASE not defined"
217#ifndef FSDEV_PMA_BASE
218#if defined(USB_PMAADDR)
219 #define FSDEV_PMA_BASE USB_PMAADDR
220#elif defined(USB_DRD_PMAADDR)
221 #define FSDEV_PMA_BASE USB_DRD_PMAADDR
223 #error "FSDEV_PMA_BASE not defined"
228#if defined(USB_ISTR_L1REQ)
229#define USB_ISTR_L1REQ_FORCED (USB_ISTR_L1REQ)
231#define USB_ISTR_L1REQ_FORCED ((uint16_t)0x0000U)
234#define USB_ISTR_ALL_EVENTS (USB_ISTR_PMAOVR | USB_ISTR_ERR | USB_ISTR_WKUP | USB_ISTR_SUSP | \
235 USB_ISTR_RESET | USB_ISTR_SOF | USB_ISTR_ESOF | USB_ISTR_L1REQ_FORCED )
241#if TU_CHECK_MCU(OPT_MCU_STM32L1) && !defined(USBWakeUp_IRQn)
242 #define USBWakeUp_IRQn USB_FS_WKUP_IRQn
246 #if TU_CHECK_MCU(OPT_MCU_STM32F0, OPT_MCU_STM32L0, OPT_MCU_STM32L4)
248 #elif CFG_TUSB_MCU == OPT_MCU_STM32F1
250 USB_LP_CAN1_RX0_IRQn,
252 #elif CFG_TUSB_MCU == OPT_MCU_STM32F3
257 #elif CFG_TUSB_MCU == OPT_MCU_STM32G0
263 #elif TU_CHECK_MCU(OPT_MCU_STM32G4, OPT_MCU_STM32L1)
267 #elif CFG_TUSB_MCU == OPT_MCU_STM32H5
269 #elif CFG_TUSB_MCU == OPT_MCU_STM32L5
271 #elif CFG_TUSB_MCU == OPT_MCU_STM32WB
274 #elif CFG_TUSB_MCU == OPT_MCU_STM32U5
276 #elif CFG_TUSB_MCU == OPT_MCU_STM32U0
279 #error Unknown arch in USB driver
290 #if CFG_TUSB_MCU == OPT_MCU_STM32F3 && defined(SYSCFG_CFGR1_USB_IT_RMP)
294 if (SYSCFG->CFGR1 & SYSCFG_CFGR1_USB_IT_RMP) {
295 NVIC_EnableIRQ(USB_HP_IRQn);
296 NVIC_EnableIRQ(USB_LP_IRQn);
297 NVIC_EnableIRQ(USBWakeUp_RMP_IRQn);
310 #if CFG_TUSB_MCU == OPT_MCU_STM32F3 && defined(SYSCFG_CFGR1_USB_IT_RMP)
314 if (SYSCFG->CFGR1 & SYSCFG_CFGR1_USB_IT_RMP) {
315 NVIC_DisableIRQ(USB_HP_IRQn);
316 NVIC_DisableIRQ(USB_LP_IRQn);
317 NVIC_DisableIRQ(USBWakeUp_RMP_IRQn);
330#if defined(USB_BCDR_DPPU)
334 USB->BCDR &= ~(USB_BCDR_DPPU);
339 USB->BCDR |= USB_BCDR_DPPU;
342#elif defined(SYSCFG_PMC_USB_PU)
346 SYSCFG->PMC &= ~(SYSCFG_PMC_USB_PU);
351 SYSCFG->PMC |= SYSCFG_PMC_USB_PU;
static const IRQn_Type fsdev_irq[]
void dcd_disconnect(uint8_t rhport)
void dcd_int_disable(uint8_t rhport)
void dcd_connect(uint8_t rhport)
void dcd_int_enable(uint8_t rhport)