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)
125#if defined (USB_OTG_FS)
126 const USB_OTG_GlobalTypeDef *USBx;
139#if defined (USB_OTG_FS)
148#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
163 if (hpcd->MspInitCallback == NULL)
169 hpcd->MspInitCallback(hpcd);
178#if defined (USB_OTG_FS)
180 if (USBx == USB_OTG_FS)
182 hpcd->
Init.dma_enable = 0U;
197 if (USB_SetCurrentMode(hpcd->
Instance, USB_DEVICE_MODE) !=
HAL_OK)
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;
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;
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)
248 (void)USB_DevDisconnect(hpcd->
Instance);
274#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
275 if (hpcd->MspDeInitCallback == NULL)
281 hpcd->MspDeInitCallback(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;
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;
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;
466 case HAL_PCD_SOF_CB_ID :
470 case HAL_PCD_SETUPSTAGE_CB_ID :
474 case HAL_PCD_RESET_CB_ID :
478 case HAL_PCD_SUSPEND_CB_ID :
482 case HAL_PCD_RESUME_CB_ID :
486 case HAL_PCD_CONNECT_CB_ID :
490 case HAL_PCD_DISCONNECT_CB_ID :
494 case HAL_PCD_MSPINIT_CB_ID :
498 case HAL_PCD_MSPDEINIT_CB_ID :
504 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
515 case HAL_PCD_MSPINIT_CB_ID :
519 case HAL_PCD_MSPDEINIT_CB_ID :
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;
571 hpcd->DataOutStageCallback = pCallback;
576 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
608 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
628 pPCD_DataInStageCallbackTypeDef pCallback)
632 if (pCallback == NULL)
635 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
645 hpcd->DataInStageCallback = pCallback;
650 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
682 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
702 pPCD_IsoOutIncpltCallbackTypeDef pCallback)
706 if (pCallback == NULL)
709 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
719 hpcd->ISOOUTIncompleteCallback = pCallback;
724 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
757 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
777 pPCD_IsoInIncpltCallbackTypeDef pCallback)
781 if (pCallback == NULL)
784 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
794 hpcd->ISOINIncompleteCallback = pCallback;
799 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
832 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
855 if (pCallback == NULL)
858 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
868 hpcd->BCDCallback = pCallback;
873 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
905 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
928 if (pCallback == NULL)
931 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
941 hpcd->LPMCallback = pCallback;
946 hpcd->
ErrorCode |= HAL_PCD_ERROR_INVALID_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;
1029 (void)USB_DevConnect(hpcd->
Instance);
1042 USB_OTG_GlobalTypeDef *USBx = hpcd->
Instance;
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)
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)
1090 hpcd->
FrameNumber = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF_Msk) >> USB_OTG_DSTS_FNSOF_Pos;
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);
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);
1150 if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP)
1152 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP);
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);
1183 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_EPDISD);
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);
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);
1270 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD);
1272 if ((epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE)
1286 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
1292#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1300#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1301 hpcd->ResumeCallback(hpcd);
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);
1323#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \
1324 || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \
1325 || defined(STM32F423xx)
1334 hpcd->
BESL = (hpcd->
Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >> 2U;
1336#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1344#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1345 hpcd->SuspendCallback(hpcd);
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 |
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);
1406 (void)USB_ActivateSetup(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);
1426#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1427 hpcd->SOFCallback(hpcd);
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)
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;
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)) == (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;
1499#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1500 hpcd->ConnectCallback(hpcd);
1513 if ((RegVal & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET)
1515#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1516 hpcd->DisconnectCallback(hpcd);
1534#if defined (USB_OTG_FS)
1535 USB_OTG_GlobalTypeDef *USBx;
1538 if (USBx == USB_OTG_FS)
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);
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);
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);
1922 return hpcd->
OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count;
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));
2133#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
2142 const USB_OTG_GlobalTypeDef *USBx = hpcd->
Instance;
2143 uint32_t USBx_BASE = (uint32_t)USBx;
2152 USBx_DEVICE->DCTL |= (uint32_t)testmode << 4;
2174#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
2183 USB_OTG_GlobalTypeDef *USBx = hpcd->
Instance;
2184 uint32_t USBx_BASE = (uint32_t)USBx;
2185 USB_OTG_EPTypeDef *ep;
2188 uint32_t fifoemptymsk;
2190 ep = &hpcd->
IN_ep[epnum];
2192 if (ep->xfer_count > ep->xfer_len)
2197 len = ep->xfer_len - ep->xfer_count;
2199 if (len > ep->maxpacket)
2201 len = ep->maxpacket;
2204 len32b = (len + 3U) / 4U;
2206 while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b) &&
2207 (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0U))
2210 len = ep->xfer_len - ep->xfer_count;
2212 if (len > ep->maxpacket)
2214 len = ep->maxpacket;
2216 len32b = (len + 3U) / 4U;
2218 (void)USB_WritePacket(USBx, ep->xfer_buff, (uint8_t)epnum, (uint16_t)len,
2219 (uint8_t)hpcd->
Init.dma_enable);
2221 ep->xfer_buff += len;
2222 ep->xfer_count += len;
2225 if (ep->xfer_len <= ep->xfer_count)
2227 fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));
2228 USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
2243 USB_OTG_EPTypeDef *ep;
2244 const USB_OTG_GlobalTypeDef *USBx = hpcd->
Instance;
2245 uint32_t USBx_BASE = (uint32_t)USBx;
2246 uint32_t gSNPSiD = *(__IO
const uint32_t *)(&USBx->CID + 0x1U);
2247 uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;
2249 if (hpcd->
Init.dma_enable == 1U)
2251 if ((DoepintReg & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP)
2254 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2267 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2274 ep = &hpcd->
OUT_ep[epnum];
2277 ep->xfer_count = ep->xfer_size - (USBx_OUTEP(epnum)->DOEPTSIZ & USB_OTG_DOEPTSIZ_XFRSIZ);
2281 if (ep->xfer_len == 0U)
2284 (void)USB_EP0_OutStart(hpcd->
Instance, 1U, (uint8_t *)hpcd->
Setup);
2288 ep->xfer_buff += ep->xfer_count;
2292#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2293 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2306 if (gSNPSiD == USB_OTG_CORE_ID_310A)
2320#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2321 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2329 if ((epnum == 0U) && (hpcd->
OUT_ep[epnum].xfer_len == 0U))
2332 (void)USB_EP0_OutStart(hpcd->
Instance, 0U, (uint8_t *)hpcd->
Setup);
2335#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2336 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2355 const USB_OTG_GlobalTypeDef *USBx = hpcd->
Instance;
2356 uint32_t USBx_BASE = (uint32_t)USBx;
2357 uint32_t gSNPSiD = *(__IO
const uint32_t *)(&USBx->CID + 0x1U);
2358 uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;
2360 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2367#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2368 hpcd->SetupStageCallback(hpcd);
2373 if ((gSNPSiD > USB_OTG_CORE_ID_300A) && (hpcd->
Init.dma_enable == 1U))
2375 (void)USB_EP0_OutStart(hpcd->
Instance, 1U, (uint8_t *)hpcd->
Setup);
void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
Send LPM message to user layer callback.
void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg)
Send BatteryCharging message to user layer callback.
HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd)
Activate LPM feature.
void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
Initializes the PCD MSP.
void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
DeInitializes PCD MSP.
HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)
Initializes the PCD according to the specified parameters in the PCD_InitTypeDef and initialize the a...
HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd)
DeInitializes the PCD peripheral.
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
USB Start Of Frame callback.
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
Setup stage callback.
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Incomplete ISO OUT callback.
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
Suspend event callback.
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
Handles PCD interrupt request.
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Data IN stage callback.
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Incomplete ISO IN callback.
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
Disconnection event callback.
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
Connection event callback.
void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd)
Handles PCD Wakeup interrupt request.
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Data OUT stage callback.
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
USB Reset callback.
HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd)
Stop the USB device.
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
Resume event callback.
HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)
Start the USB device.
HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
Receive an amount of data.
HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
Send an amount of data.
HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Deactivate an endpoint.
HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Clear a STALL condition over in an endpoint.
HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address)
Set the USB Device address.
uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef const *hpcd, uint8_t ep_addr)
Get Received Data Size.
HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd)
Connect the USB device.
HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd)
Disconnect the USB device.
HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type)
Open and configure an endpoint.
HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
De-activate remote wakeup signalling.
HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
Activate remote wakeup signalling.
HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Set a STALL condition over an endpoint.
HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Flush an endpoint.
HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Abort an USB EP transaction.
PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef const *hpcd)
Return the PCD handle state.
HAL_StatusTypeDef HAL_PCD_SetTestMode(const PCD_HandleTypeDef *hpcd, uint8_t testmode)
Set the USB Device high speed test mode.
#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__)
#define __HAL_PCD_DISABLE(__HANDLE__)
#define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG()
#define __HAL_PCD_ENABLE(__HANDLE__)
#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__)
#define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG()
#define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__)
PCD_StateTypeDef
PCD State structure definition.
USB_OTG_EPTypeDef PCD_EPTypeDef
static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
process EP OUT setup packet received interrupt.
static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
process EP OUT transfer complete interrupt.
static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
Check FIFO for the next packet to be loaded.
#define USB_OTG_DOEPINT_NAK
#define USB_OTG_DOEPMSK_OTEPSPRM
#define USB_OTG_DOEPINT_OTEPSPR
#define USB_OTG_DOEPMSK_NAKM
#define USB_OTG_DOEPINT_STPKTRX
uint32_t HAL_RCC_GetHCLKFreq(void)
Returns the HCLK frequency.
#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__)
PCD Handle Structure definition.
PCD_LPM_StateTypeDef LPM_State
__IO PCD_StateTypeDef State