69#ifdef HAL_PCD_MODULE_ENABLED
71#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
80#define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b))
81#define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b))
90#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
91static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum);
92static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum);
93static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum);
125#if defined (USB_OTG_FS)
126 const USB_OTG_GlobalTypeDef *USBx;
139#if defined (USB_OTG_FS)
140 USBx = hpcd->Instance;
143 if (hpcd->State == HAL_PCD_STATE_RESET)
148#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
149 hpcd->SOFCallback = HAL_PCD_SOFCallback;
150 hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback;
151 hpcd->ResetCallback = HAL_PCD_ResetCallback;
152 hpcd->SuspendCallback = HAL_PCD_SuspendCallback;
153 hpcd->ResumeCallback = HAL_PCD_ResumeCallback;
154 hpcd->ConnectCallback = HAL_PCD_ConnectCallback;
155 hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback;
156 hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback;
157 hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback;
158 hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback;
159 hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback;
160 hpcd->LPMCallback = HAL_PCDEx_LPM_Callback;
161 hpcd->BCDCallback = HAL_PCDEx_BCD_Callback;
163 if (hpcd->MspInitCallback == NULL)
165 hpcd->MspInitCallback = HAL_PCD_MspInit;
169 hpcd->MspInitCallback(hpcd);
172 HAL_PCD_MspInit(hpcd);
176 hpcd->State = HAL_PCD_STATE_BUSY;
178#if defined (USB_OTG_FS)
180 if (USBx == USB_OTG_FS)
182 hpcd->Init.dma_enable = 0U;
187 __HAL_PCD_DISABLE(hpcd);
190 if (USB_CoreInit(hpcd->Instance, hpcd->Init) !=
HAL_OK)
192 hpcd->State = HAL_PCD_STATE_ERROR;
197 if (USB_SetCurrentMode(hpcd->Instance, USB_DEVICE_MODE) !=
HAL_OK)
199 hpcd->State = HAL_PCD_STATE_ERROR;
204 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
207 hpcd->IN_ep[i].is_in = 1U;
208 hpcd->IN_ep[i].num = i;
209 hpcd->IN_ep[i].tx_fifo_num = i;
211 hpcd->IN_ep[i].type = EP_TYPE_CTRL;
212 hpcd->IN_ep[i].maxpacket = 0U;
213 hpcd->IN_ep[i].xfer_buff = 0U;
214 hpcd->IN_ep[i].xfer_len = 0U;
217 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
219 hpcd->OUT_ep[i].is_in = 0U;
220 hpcd->OUT_ep[i].num = i;
222 hpcd->OUT_ep[i].type = EP_TYPE_CTRL;
223 hpcd->OUT_ep[i].maxpacket = 0U;
224 hpcd->OUT_ep[i].xfer_buff = 0U;
225 hpcd->OUT_ep[i].xfer_len = 0U;
229 if (USB_DevInit(hpcd->Instance, hpcd->Init) !=
HAL_OK)
231 hpcd->State = HAL_PCD_STATE_ERROR;
235 hpcd->USB_Address = 0U;
236 hpcd->State = HAL_PCD_STATE_READY;
237#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \
238 || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \
239 || defined(STM32F423xx)
241 if (hpcd->Init.lpm_enable == 1U)
243 (void)HAL_PCDEx_ActivateLPM(hpcd);
248 (void)USB_DevDisconnect(hpcd->Instance);
266 hpcd->State = HAL_PCD_STATE_BUSY;
269 if (USB_StopDevice(hpcd->Instance) !=
HAL_OK)
274#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
275 if (hpcd->MspDeInitCallback == NULL)
277 hpcd->MspDeInitCallback = HAL_PCD_MspDeInit;
281 hpcd->MspDeInitCallback(hpcd);
284 HAL_PCD_MspDeInit(hpcd);
287 hpcd->State = HAL_PCD_STATE_RESET;
297__weak
void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
312__weak
void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
322#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
342 HAL_PCD_CallbackIDTypeDef CallbackID,
343 pPCD_CallbackTypeDef pCallback)
347 if (pCallback == NULL)
350 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
356 if (hpcd->State == HAL_PCD_STATE_READY)
360 case HAL_PCD_SOF_CB_ID :
361 hpcd->SOFCallback = pCallback;
364 case HAL_PCD_SETUPSTAGE_CB_ID :
365 hpcd->SetupStageCallback = pCallback;
368 case HAL_PCD_RESET_CB_ID :
369 hpcd->ResetCallback = pCallback;
372 case HAL_PCD_SUSPEND_CB_ID :
373 hpcd->SuspendCallback = pCallback;
376 case HAL_PCD_RESUME_CB_ID :
377 hpcd->ResumeCallback = pCallback;
380 case HAL_PCD_CONNECT_CB_ID :
381 hpcd->ConnectCallback = pCallback;
384 case HAL_PCD_DISCONNECT_CB_ID :
385 hpcd->DisconnectCallback = pCallback;
388 case HAL_PCD_MSPINIT_CB_ID :
389 hpcd->MspInitCallback = pCallback;
392 case HAL_PCD_MSPDEINIT_CB_ID :
393 hpcd->MspDeInitCallback = pCallback;
398 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
404 else if (hpcd->State == HAL_PCD_STATE_RESET)
408 case HAL_PCD_MSPINIT_CB_ID :
409 hpcd->MspInitCallback = pCallback;
412 case HAL_PCD_MSPDEINIT_CB_ID :
413 hpcd->MspDeInitCallback = pCallback;
418 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
427 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
454HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID)
462 if (hpcd->State == HAL_PCD_STATE_READY)
466 case HAL_PCD_SOF_CB_ID :
467 hpcd->SOFCallback = HAL_PCD_SOFCallback;
470 case HAL_PCD_SETUPSTAGE_CB_ID :
471 hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback;
474 case HAL_PCD_RESET_CB_ID :
475 hpcd->ResetCallback = HAL_PCD_ResetCallback;
478 case HAL_PCD_SUSPEND_CB_ID :
479 hpcd->SuspendCallback = HAL_PCD_SuspendCallback;
482 case HAL_PCD_RESUME_CB_ID :
483 hpcd->ResumeCallback = HAL_PCD_ResumeCallback;
486 case HAL_PCD_CONNECT_CB_ID :
487 hpcd->ConnectCallback = HAL_PCD_ConnectCallback;
490 case HAL_PCD_DISCONNECT_CB_ID :
491 hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback;
494 case HAL_PCD_MSPINIT_CB_ID :
495 hpcd->MspInitCallback = HAL_PCD_MspInit;
498 case HAL_PCD_MSPDEINIT_CB_ID :
499 hpcd->MspDeInitCallback = HAL_PCD_MspDeInit;
504 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
511 else if (hpcd->State == HAL_PCD_STATE_RESET)
515 case HAL_PCD_MSPINIT_CB_ID :
516 hpcd->MspInitCallback = HAL_PCD_MspInit;
519 case HAL_PCD_MSPDEINIT_CB_ID :
520 hpcd->MspDeInitCallback = HAL_PCD_MspDeInit;
525 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
535 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
554 pPCD_DataOutStageCallbackTypeDef pCallback)
558 if (pCallback == NULL)
561 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
569 if (hpcd->State == HAL_PCD_STATE_READY)
571 hpcd->DataOutStageCallback = pCallback;
576 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
601 if (hpcd->State == HAL_PCD_STATE_READY)
603 hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback;
608 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
628 pPCD_DataInStageCallbackTypeDef pCallback)
632 if (pCallback == NULL)
635 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
643 if (hpcd->State == HAL_PCD_STATE_READY)
645 hpcd->DataInStageCallback = pCallback;
650 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
675 if (hpcd->State == HAL_PCD_STATE_READY)
677 hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback;
682 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
702 pPCD_IsoOutIncpltCallbackTypeDef pCallback)
706 if (pCallback == NULL)
709 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
717 if (hpcd->State == HAL_PCD_STATE_READY)
719 hpcd->ISOOUTIncompleteCallback = pCallback;
724 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
750 if (hpcd->State == HAL_PCD_STATE_READY)
752 hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback;
757 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
777 pPCD_IsoInIncpltCallbackTypeDef pCallback)
781 if (pCallback == NULL)
784 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
792 if (hpcd->State == HAL_PCD_STATE_READY)
794 hpcd->ISOINIncompleteCallback = pCallback;
799 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
825 if (hpcd->State == HAL_PCD_STATE_READY)
827 hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback;
832 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
851HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback)
855 if (pCallback == NULL)
858 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
866 if (hpcd->State == HAL_PCD_STATE_READY)
868 hpcd->BCDCallback = pCallback;
873 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
898 if (hpcd->State == HAL_PCD_STATE_READY)
900 hpcd->BCDCallback = HAL_PCDEx_BCD_Callback;
905 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
924HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback)
928 if (pCallback == NULL)
931 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
939 if (hpcd->State == HAL_PCD_STATE_READY)
941 hpcd->LPMCallback = pCallback;
946 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
971 if (hpcd->State == HAL_PCD_STATE_READY)
973 hpcd->LPMCallback = HAL_PCDEx_LPM_Callback;
978 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
1017 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1021 if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) &&
1022 (hpcd->Init.battery_charging_enable == 1U))
1025 USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN;
1028 __HAL_PCD_ENABLE(hpcd);
1029 (void)USB_DevConnect(hpcd->Instance);
1042 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1045 __HAL_PCD_DISABLE(hpcd);
1046 (void)USB_DevDisconnect(hpcd->Instance);
1048 (void)USB_FlushTxFifo(hpcd->Instance, 0x10U);
1050 if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) &&
1051 (hpcd->Init.battery_charging_enable == 1U))
1054 USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);
1062#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
1068void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
1070 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1071 uint32_t USBx_BASE = (uint32_t)USBx;
1072 USB_OTG_EPTypeDef *ep;
1077 uint32_t fifoemptymsk;
1081 if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE)
1084 if (__HAL_PCD_IS_INVALID_INTERRUPT(hpcd))
1090 hpcd->FrameNumber = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF_Msk) >> USB_OTG_DSTS_FNSOF_Pos;
1092 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS))
1095 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS);
1099 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL))
1101 USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
1103 RegVal = USBx->GRXSTSP;
1105 ep = &hpcd->OUT_ep[RegVal & USB_OTG_GRXSTSP_EPNUM];
1107 if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT)
1109 if ((RegVal & USB_OTG_GRXSTSP_BCNT) != 0U)
1111 (void)USB_ReadPacket(USBx, ep->xfer_buff,
1112 (uint16_t)((RegVal & USB_OTG_GRXSTSP_BCNT) >> 4));
1114 ep->xfer_buff += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4;
1115 ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4;
1118 else if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT)
1120 (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U);
1121 ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4;
1128 USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
1131 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT))
1136 ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance);
1138 while (ep_intr != 0U)
1140 if ((ep_intr & 0x1U) != 0U)
1142 epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, (uint8_t)epnum);
1144 if ((epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC)
1146 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC);
1147 (void)PCD_EP_OutXfrComplete_int(hpcd, epnum);
1150 if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP)
1152 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP);
1154 (void)PCD_EP_OutSetupPacket_int(hpcd, epnum);
1157 if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS)
1159 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS);
1163 if ((epint & USB_OTG_DOEPINT_EPDISD) == USB_OTG_DOEPINT_EPDISD)
1165 if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == USB_OTG_GINTSTS_BOUTNAKEFF)
1167 USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGONAK;
1170 ep = &hpcd->OUT_ep[epnum];
1172 if (ep->is_iso_incomplete == 1U)
1174 ep->is_iso_incomplete = 0U;
1176#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1177 hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum);
1179 HAL_PCD_ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum);
1183 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_EPDISD);
1187 if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR)
1189 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);
1193 if ((epint & USB_OTG_DOEPINT_NAK) == USB_OTG_DOEPINT_NAK)
1195 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_NAK);
1203 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT))
1206 ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance);
1210 while (ep_intr != 0U)
1212 if ((ep_intr & 0x1U) != 0U)
1214 epint = USB_ReadDevInEPInterrupt(hpcd->Instance, (uint8_t)epnum);
1216 if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC)
1218 fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));
1219 USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
1221 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC);
1223 if (hpcd->Init.dma_enable == 1U)
1225 hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket;
1228 if ((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U))
1231 (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
1235#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1236 hpcd->DataInStageCallback(hpcd, (uint8_t)epnum);
1238 HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum);
1241 if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC)
1243 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC);
1245 if ((epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE)
1247 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE);
1249 if ((epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE)
1251 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE);
1253 if ((epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD)
1255 (void)USB_FlushTxFifo(USBx, epnum);
1257 ep = &hpcd->IN_ep[epnum];
1259 if (ep->is_iso_incomplete == 1U)
1261 ep->is_iso_incomplete = 0U;
1263#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1264 hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum);
1266 HAL_PCD_ISOINIncompleteCallback(hpcd, (uint8_t)epnum);
1270 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD);
1272 if ((epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE)
1274 (void)PCD_WriteEmptyTxFifo(hpcd, epnum);
1283 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT))
1286 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
1288 if (hpcd->LPM_State == LPM_L1)
1290 hpcd->LPM_State = LPM_L0;
1292#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1293 hpcd->LPMCallback(hpcd, PCD_LPM_L0_ACTIVE);
1295 HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L0_ACTIVE);
1300#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1301 hpcd->ResumeCallback(hpcd);
1303 HAL_PCD_ResumeCallback(hpcd);
1307 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT);
1311 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP))
1313 if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)
1315#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1316 hpcd->SuspendCallback(hpcd);
1318 HAL_PCD_SuspendCallback(hpcd);
1321 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP);
1323#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \
1324 || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \
1325 || defined(STM32F423xx)
1327 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT))
1329 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT);
1331 if (hpcd->LPM_State == LPM_L0)
1333 hpcd->LPM_State = LPM_L1;
1334 hpcd->BESL = (hpcd->Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >> 2U;
1336#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1337 hpcd->LPMCallback(hpcd, PCD_LPM_L1_ACTIVE);
1339 HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE);
1344#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1345 hpcd->SuspendCallback(hpcd);
1347 HAL_PCD_SuspendCallback(hpcd);
1355 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST))
1357 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
1358 (void)USB_FlushTxFifo(hpcd->Instance, 0x10U);
1360 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
1362 USBx_INEP(i)->DIEPINT = 0xFB7FU;
1363 USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL;
1364 USBx_OUTEP(i)->DOEPINT = 0xFB7FU;
1365 USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL;
1366 USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK;
1368 USBx_DEVICE->DAINTMSK |= 0x10001U;
1370 if (hpcd->Init.use_dedicated_ep1 != 0U)
1372 USBx_DEVICE->DOUTEP1MSK |= USB_OTG_DOEPMSK_STUPM |
1373 USB_OTG_DOEPMSK_XFRCM |
1374 USB_OTG_DOEPMSK_EPDM;
1376 USBx_DEVICE->DINEP1MSK |= USB_OTG_DIEPMSK_TOM |
1377 USB_OTG_DIEPMSK_XFRCM |
1378 USB_OTG_DIEPMSK_EPDM;
1382 USBx_DEVICE->DOEPMSK |= USB_OTG_DOEPMSK_STUPM |
1383 USB_OTG_DOEPMSK_XFRCM |
1384 USB_OTG_DOEPMSK_EPDM |
1385 USB_OTG_DOEPMSK_OTEPSPRM |
1386 USB_OTG_DOEPMSK_NAKM;
1388 USBx_DEVICE->DIEPMSK |= USB_OTG_DIEPMSK_TOM |
1389 USB_OTG_DIEPMSK_XFRCM |
1390 USB_OTG_DIEPMSK_EPDM;
1394 USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD;
1397 (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable,
1398 (uint8_t *)hpcd->Setup);
1400 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST);
1404 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE))
1406 (void)USB_ActivateSetup(hpcd->Instance);
1407 hpcd->Init.speed = USB_GetDevSpeed(hpcd->Instance);
1410 (void)USB_SetTurnaroundTime(hpcd->Instance,
1412 (uint8_t)hpcd->Init.speed);
1414#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1415 hpcd->ResetCallback(hpcd);
1417 HAL_PCD_ResetCallback(hpcd);
1420 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE);
1424 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF))
1426#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1427 hpcd->SOFCallback(hpcd);
1429 HAL_PCD_SOFCallback(hpcd);
1432 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF);
1436 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_BOUTNAKEFF))
1438 USBx->GINTMSK &= ~USB_OTG_GINTMSK_GONAKEFFM;
1440 for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++)
1442 if (hpcd->OUT_ep[epnum].is_iso_incomplete == 1U)
1445 (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)epnum);
1451 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR))
1453 for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++)
1455 RegVal = USBx_INEP(epnum)->DIEPCTL;
1457 if ((hpcd->IN_ep[epnum].type == EP_TYPE_ISOC) &&
1458 ((RegVal & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA))
1460 hpcd->IN_ep[epnum].is_iso_incomplete = 1U;
1463 (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)(epnum | 0x80U));
1467 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR);
1471 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
1473 for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++)
1475 RegVal = USBx_OUTEP(epnum)->DOEPCTL;
1477 if ((hpcd->OUT_ep[epnum].type == EP_TYPE_ISOC) &&
1478 ((RegVal & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) &&
1479 (((RegVal & (0x1U << 16)) >> 16U) == (hpcd->FrameNumber & 0x1U)))
1481 hpcd->OUT_ep[epnum].is_iso_incomplete = 1U;
1483 USBx->GINTMSK |= USB_OTG_GINTMSK_GONAKEFFM;
1485 if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == 0U)
1487 USBx_DEVICE->DCTL |= USB_OTG_DCTL_SGONAK;
1493 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
1497 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT))
1499#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1500 hpcd->ConnectCallback(hpcd);
1502 HAL_PCD_ConnectCallback(hpcd);
1505 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT);
1509 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT))
1511 RegVal = hpcd->Instance->GOTGINT;
1513 if ((RegVal & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET)
1515#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1516 hpcd->DisconnectCallback(hpcd);
1518 HAL_PCD_DisconnectCallback(hpcd);
1521 hpcd->Instance->GOTGINT |= RegVal;
1532void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd)
1534#if defined (USB_OTG_FS)
1535 USB_OTG_GlobalTypeDef *USBx;
1536 USBx = hpcd->Instance;
1538 if (USBx == USB_OTG_FS)
1541 __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG();
1547 __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG();
1559__weak
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
1576__weak
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
1591__weak
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
1606__weak
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
1621__weak
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
1636__weak
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
1651__weak
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
1667__weak
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
1684__weak
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
1700__weak
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
1715__weak
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
1751 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1755 if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) &&
1756 (hpcd->Init.battery_charging_enable == 1U))
1759 USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN;
1761 (void)USB_DevConnect(hpcd->Instance);
1774 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1777 (void)USB_DevDisconnect(hpcd->Instance);
1779 if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) &&
1780 (hpcd->Init.battery_charging_enable == 1U))
1783 USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);
1800 hpcd->USB_Address = address;
1801 (void)USB_SetDevAddress(hpcd->Instance, address);
1815 uint16_t ep_mps, uint8_t ep_type)
1820 if ((ep_addr & 0x80U) == 0x80U)
1822 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1827 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1831 ep->num = ep_addr & EP_ADDR_MSK;
1832 ep->maxpacket = (uint32_t)ep_mps & 0x7FFU;
1835 if (ep->is_in != 0U)
1838 ep->tx_fifo_num = ep->num;
1842 if (ep_type == EP_TYPE_BULK)
1844 ep->data_pid_start = 0U;
1848 (void)USB_ActivateEndpoint(hpcd->Instance, ep);
1864 if ((ep_addr & 0x80U) == 0x80U)
1866 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1871 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1874 ep->num = ep_addr & EP_ADDR_MSK;
1877 (void)USB_DeactivateEndpoint(hpcd->Instance, ep);
1891HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
1895 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1898 ep->xfer_buff = pBuf;
1900 ep->xfer_count = 0U;
1902 ep->num = ep_addr & EP_ADDR_MSK;
1904 if (hpcd->Init.dma_enable == 1U)
1906 ep->dma_addr = (uint32_t)pBuf;
1909 (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable);
1920uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef
const *hpcd, uint8_t ep_addr)
1922 return hpcd->OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count;
1932HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
1936 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1939 ep->xfer_buff = pBuf;
1941 ep->xfer_count = 0U;
1943 ep->num = ep_addr & EP_ADDR_MSK;
1945 if (hpcd->Init.dma_enable == 1U)
1947 ep->dma_addr = (uint32_t)pBuf;
1950 (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable);
1965 if (((uint32_t)ep_addr & EP_ADDR_MSK) > hpcd->Init.dev_endpoints)
1970 if ((0x80U & ep_addr) == 0x80U)
1972 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1977 ep = &hpcd->OUT_ep[ep_addr];
1982 ep->num = ep_addr & EP_ADDR_MSK;
1986 (void)USB_EPSetStall(hpcd->Instance, ep);
1988 if ((ep_addr & EP_ADDR_MSK) == 0U)
1990 (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup);
2008 if (((uint32_t)ep_addr & 0x0FU) > hpcd->Init.dev_endpoints)
2013 if ((0x80U & ep_addr) == 0x80U)
2015 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
2020 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
2025 ep->num = ep_addr & EP_ADDR_MSK;
2028 (void)USB_EPClearStall(hpcd->Instance, ep);
2045 if ((0x80U & ep_addr) == 0x80U)
2047 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
2051 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
2055 ret = USB_EPStopXfer(hpcd->Instance, ep);
2070 if ((ep_addr & 0x80U) == 0x80U)
2072 (void)USB_FlushTxFifo(hpcd->Instance, (uint32_t)ep_addr & EP_ADDR_MSK);
2076 (void)USB_FlushRxFifo(hpcd->Instance);
2091 return (USB_ActivateRemoteWakeup(hpcd->Instance));
2101 return (USB_DeActivateRemoteWakeup(hpcd->Instance));
2128PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef
const *hpcd)
2133#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
2140HAL_StatusTypeDef HAL_PCD_SetTestMode(
const PCD_HandleTypeDef *hpcd, uint8_t testmode)
2142 const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
2143 uint32_t USBx_BASE = (uint32_t)USBx;
2152 USBx_DEVICE->DCTL &= ~(0x7U << 4);
2153 USBx_DEVICE->DCTL |= (uint32_t)testmode << 4;
2175#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
2182static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
2184 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
2185 uint32_t USBx_BASE = (uint32_t)USBx;
2186 USB_OTG_EPTypeDef *ep;
2189 uint32_t fifoemptymsk;
2191 ep = &hpcd->IN_ep[epnum];
2193 if (ep->xfer_count > ep->xfer_len)
2198 len = ep->xfer_len - ep->xfer_count;
2200 if (len > ep->maxpacket)
2202 len = ep->maxpacket;
2205 len32b = (len + 3U) / 4U;
2207 while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b) &&
2208 (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0U))
2211 len = ep->xfer_len - ep->xfer_count;
2213 if (len > ep->maxpacket)
2215 len = ep->maxpacket;
2217 len32b = (len + 3U) / 4U;
2219 (void)USB_WritePacket(USBx, ep->xfer_buff, (uint8_t)epnum, (uint16_t)len,
2220 (uint8_t)hpcd->Init.dma_enable);
2222 ep->xfer_buff += len;
2223 ep->xfer_count += len;
2226 if (ep->xfer_len <= ep->xfer_count)
2228 fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));
2229 USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
2242static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
2244 USB_OTG_EPTypeDef *ep;
2245 const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
2246 uint32_t USBx_BASE = (uint32_t)USBx;
2247 uint32_t gSNPSiD = *(__IO
const uint32_t *)(&USBx->CID + 0x1U);
2248 uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;
2250 if (hpcd->Init.dma_enable == 1U)
2252 if ((DoepintReg & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP)
2255 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2256 ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX))
2258 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);
2261 else if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR)
2263 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);
2265 else if ((DoepintReg & (USB_OTG_DOEPINT_STUP | USB_OTG_DOEPINT_OTEPSPR)) == 0U)
2268 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2269 ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX))
2271 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);
2275 ep = &hpcd->OUT_ep[epnum];
2278 ep->xfer_count = ep->xfer_size - (USBx_OUTEP(epnum)->DOEPTSIZ & USB_OTG_DOEPTSIZ_XFRSIZ);
2282 if (ep->xfer_len == 0U)
2285 (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
2289 ep->xfer_buff += ep->xfer_count;
2293#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2294 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2296 HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum);
2307 if (gSNPSiD == USB_OTG_CORE_ID_310A)
2310 if ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)
2312 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);
2316 if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR)
2318 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);
2321#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2322 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2324 HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum);
2330 if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U))
2333 (void)USB_EP0_OutStart(hpcd->Instance, 0U, (uint8_t *)hpcd->Setup);
2336#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2337 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2339 HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum);
2354static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
2356 const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
2357 uint32_t USBx_BASE = (uint32_t)USBx;
2358 uint32_t gSNPSiD = *(__IO
const uint32_t *)(&USBx->CID + 0x1U);
2359 uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;
2361 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2362 ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX))
2364 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);
2368#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2369 hpcd->SetupStageCallback(hpcd);
2371 HAL_PCD_SetupStageCallback(hpcd);
2374 if ((gSNPSiD > USB_OTG_CORE_ID_300A) && (hpcd->Init.dma_enable == 1U))
2376 (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
uint32_t HAL_RCC_GetHCLKFreq(void)
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)