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);
136 if (hpcd->State == HAL_PCD_STATE_RESET)
141#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
153 hpcd->LPMCallback = HAL_PCDEx_LPM_Callback;
154 hpcd->BCDCallback = HAL_PCDEx_BCD_Callback;
156 if (hpcd->MspInitCallback ==
NULL)
162 hpcd->MspInitCallback(hpcd);
169 hpcd->State = HAL_PCD_STATE_BUSY;
172 __HAL_PCD_DISABLE(hpcd);
175 if (USB_CoreInit(hpcd->Instance, hpcd->Init) !=
HAL_OK)
177 hpcd->State = HAL_PCD_STATE_ERROR;
182 if (USB_SetCurrentMode(hpcd->Instance, USB_DEVICE_MODE) !=
HAL_OK)
184 hpcd->State = HAL_PCD_STATE_ERROR;
189 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
192 hpcd->IN_ep[i].is_in = 1U;
193 hpcd->IN_ep[i].num = i;
194 hpcd->IN_ep[i].tx_fifo_num = i;
196 hpcd->IN_ep[i].type = EP_TYPE_CTRL;
197 hpcd->IN_ep[i].maxpacket = 0U;
198 hpcd->IN_ep[i].xfer_buff = 0U;
199 hpcd->IN_ep[i].xfer_len = 0U;
202 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
204 hpcd->OUT_ep[i].is_in = 0U;
205 hpcd->OUT_ep[i].num = i;
207 hpcd->OUT_ep[i].type = EP_TYPE_CTRL;
208 hpcd->OUT_ep[i].maxpacket = 0U;
209 hpcd->OUT_ep[i].xfer_buff = 0U;
210 hpcd->OUT_ep[i].xfer_len = 0U;
214 if (USB_DevInit(hpcd->Instance, hpcd->Init) !=
HAL_OK)
216 hpcd->State = HAL_PCD_STATE_ERROR;
220 hpcd->USB_Address = 0U;
221 hpcd->State = HAL_PCD_STATE_READY;
224 if (hpcd->Init.lpm_enable == 1U)
226 (void)HAL_PCDEx_ActivateLPM(hpcd);
229 (void)USB_DevDisconnect(hpcd->Instance);
247 hpcd->State = HAL_PCD_STATE_BUSY;
250 if (USB_StopDevice(hpcd->Instance) !=
HAL_OK)
255#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
256 if (hpcd->MspDeInitCallback ==
NULL)
262 hpcd->MspDeInitCallback(hpcd);
268 hpcd->State = HAL_PCD_STATE_RESET;
303#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
323 HAL_PCD_CallbackIDTypeDef CallbackID,
324 pPCD_CallbackTypeDef pCallback)
328 if (pCallback ==
NULL)
331 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
337 if (hpcd->State == HAL_PCD_STATE_READY)
341 case HAL_PCD_SOF_CB_ID :
342 hpcd->SOFCallback = pCallback;
345 case HAL_PCD_SETUPSTAGE_CB_ID :
346 hpcd->SetupStageCallback = pCallback;
349 case HAL_PCD_RESET_CB_ID :
350 hpcd->ResetCallback = pCallback;
353 case HAL_PCD_SUSPEND_CB_ID :
354 hpcd->SuspendCallback = pCallback;
357 case HAL_PCD_RESUME_CB_ID :
358 hpcd->ResumeCallback = pCallback;
361 case HAL_PCD_CONNECT_CB_ID :
362 hpcd->ConnectCallback = pCallback;
365 case HAL_PCD_DISCONNECT_CB_ID :
366 hpcd->DisconnectCallback = pCallback;
369 case HAL_PCD_MSPINIT_CB_ID :
370 hpcd->MspInitCallback = pCallback;
373 case HAL_PCD_MSPDEINIT_CB_ID :
374 hpcd->MspDeInitCallback = pCallback;
379 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
385 else if (hpcd->State == HAL_PCD_STATE_RESET)
389 case HAL_PCD_MSPINIT_CB_ID :
390 hpcd->MspInitCallback = pCallback;
393 case HAL_PCD_MSPDEINIT_CB_ID :
394 hpcd->MspDeInitCallback = pCallback;
399 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
408 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
435HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID)
443 if (hpcd->State == HAL_PCD_STATE_READY)
447 case HAL_PCD_SOF_CB_ID :
451 case HAL_PCD_SETUPSTAGE_CB_ID :
455 case HAL_PCD_RESET_CB_ID :
459 case HAL_PCD_SUSPEND_CB_ID :
463 case HAL_PCD_RESUME_CB_ID :
467 case HAL_PCD_CONNECT_CB_ID :
471 case HAL_PCD_DISCONNECT_CB_ID :
475 case HAL_PCD_MSPINIT_CB_ID :
479 case HAL_PCD_MSPDEINIT_CB_ID :
485 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
492 else if (hpcd->State == HAL_PCD_STATE_RESET)
496 case HAL_PCD_MSPINIT_CB_ID :
500 case HAL_PCD_MSPDEINIT_CB_ID :
506 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
516 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
535 pPCD_DataOutStageCallbackTypeDef pCallback)
539 if (pCallback ==
NULL)
542 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
550 if (hpcd->State == HAL_PCD_STATE_READY)
552 hpcd->DataOutStageCallback = pCallback;
557 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
582 if (hpcd->State == HAL_PCD_STATE_READY)
589 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
609 pPCD_DataInStageCallbackTypeDef pCallback)
613 if (pCallback ==
NULL)
616 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
624 if (hpcd->State == HAL_PCD_STATE_READY)
626 hpcd->DataInStageCallback = pCallback;
631 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
656 if (hpcd->State == HAL_PCD_STATE_READY)
663 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
683 pPCD_IsoOutIncpltCallbackTypeDef pCallback)
687 if (pCallback ==
NULL)
690 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
698 if (hpcd->State == HAL_PCD_STATE_READY)
700 hpcd->ISOOUTIncompleteCallback = pCallback;
705 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
731 if (hpcd->State == HAL_PCD_STATE_READY)
738 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
758 pPCD_IsoInIncpltCallbackTypeDef pCallback)
762 if (pCallback ==
NULL)
765 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
773 if (hpcd->State == HAL_PCD_STATE_READY)
775 hpcd->ISOINIncompleteCallback = pCallback;
780 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
806 if (hpcd->State == HAL_PCD_STATE_READY)
813 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
832HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback)
836 if (pCallback ==
NULL)
839 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
847 if (hpcd->State == HAL_PCD_STATE_READY)
849 hpcd->BCDCallback = pCallback;
854 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
879 if (hpcd->State == HAL_PCD_STATE_READY)
881 hpcd->BCDCallback = HAL_PCDEx_BCD_Callback;
886 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
905HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback)
909 if (pCallback ==
NULL)
912 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
920 if (hpcd->State == HAL_PCD_STATE_READY)
922 hpcd->LPMCallback = pCallback;
927 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
952 if (hpcd->State == HAL_PCD_STATE_READY)
954 hpcd->LPMCallback = HAL_PCDEx_LPM_Callback;
959 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
1003 (hpcd->Init.battery_charging_enable == 1U))
1009 __HAL_PCD_ENABLE(hpcd);
1010 (void)USB_DevConnect(hpcd->Instance);
1026 __HAL_PCD_DISABLE(hpcd);
1027 (void)USB_DevDisconnect(hpcd->Instance);
1029 (void)USB_FlushTxFifo(hpcd->Instance, 0x10U);
1032 (hpcd->Init.battery_charging_enable == 1U))
1043#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
1049void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
1052 uint32_t USBx_BASE = (uint32_t)USBx;
1053 USB_OTG_EPTypeDef *ep;
1058 uint32_t fifoemptymsk;
1062 if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE)
1065 if (__HAL_PCD_IS_INVALID_INTERRUPT(hpcd))
1092 (void)USB_ReadPacket(USBx, ep->xfer_buff,
1101 (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U);
1117 ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance);
1119 while (ep_intr != 0U)
1121 if ((ep_intr & 0x1U) != 0U)
1123 epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, (uint8_t)epnum);
1128 (void)PCD_EP_OutXfrComplete_int(hpcd, epnum);
1135 (void)PCD_EP_OutSetupPacket_int(hpcd, epnum);
1151 ep = &hpcd->OUT_ep[epnum];
1153 if (ep->is_iso_incomplete == 1U)
1155 ep->is_iso_incomplete = 0U;
1157#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1158 hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum);
1187 ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance);
1191 while (ep_intr != 0U)
1193 if ((ep_intr & 0x1U) != 0U)
1195 epint = USB_ReadDevInEPInterrupt(hpcd->Instance, (uint8_t)epnum);
1199 fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));
1200 USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
1204 if (hpcd->Init.dma_enable == 1U)
1206 hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket;
1209 if ((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U))
1212 (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
1216#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1217 hpcd->DataInStageCallback(hpcd, (uint8_t)epnum);
1236 (void)USB_FlushTxFifo(USBx, epnum);
1238 ep = &hpcd->IN_ep[epnum];
1240 if (ep->is_iso_incomplete == 1U)
1242 ep->is_iso_incomplete = 0U;
1244#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1245 hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum);
1255 (void)PCD_WriteEmptyTxFifo(hpcd, epnum);
1269 if (hpcd->LPM_State == LPM_L1)
1271 hpcd->LPM_State = LPM_L0;
1273#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1274 hpcd->LPMCallback(hpcd, PCD_LPM_L0_ACTIVE);
1276 HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L0_ACTIVE);
1281#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1282 hpcd->ResumeCallback(hpcd);
1296#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1297 hpcd->SuspendCallback(hpcd);
1310 if (hpcd->LPM_State == LPM_L0)
1312 hpcd->LPM_State = LPM_L1;
1315#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1316 hpcd->LPMCallback(hpcd, PCD_LPM_L1_ACTIVE);
1318 HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE);
1323#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1324 hpcd->SuspendCallback(hpcd);
1335 (void)USB_FlushTxFifo(hpcd->Instance, 0x10U);
1337 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
1339 USBx_INEP(i)->DIEPINT = 0xFB7FU;
1341 USBx_OUTEP(i)->DOEPINT = 0xFB7FU;
1345 USBx_DEVICE->DAINTMSK |= 0x10001U;
1347 if (hpcd->Init.use_dedicated_ep1 != 0U)
1374 (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable,
1375 (uint8_t *)hpcd->Setup);
1383 (void)USB_ActivateSetup(hpcd->Instance);
1384 hpcd->Init.speed = USB_GetDevSpeed(hpcd->Instance);
1387 (void)USB_SetTurnaroundTime(hpcd->Instance,
1389 (uint8_t)hpcd->Init.speed);
1391#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1392 hpcd->ResetCallback(hpcd);
1403#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1404 hpcd->SOFCallback(hpcd);
1417 for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++)
1419 if (hpcd->OUT_ep[epnum].is_iso_incomplete == 1U)
1431 for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++)
1433 RegVal = USBx_INEP(epnum)->DIEPCTL;
1435 if ((hpcd->IN_ep[epnum].type == EP_TYPE_ISOC) &&
1438 hpcd->IN_ep[epnum].is_iso_incomplete = 1U;
1441 (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)(epnum | 0x80U));
1451 for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++)
1453 RegVal = USBx_OUTEP(epnum)->DOEPCTL;
1455 if ((hpcd->OUT_ep[epnum].type == EP_TYPE_ISOC) &&
1457 (((RegVal & (0x1UL << 16)) >> 16U) == (hpcd->FrameNumber & 0x1U)))
1459 hpcd->OUT_ep[epnum].is_iso_incomplete = 1U;
1477#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1478 hpcd->ConnectCallback(hpcd);
1489 RegVal = hpcd->Instance->GOTGINT;
1493#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1494 hpcd->DisconnectCallback(hpcd);
1499 hpcd->Instance->GOTGINT |= RegVal;
1709 (hpcd->Init.battery_charging_enable == 1U))
1714 (void)USB_DevConnect(hpcd->Instance);
1730 (void)USB_DevDisconnect(hpcd->Instance);
1733 (hpcd->Init.battery_charging_enable == 1U))
1753 hpcd->USB_Address = address;
1754 (void)USB_SetDevAddress(hpcd->Instance, address);
1768 uint16_t ep_mps, uint8_t ep_type)
1773 if ((ep_addr & 0x80U) == 0x80U)
1775 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1780 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1784 ep->num = ep_addr & EP_ADDR_MSK;
1785 ep->maxpacket = (uint32_t)ep_mps & 0x7FFU;
1788 if (ep->is_in != 0U)
1791 ep->tx_fifo_num = ep->num;
1795 if (ep_type == EP_TYPE_BULK)
1797 ep->data_pid_start = 0U;
1801 (void)USB_ActivateEndpoint(hpcd->Instance, ep);
1817 if ((ep_addr & 0x80U) == 0x80U)
1819 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1824 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1827 ep->num = ep_addr & EP_ADDR_MSK;
1830 (void)USB_DeactivateEndpoint(hpcd->Instance, ep);
1844HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
1848 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1851 ep->xfer_buff = pBuf;
1853 ep->xfer_count = 0U;
1855 ep->num = ep_addr & EP_ADDR_MSK;
1857 if (hpcd->Init.dma_enable == 1U)
1859 ep->dma_addr = (uint32_t)pBuf;
1862 (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable);
1873uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef
const *hpcd, uint8_t ep_addr)
1875 return hpcd->OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count;
1885HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
1889 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1892 ep->xfer_buff = pBuf;
1894 ep->xfer_count = 0U;
1896 ep->num = ep_addr & EP_ADDR_MSK;
1898 if (hpcd->Init.dma_enable == 1U)
1900 ep->dma_addr = (uint32_t)pBuf;
1903 (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable);
1918 if (((uint32_t)ep_addr & EP_ADDR_MSK) > hpcd->Init.dev_endpoints)
1923 if ((0x80U & ep_addr) == 0x80U)
1925 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1930 ep = &hpcd->OUT_ep[ep_addr];
1935 ep->num = ep_addr & EP_ADDR_MSK;
1939 (void)USB_EPSetStall(hpcd->Instance, ep);
1941 if ((ep_addr & EP_ADDR_MSK) == 0U)
1943 (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup);
1961 if (((uint32_t)ep_addr & 0x0FU) > hpcd->Init.dev_endpoints)
1966 if ((0x80U & ep_addr) == 0x80U)
1968 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1973 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1978 ep->num = ep_addr & EP_ADDR_MSK;
1981 (void)USB_EPClearStall(hpcd->Instance, ep);
1998 if ((0x80U & ep_addr) == 0x80U)
2000 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
2004 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
2008 ret = USB_EPStopXfer(hpcd->Instance, ep);
2023 if ((ep_addr & 0x80U) == 0x80U)
2025 (void)USB_FlushTxFifo(hpcd->Instance, (uint32_t)ep_addr & EP_ADDR_MSK);
2029 (void)USB_FlushRxFifo(hpcd->Instance);
2044 return (USB_ActivateRemoteWakeup(hpcd->Instance));
2054 return (USB_DeActivateRemoteWakeup(hpcd->Instance));
2081PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef
const *hpcd)
2086#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
2093HAL_StatusTypeDef HAL_PCD_SetTestMode(
const PCD_HandleTypeDef *hpcd, uint8_t testmode)
2096 uint32_t USBx_BASE = (uint32_t)USBx;
2105 USBx_DEVICE->DCTL &= ~(0x7UL << 4);
2106 USBx_DEVICE->DCTL |= (uint32_t)testmode << 4;
2128#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
2135static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
2138 uint32_t USBx_BASE = (uint32_t)USBx;
2139 USB_OTG_EPTypeDef *ep;
2142 uint32_t fifoemptymsk;
2144 ep = &hpcd->IN_ep[epnum];
2146 if (ep->xfer_count > ep->xfer_len)
2151 len = ep->xfer_len - ep->xfer_count;
2153 if (len > ep->maxpacket)
2155 len = ep->maxpacket;
2158 len32b = (len + 3U) / 4U;
2161 (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0U))
2164 len = ep->xfer_len - ep->xfer_count;
2166 if (len > ep->maxpacket)
2168 len = ep->maxpacket;
2170 len32b = (len + 3U) / 4U;
2172 (void)USB_WritePacket(USBx, ep->xfer_buff, (uint8_t)epnum, (uint16_t)len,
2173 (uint8_t)hpcd->Init.dma_enable);
2175 ep->xfer_buff += len;
2176 ep->xfer_count += len;
2179 if (ep->xfer_len <= ep->xfer_count)
2181 fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));
2182 USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
2195static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
2197 USB_OTG_EPTypeDef *ep;
2199 uint32_t USBx_BASE = (uint32_t)USBx;
2200 uint32_t gSNPSiD = *(
__IO const uint32_t *)(&USBx->
CID + 0x1U);
2201 uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;
2203 if (hpcd->Init.dma_enable == 1U)
2208 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2221 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2228 ep = &hpcd->OUT_ep[epnum];
2235 if (ep->xfer_len == 0U)
2238 (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
2242 ep->xfer_buff += ep->xfer_count;
2246#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2247 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2260 if (gSNPSiD == USB_OTG_CORE_ID_310A)
2274#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2275 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2283 if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U))
2286 (void)USB_EP0_OutStart(hpcd->Instance, 0U, (uint8_t *)hpcd->Setup);
2289#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2290 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2307static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
2310 uint32_t USBx_BASE = (uint32_t)USBx;
2311 uint32_t gSNPSiD = *(
__IO const uint32_t *)(&USBx->
CID + 0x1U);
2312 uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;
2314 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2321#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2322 hpcd->SetupStageCallback(hpcd);
2327 if ((gSNPSiD > USB_OTG_CORE_ID_300A) && (hpcd->Init.dma_enable == 1U))
2329 (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
#define __IO
Defines 'read / write' permissions.
#define IS_PCD_ALL_INSTANCE(INSTANCE)
#define USB_OTG_DOEPCTL_SNAK
Set NAK.
#define USB_OTG_GRXSTSP_EPNUM
IN EP interrupt mask bits.
#define USB_OTG_GLPMCFG_BESL
BESL value received with last ACKed LPM Token.
#define USB_OTG_DOEPINT_XFRC
Transfer completed interrupt.
#define USB_OTG_DOEPINT_NAK
NAK Packet is transmitted by the device.
#define USB_OTG_GUSBCFG_PHYSEL
USB 2.0 high-speed ULPI PHY or USB 1.1 full-speed serial transceiver select.
#define USB_OTG_DOEPMSK_OTEPSPRM
Status Phase Received mask.
#define USB_OTG_DCTL_CGONAK
Clear global OUT NAK.
#define USB_OTG_DOEPINT_OTEPSPR
OUT Status Phase Received interrupt.
#define USB_OTG_DIEPINT_TOC
Timeout condition.
#define USB_OTG_DSTS_FNSOF_Pos
#define USB_OTG_GINTSTS_BOUTNAKEFF
Global OUT NAK effective.
#define USB_OTG_DOEPINT_EPDISD
Endpoint disabled interrupt.
#define USB_OTG_DOEPMSK_NAKM
OUT Packet NAK interrupt mask.
#define USB_OTG_GINTSTS_LPMINT
LPM interrupt.
#define USB_OTG_DOEPINT_OTEPDIS
OUT token received when endpoint disabled.
#define USB_OTG_DIEPINT_INEPNE
IN endpoint NAK effective.
#define USB_OTG_GINTSTS_USBRST
USB reset.
#define USB_OTG_GOTGINT_SEDET
Session end detected.
#define USB_OTG_GINTSTS_SOF
Start of frame.
#define USB_OTG_GINTSTS_OTGINT
OTG interrupt.
#define USB_OTG_GCCFG_PWRDWN
Power down.
#define USB_OTG_GINTSTS_PXFR_INCOMPISOOUT
Incomplete periodic transfer.
#define USB_OTG_DOEPCTL_STALL
STALL handshake.
#define USB_OTG_DOEPMSK_EPDM
Endpoint disabled interrupt mask.
#define USB_OTG_GINTSTS_WKUINT
Resume/remote wakeup detected interrupt.
#define USB_OTG_GINTSTS_IISOIXFR
Incomplete isochronous IN transfer.
#define USB_OTG_DIEPINT_EPDISD
Endpoint disabled interrupt.
#define USB_OTG_DIEPMSK_XFRCM
Transfer completed interrupt mask.
#define USB_OTG_DCTL_SGONAK
Set global OUT NAK.
#define USB_OTG_GINTSTS_OEPINT
OUT endpoint interrupt.
#define USB_OTG_DIEPMSK_TOM
Timeout condition mask (nonisochronous endpoints).
#define USB_OTG_DOEPINT_STUP
SETUP phase done.
#define USB_OTG_DOEPCTL_EPENA
Endpoint enable.
#define USB_OTG_GINTSTS_ENUMDNE
Enumeration done.
#define USB_OTG_DCTL_RWUSIG
Remote wakeup signaling.
#define USB_OTG_DSTS_SUSPSTS
Suspend status.
#define USB_OTG_DOEPINT_STPKTRX
Setup Packet Received.
#define USB_OTG_GRXSTSP_PKTSTS
OUT EP interrupt mask bits.
#define USB_OTG_DSTS_FNSOF_Msk
0x003FFF00
#define USB_OTG_DOEPMSK_XFRCM
Transfer completed interrupt mask.
#define USB_OTG_GRXSTSP_BCNT
OUT EP interrupt mask bits.
#define USB_OTG_DIEPINT_XFRC
Transfer completed interrupt.
#define USB_OTG_GINTSTS_MMIS
Mode mismatch interrupt.
#define USB_OTG_DIEPCTL_STALL
STALL handshake.
#define USB_OTG_DOEPTSIZ_XFRSIZ
Transfer size.
#define USB_OTG_GINTSTS_IEPINT
IN endpoint interrupt.
#define USB_OTG_GINTMSK_GONAKEFFM
Global OUT NAK effective mask.
#define USB_OTG_DOEPMSK_STUPM
SETUP phase done mask.
#define USB_OTG_GINTSTS_RXFLVL
RxFIFO nonempty.
#define USB_OTG_DIEPINT_ITTXFE
IN token received when TxFIFO is empty.
#define USB_OTG_DIEPCTL_EPENA
Endpoint enable.
#define USB_OTG_GINTSTS_SRQINT
Session request/new session detected interrupt.
#define USB_OTG_GINTSTS_USBSUSP
USB suspend.
#define USB_OTG_DTXFSTS_INEPTFSAV
IN endpoint TxFIFO space available.
#define USB_OTG_DIEPINT_TXFE
Transmit FIFO empty.
#define USB_OTG_DOEPCTL_EPDIS
Endpoint disable.
#define USB_OTG_DCFG_DAD
Device address.
#define USB_OTG_DIEPMSK_EPDM
Endpoint disabled interrupt mask.
uint32_t HAL_RCC_GetHCLKFreq(void)
This file contains all the functions prototypes for the HAL module driver.
#define assert_param(expr)
Uncomment the line below to expanse the "assert_param" macro in the HAL drivers code.
HAL_StatusTypeDef
HAL Status structures definition.
#define __HAL_UNLOCK(__HANDLE__)
#define __HAL_LOCK(__HANDLE__)
__IO uint32_t GRXSTSP
Receive Sts Q Read & POP Register 020h.
__IO uint32_t GINTSTS
Core Interrupt Register 014h.
__IO uint32_t GUSBCFG
Core USB Configuration Register 00Ch.
__IO uint32_t GINTMSK
Core Interrupt Mask Register 018h.
__IO uint32_t CID
User ID Register 03Ch.
__IO uint32_t GCCFG
General Purpose IO Register 038h.
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
Resume callback.
void HAL_PCD_MspDeInit(PCD_HandleTypeDef *pcdHandle)
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
Connect callback.
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
Suspend callback.
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Data In stage callback.
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
Disconnect callback.
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Data Out stage callback.
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
ISOOUTIncomplete callback.
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
SOF callback.
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
ISOINIncomplete callback.
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
Setup stage callback.
void HAL_PCD_MspInit(PCD_HandleTypeDef *pcdHandle)
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
Reset callback.