63#ifdef HAL_HCD_MODULE_ENABLED
64#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
79static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
80static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
81static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd);
82static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd);
112#if defined (USB_OTG_FS)
113 const USB_OTG_GlobalTypeDef *USBx;
125#if defined (USB_OTG_FS)
126 USBx = hhcd->Instance;
129 if (hhcd->State == HAL_HCD_STATE_RESET)
134#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
135 hhcd->SOFCallback = HAL_HCD_SOF_Callback;
136 hhcd->ConnectCallback = HAL_HCD_Connect_Callback;
137 hhcd->DisconnectCallback = HAL_HCD_Disconnect_Callback;
138 hhcd->PortEnabledCallback = HAL_HCD_PortEnabled_Callback;
139 hhcd->PortDisabledCallback = HAL_HCD_PortDisabled_Callback;
140 hhcd->HC_NotifyURBChangeCallback = HAL_HCD_HC_NotifyURBChange_Callback;
142 if (hhcd->MspInitCallback == NULL)
144 hhcd->MspInitCallback = HAL_HCD_MspInit;
148 hhcd->MspInitCallback(hhcd);
151 HAL_HCD_MspInit(hhcd);
155 hhcd->State = HAL_HCD_STATE_BUSY;
157#if defined (USB_OTG_FS)
159 if (USBx == USB_OTG_FS)
161 hhcd->Init.dma_enable = 0U;
166 __HAL_HCD_DISABLE(hhcd);
169 if (USB_CoreInit(hhcd->Instance, hhcd->Init) !=
HAL_OK)
171 hhcd->State = HAL_HCD_STATE_ERROR;
176 if (USB_SetCurrentMode(hhcd->Instance, USB_HOST_MODE) !=
HAL_OK)
178 hhcd->State = HAL_HCD_STATE_ERROR;
183 if (USB_HostInit(hhcd->Instance, hhcd->Init) !=
HAL_OK)
185 hhcd->State = HAL_HCD_STATE_ERROR;
189 hhcd->State = HAL_HCD_STATE_READY;
218HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd, uint8_t ch_num, uint8_t epnum,
219 uint8_t dev_address, uint8_t speed, uint8_t ep_type, uint16_t mps)
222 uint32_t HostCoreSpeed;
223 uint32_t HCcharMps = mps;
226 hhcd->hc[ch_num].do_ping = 0U;
227 hhcd->hc[ch_num].dev_addr = dev_address;
228 hhcd->hc[ch_num].ch_num = ch_num;
229 hhcd->hc[ch_num].ep_type = ep_type;
230 hhcd->hc[ch_num].ep_num = epnum & 0x7FU;
232 (void)HAL_HCD_HC_ClearHubInfo(hhcd, ch_num);
234 if ((epnum & 0x80U) == 0x80U)
236 hhcd->hc[ch_num].ep_is_in = 1U;
240 hhcd->hc[ch_num].ep_is_in = 0U;
243 HostCoreSpeed = USB_GetHostSpeed(hhcd->Instance);
245 if (ep_type == EP_TYPE_ISOC)
248 if ((speed == HCD_DEVICE_SPEED_FULL) && (HostCoreSpeed == HPRT0_PRTSPD_HIGH_SPEED))
250 if (HCcharMps > ISO_SPLT_MPS)
253 HCcharMps = ISO_SPLT_MPS;
258 hhcd->hc[ch_num].speed = speed;
259 hhcd->hc[ch_num].max_packet = (uint16_t)HCcharMps;
261 status = USB_HC_Init(hhcd->Instance, ch_num, epnum,
262 dev_address, speed, ep_type, (uint16_t)HCcharMps);
281 (void)USB_HC_Halt(hhcd->Instance, ch_num);
300 hhcd->State = HAL_HCD_STATE_BUSY;
302#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
303 if (hhcd->MspDeInitCallback == NULL)
305 hhcd->MspDeInitCallback = HAL_HCD_MspDeInit;
309 hhcd->MspDeInitCallback(hhcd);
312 HAL_HCD_MspDeInit(hhcd);
315 __HAL_HCD_DISABLE(hhcd);
317 hhcd->State = HAL_HCD_STATE_RESET;
327__weak
void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd)
342__weak
void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd)
403 hhcd->hc[ch_num].ep_is_in = direction;
404 hhcd->hc[ch_num].ep_type = ep_type;
408 hhcd->hc[ch_num].data_pid = HC_PID_SETUP;
409 hhcd->hc[ch_num].do_ping = do_ping;
413 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
427 hhcd->hc[ch_num].toggle_out = 1U;
431 if (hhcd->hc[ch_num].toggle_out == 0U)
434 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
439 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
444 if (hhcd->hc[ch_num].do_ssplit == 1U)
446 if (hhcd->hc[ch_num].toggle_in == 0U)
448 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
452 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
463 if (hhcd->hc[ch_num].toggle_out == 0U)
466 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
471 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
476 if (hhcd->hc[ch_num].toggle_in == 0U)
478 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
482 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
491 if (hhcd->hc[ch_num].toggle_out == 0U)
494 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
499 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
504 if (hhcd->hc[ch_num].toggle_in == 0U)
506 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
510 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
516 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
523 hhcd->hc[ch_num].xfer_buff = pbuff;
524 hhcd->hc[ch_num].xfer_len = length;
525 hhcd->hc[ch_num].urb_state = URB_IDLE;
526 hhcd->hc[ch_num].xfer_count = 0U;
527 hhcd->hc[ch_num].ch_num = ch_num;
528 hhcd->hc[ch_num].state = HC_IDLE;
530 return USB_HC_StartXfer(hhcd->Instance, &hhcd->hc[ch_num], (uint8_t)hhcd->Init.dma_enable);
538void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd)
540 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
541 uint32_t USBx_BASE = (uint32_t)USBx;
546 if (USB_GetMode(hhcd->Instance) == USB_OTG_MODE_HOST)
549 if (__HAL_HCD_IS_INVALID_INTERRUPT(hhcd))
554 if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
557 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
560 if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR))
563 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR);
566 if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE))
569 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE);
572 if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_MMIS))
575 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_MMIS);
579 if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT))
581 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT);
583 if ((USBx_HPRT0 & USB_OTG_HPRT_PCSTS) == 0U)
586 (void)USB_FlushTxFifo(USBx, 0x10U);
587 (void)USB_FlushRxFifo(USBx);
589 if (hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY)
592 (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_48_MHZ);
596#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
597 hhcd->DisconnectCallback(hhcd);
599 HAL_HCD_Disconnect_Callback(hhcd);
605 if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HPRTINT))
607 HCD_Port_IRQHandler(hhcd);
611 if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_SOF))
613#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
614 hhcd->SOFCallback(hhcd);
616 HAL_HCD_SOF_Callback(hhcd);
619 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SOF);
623 if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HCINT))
625 interrupt = USB_HC_ReadInterrupt(hhcd->Instance);
626 for (i = 0U; i < hhcd->Init.Host_channels; i++)
628 if ((interrupt & (1UL << (i & 0xFU))) != 0U)
630 if ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_EPDIR) == USB_OTG_HCCHAR_EPDIR)
632 HCD_HC_IN_IRQHandler(hhcd, (uint8_t)i);
636 HCD_HC_OUT_IRQHandler(hhcd, (uint8_t)i);
640 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_HCINT);
644 if ((__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_RXFLVL)) != 0U)
646 USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
648 HCD_RXQLVL_IRQHandler(hhcd);
650 USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
661void HAL_HCD_WKUP_IRQHandler(HCD_HandleTypeDef *hhcd)
672__weak
void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd)
687__weak
void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd)
702__weak
void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd)
717__weak
void HAL_HCD_PortEnabled_Callback(HCD_HandleTypeDef *hhcd)
732__weak
void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd)
757__weak
void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state)
769#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
787 HAL_HCD_CallbackIDTypeDef CallbackID,
788 pHCD_CallbackTypeDef pCallback)
792 if (pCallback == NULL)
795 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
801 if (hhcd->State == HAL_HCD_STATE_READY)
805 case HAL_HCD_SOF_CB_ID :
806 hhcd->SOFCallback = pCallback;
809 case HAL_HCD_CONNECT_CB_ID :
810 hhcd->ConnectCallback = pCallback;
813 case HAL_HCD_DISCONNECT_CB_ID :
814 hhcd->DisconnectCallback = pCallback;
817 case HAL_HCD_PORT_ENABLED_CB_ID :
818 hhcd->PortEnabledCallback = pCallback;
821 case HAL_HCD_PORT_DISABLED_CB_ID :
822 hhcd->PortDisabledCallback = pCallback;
825 case HAL_HCD_MSPINIT_CB_ID :
826 hhcd->MspInitCallback = pCallback;
829 case HAL_HCD_MSPDEINIT_CB_ID :
830 hhcd->MspDeInitCallback = pCallback;
835 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
841 else if (hhcd->State == HAL_HCD_STATE_RESET)
845 case HAL_HCD_MSPINIT_CB_ID :
846 hhcd->MspInitCallback = pCallback;
849 case HAL_HCD_MSPDEINIT_CB_ID :
850 hhcd->MspDeInitCallback = pCallback;
855 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
864 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
889HAL_StatusTypeDef HAL_HCD_UnRegisterCallback(HCD_HandleTypeDef *hhcd, HAL_HCD_CallbackIDTypeDef CallbackID)
897 if (hhcd->State == HAL_HCD_STATE_READY)
901 case HAL_HCD_SOF_CB_ID :
902 hhcd->SOFCallback = HAL_HCD_SOF_Callback;
905 case HAL_HCD_CONNECT_CB_ID :
906 hhcd->ConnectCallback = HAL_HCD_Connect_Callback;
909 case HAL_HCD_DISCONNECT_CB_ID :
910 hhcd->DisconnectCallback = HAL_HCD_Disconnect_Callback;
913 case HAL_HCD_PORT_ENABLED_CB_ID :
914 hhcd->PortEnabledCallback = HAL_HCD_PortEnabled_Callback;
917 case HAL_HCD_PORT_DISABLED_CB_ID :
918 hhcd->PortDisabledCallback = HAL_HCD_PortDisabled_Callback;
921 case HAL_HCD_MSPINIT_CB_ID :
922 hhcd->MspInitCallback = HAL_HCD_MspInit;
925 case HAL_HCD_MSPDEINIT_CB_ID :
926 hhcd->MspDeInitCallback = HAL_HCD_MspDeInit;
931 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
938 else if (hhcd->State == HAL_HCD_STATE_RESET)
942 case HAL_HCD_MSPINIT_CB_ID :
943 hhcd->MspInitCallback = HAL_HCD_MspInit;
946 case HAL_HCD_MSPDEINIT_CB_ID :
947 hhcd->MspDeInitCallback = HAL_HCD_MspDeInit;
952 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
962 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
980HAL_StatusTypeDef HAL_HCD_RegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd,
981 pHCD_HC_NotifyURBChangeCallbackTypeDef pCallback)
985 if (pCallback == NULL)
988 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
996 if (hhcd->State == HAL_HCD_STATE_READY)
998 hhcd->HC_NotifyURBChangeCallback = pCallback;
1003 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
1022HAL_StatusTypeDef HAL_HCD_UnRegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd)
1029 if (hhcd->State == HAL_HCD_STATE_READY)
1031 hhcd->HC_NotifyURBChangeCallback = HAL_HCD_HC_NotifyURBChange_Callback;
1036 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
1077 (void)USB_DriveVbus(hhcd->Instance, 1U);
1080 __HAL_HCD_ENABLE(hhcd);
1095 (void)USB_StopHost(hhcd->Instance);
1108 return (USB_ResetPort(hhcd->Instance));
1135HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef
const *hhcd)
1154HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef
const *hhcd, uint8_t chnum)
1156 return hhcd->hc[chnum].urb_state;
1167uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef
const *hhcd, uint8_t chnum)
1169 return hhcd->hc[chnum].xfer_count;
1189HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef
const *hhcd, uint8_t chnum)
1191 return hhcd->hc[chnum].state;
1199uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd)
1201 return (USB_GetCurrentFrame(hhcd->Instance));
1209uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd)
1211 return (USB_GetHostSpeed(hhcd->Instance));
1224 uint8_t addr, uint8_t PortNbr)
1226 uint32_t HostCoreSpeed = USB_GetHostSpeed(hhcd->Instance);
1229 if ((hhcd->hc[ch_num].speed != HCD_DEVICE_SPEED_HIGH) && (HostCoreSpeed == HPRT0_PRTSPD_HIGH_SPEED))
1231 hhcd->hc[ch_num].do_ssplit = 1U;
1233 if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL) && (hhcd->hc[ch_num].ep_is_in != 0U))
1235 hhcd->hc[ch_num].toggle_in = 1U;
1239 hhcd->hc[ch_num].hub_addr = addr;
1240 hhcd->hc[ch_num].hub_port_nbr = PortNbr;
1253HAL_StatusTypeDef HAL_HCD_HC_ClearHubInfo(HCD_HandleTypeDef *hhcd, uint8_t ch_num)
1255 hhcd->hc[ch_num].do_ssplit = 0U;
1256 hhcd->hc[ch_num].do_csplit = 0U;
1257 hhcd->hc[ch_num].hub_addr = 0U;
1258 hhcd->hc[ch_num].hub_port_nbr = 0U;
1280static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
1282 const USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1283 uint32_t USBx_BASE = (uint32_t)USBx;
1286 if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_AHBERR))
1288 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR);
1289 hhcd->hc[chnum].state = HC_XACTERR;
1290 (void)USB_HC_Halt(hhcd->Instance, chnum);
1292 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_BBERR))
1294 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_BBERR);
1295 hhcd->hc[chnum].state = HC_BBLERR;
1296 (void)USB_HC_Halt(hhcd->Instance, chnum);
1298 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_STALL))
1300 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL);
1301 hhcd->hc[chnum].state = HC_STALL;
1302 (void)USB_HC_Halt(hhcd->Instance, chnum);
1304 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_DTERR))
1306 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR);
1307 hhcd->hc[chnum].state = HC_DATATGLERR;
1308 (void)USB_HC_Halt(hhcd->Instance, chnum);
1310 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_TXERR))
1312 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR);
1313 hhcd->hc[chnum].state = HC_XACTERR;
1314 (void)USB_HC_Halt(hhcd->Instance, chnum);
1321 if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_FRMOR))
1323 (void)USB_HC_Halt(hhcd->Instance, chnum);
1324 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR);
1326 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_XFRC))
1329 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK);
1331 if (hhcd->hc[chnum].do_csplit == 1U)
1333 hhcd->hc[chnum].do_csplit = 0U;
1334 __HAL_HCD_CLEAR_HC_CSPLT(chnum);
1337 if (hhcd->Init.dma_enable != 0U)
1339 hhcd->hc[chnum].xfer_count = hhcd->hc[chnum].XferSize - (USBx_HC(chnum)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ);
1342 hhcd->hc[chnum].state = HC_XFRC;
1343 hhcd->hc[chnum].ErrCnt = 0U;
1344 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC);
1346 if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL) ||
1347 (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
1349 (void)USB_HC_Halt(hhcd->Instance, chnum);
1350 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
1352 else if ((hhcd->hc[chnum].ep_type == EP_TYPE_INTR) ||
1353 (hhcd->hc[chnum].ep_type == EP_TYPE_ISOC))
1355 USBx_HC(chnum)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM;
1356 hhcd->hc[chnum].urb_state = URB_DONE;
1358#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1359 hhcd->HC_NotifyURBChangeCallback(hhcd, chnum, hhcd->hc[chnum].urb_state);
1361 HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
1369 if (hhcd->Init.dma_enable == 1U)
1371 if ((((hhcd->hc[chnum].xfer_count + hhcd->hc[chnum].max_packet - 1U) / hhcd->hc[chnum].max_packet) & 1U) != 0U)
1373 hhcd->hc[chnum].toggle_in ^= 1U;
1378 hhcd->hc[chnum].toggle_in ^= 1U;
1381 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_ACK))
1383 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK);
1385 if (hhcd->hc[chnum].do_ssplit == 1U)
1387 hhcd->hc[chnum].do_csplit = 1U;
1388 hhcd->hc[chnum].state = HC_ACK;
1390 (void)USB_HC_Halt(hhcd->Instance, chnum);
1393 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_CHH))
1395 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
1397 if (hhcd->hc[chnum].state == HC_XFRC)
1399 hhcd->hc[chnum].state = HC_HALTED;
1400 hhcd->hc[chnum].urb_state = URB_DONE;
1402 else if (hhcd->hc[chnum].state == HC_STALL)
1404 hhcd->hc[chnum].state = HC_HALTED;
1405 hhcd->hc[chnum].urb_state = URB_STALL;
1407 else if ((hhcd->hc[chnum].state == HC_XACTERR) ||
1408 (hhcd->hc[chnum].state == HC_DATATGLERR))
1410 hhcd->hc[chnum].state = HC_HALTED;
1411 hhcd->hc[chnum].ErrCnt++;
1412 if (hhcd->hc[chnum].ErrCnt > 2U)
1414 hhcd->hc[chnum].ErrCnt = 0U;
1416 if (hhcd->hc[chnum].do_ssplit == 1U)
1418 hhcd->hc[chnum].do_csplit = 0U;
1419 hhcd->hc[chnum].ep_ss_schedule = 0U;
1420 __HAL_HCD_CLEAR_HC_CSPLT(chnum);
1423 hhcd->hc[chnum].urb_state = URB_ERROR;
1427 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1429 if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL) ||
1430 (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
1433 tmpreg = USBx_HC(chnum)->HCCHAR;
1434 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1435 tmpreg |= USB_OTG_HCCHAR_CHENA;
1436 USBx_HC(chnum)->HCCHAR = tmpreg;
1440 else if (hhcd->hc[chnum].state == HC_NYET)
1442 hhcd->hc[chnum].state = HC_HALTED;
1444 if (hhcd->hc[chnum].do_csplit == 1U)
1446 if (hhcd->hc[chnum].ep_type == EP_TYPE_INTR)
1448 hhcd->hc[chnum].NyetErrCnt++;
1449 if (hhcd->hc[chnum].NyetErrCnt > 2U)
1451 hhcd->hc[chnum].NyetErrCnt = 0U;
1452 hhcd->hc[chnum].do_csplit = 0U;
1454 if (hhcd->hc[chnum].ErrCnt < 3U)
1456 hhcd->hc[chnum].ep_ss_schedule = 1U;
1458 __HAL_HCD_CLEAR_HC_CSPLT(chnum);
1459 hhcd->hc[chnum].urb_state = URB_ERROR;
1463 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1468 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1471 if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL) ||
1472 (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
1475 tmpreg = USBx_HC(chnum)->HCCHAR;
1476 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1477 tmpreg |= USB_OTG_HCCHAR_CHENA;
1478 USBx_HC(chnum)->HCCHAR = tmpreg;
1482 else if (hhcd->hc[chnum].state == HC_ACK)
1484 hhcd->hc[chnum].state = HC_HALTED;
1486 if (hhcd->hc[chnum].do_csplit == 1U)
1488 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1491 USBx_HC(chnum)->HCSPLT |= USB_OTG_HCSPLT_COMPLSPLT;
1492 USBx_HC(chnum)->HCINTMSK |= USB_OTG_HCINTMSK_NYET;
1493 USBx_HC(chnum)->HCINTMSK &= ~USB_OTG_HCINT_ACK;
1495 if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL) ||
1496 (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
1499 tmpreg = USBx_HC(chnum)->HCCHAR;
1500 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1501 tmpreg |= USB_OTG_HCCHAR_CHENA;
1502 USBx_HC(chnum)->HCCHAR = tmpreg;
1506 else if (hhcd->hc[chnum].state == HC_NAK)
1508 hhcd->hc[chnum].state = HC_HALTED;
1509 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1511 if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL) ||
1512 (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
1515 tmpreg = USBx_HC(chnum)->HCCHAR;
1516 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1517 tmpreg |= USB_OTG_HCCHAR_CHENA;
1518 USBx_HC(chnum)->HCCHAR = tmpreg;
1521 else if (hhcd->hc[chnum].state == HC_BBLERR)
1523 hhcd->hc[chnum].state = HC_HALTED;
1524 hhcd->hc[chnum].ErrCnt++;
1525 hhcd->hc[chnum].urb_state = URB_ERROR;
1529 if (hhcd->hc[chnum].state == HC_HALTED)
1535#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1536 hhcd->HC_NotifyURBChangeCallback(hhcd, chnum, hhcd->hc[chnum].urb_state);
1538 HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
1541 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_NYET))
1543 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NYET);
1544 hhcd->hc[chnum].state = HC_NYET;
1546 if (hhcd->hc[chnum].do_ssplit == 0U)
1548 hhcd->hc[chnum].ErrCnt = 0U;
1551 (void)USB_HC_Halt(hhcd->Instance, chnum);
1553 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_NAK))
1555 if (hhcd->hc[chnum].ep_type == EP_TYPE_INTR)
1557 hhcd->hc[chnum].ErrCnt = 0U;
1558 hhcd->hc[chnum].state = HC_NAK;
1559 (void)USB_HC_Halt(hhcd->Instance, chnum);
1561 else if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL) ||
1562 (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
1564 hhcd->hc[chnum].ErrCnt = 0U;
1566 if ((hhcd->Init.dma_enable == 0U) || (hhcd->hc[chnum].do_csplit == 1U))
1568 hhcd->hc[chnum].state = HC_NAK;
1569 (void)USB_HC_Halt(hhcd->Instance, chnum);
1577 if (hhcd->hc[chnum].do_csplit == 1U)
1579 hhcd->hc[chnum].do_csplit = 0U;
1580 __HAL_HCD_CLEAR_HC_CSPLT(chnum);
1581 __HAL_HCD_UNMASK_ACK_HC_INT(chnum);
1584 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
1599static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
1601 const USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1602 uint32_t USBx_BASE = (uint32_t)USBx;
1604 uint32_t num_packets;
1606 if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_AHBERR))
1608 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR);
1609 hhcd->hc[chnum].state = HC_XACTERR;
1610 (void)USB_HC_Halt(hhcd->Instance, chnum);
1612 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_ACK))
1614 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK);
1616 if (hhcd->hc[chnum].do_ping == 1U)
1618 hhcd->hc[chnum].do_ping = 0U;
1619 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1620 hhcd->hc[chnum].state = HC_ACK;
1621 (void)USB_HC_Halt(hhcd->Instance, chnum);
1624 if ((hhcd->hc[chnum].do_ssplit == 1U) && (hhcd->hc[chnum].do_csplit == 0U))
1626 if (hhcd->hc[chnum].ep_type != EP_TYPE_ISOC)
1628 hhcd->hc[chnum].do_csplit = 1U;
1631 hhcd->hc[chnum].state = HC_ACK;
1632 (void)USB_HC_Halt(hhcd->Instance, chnum);
1635 hhcd->hc[chnum].ErrCnt = 0U;
1638 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_FRMOR))
1640 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR);
1641 (void)USB_HC_Halt(hhcd->Instance, chnum);
1643 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_XFRC))
1645 hhcd->hc[chnum].ErrCnt = 0U;
1648 if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_NYET))
1650 hhcd->hc[chnum].do_ping = 1U;
1651 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NYET);
1654 if (hhcd->hc[chnum].do_csplit != 0U)
1656 hhcd->hc[chnum].do_csplit = 0U;
1657 __HAL_HCD_CLEAR_HC_CSPLT(chnum);
1660 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC);
1661 hhcd->hc[chnum].state = HC_XFRC;
1662 (void)USB_HC_Halt(hhcd->Instance, chnum);
1664 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_NYET))
1666 hhcd->hc[chnum].state = HC_NYET;
1668 if (hhcd->hc[chnum].do_ssplit == 0U)
1670 hhcd->hc[chnum].do_ping = 1U;
1673 hhcd->hc[chnum].ErrCnt = 0U;
1674 (void)USB_HC_Halt(hhcd->Instance, chnum);
1675 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NYET);
1677 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_STALL))
1679 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL);
1680 hhcd->hc[chnum].state = HC_STALL;
1681 (void)USB_HC_Halt(hhcd->Instance, chnum);
1683 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_NAK))
1685 hhcd->hc[chnum].ErrCnt = 0U;
1686 hhcd->hc[chnum].state = HC_NAK;
1688 if (hhcd->hc[chnum].do_ping == 0U)
1690 if (hhcd->hc[chnum].speed == HCD_DEVICE_SPEED_HIGH)
1692 hhcd->hc[chnum].do_ping = 1U;
1696 (void)USB_HC_Halt(hhcd->Instance, chnum);
1697 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
1699 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_TXERR))
1701 if (hhcd->Init.dma_enable == 0U)
1703 hhcd->hc[chnum].state = HC_XACTERR;
1704 (void)USB_HC_Halt(hhcd->Instance, chnum);
1708 hhcd->hc[chnum].ErrCnt++;
1709 if (hhcd->hc[chnum].ErrCnt > 2U)
1711 hhcd->hc[chnum].ErrCnt = 0U;
1712 hhcd->hc[chnum].urb_state = URB_ERROR;
1714#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1715 hhcd->HC_NotifyURBChangeCallback(hhcd, chnum, hhcd->hc[chnum].urb_state);
1717 HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
1722 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1725 tmpreg = USBx_HC(chnum)->HCCHAR;
1726 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1727 tmpreg |= USB_OTG_HCCHAR_CHENA;
1728 USBx_HC(chnum)->HCCHAR = tmpreg;
1731 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR);
1733 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_DTERR))
1735 hhcd->hc[chnum].state = HC_DATATGLERR;
1736 (void)USB_HC_Halt(hhcd->Instance, chnum);
1737 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR);
1739 else if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_CHH))
1741 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
1743 if (hhcd->hc[chnum].state == HC_XFRC)
1745 hhcd->hc[chnum].state = HC_HALTED;
1746 hhcd->hc[chnum].urb_state = URB_DONE;
1748 if ((hhcd->hc[chnum].ep_type == EP_TYPE_BULK) ||
1749 (hhcd->hc[chnum].ep_type == EP_TYPE_INTR))
1751 if (hhcd->Init.dma_enable == 0U)
1753 hhcd->hc[chnum].toggle_out ^= 1U;
1756 if ((hhcd->Init.dma_enable == 1U) && (hhcd->hc[chnum].xfer_len > 0U))
1758 num_packets = (hhcd->hc[chnum].xfer_len + hhcd->hc[chnum].max_packet - 1U) / hhcd->hc[chnum].max_packet;
1760 if ((num_packets & 1U) != 0U)
1762 hhcd->hc[chnum].toggle_out ^= 1U;
1767 else if (hhcd->hc[chnum].state == HC_ACK)
1769 hhcd->hc[chnum].state = HC_HALTED;
1771 if (hhcd->hc[chnum].do_csplit == 1U)
1773 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1776 else if (hhcd->hc[chnum].state == HC_NAK)
1778 hhcd->hc[chnum].state = HC_HALTED;
1779 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1781 if (hhcd->hc[chnum].do_csplit == 1U)
1783 hhcd->hc[chnum].do_csplit = 0U;
1784 __HAL_HCD_CLEAR_HC_CSPLT(chnum);
1787 else if (hhcd->hc[chnum].state == HC_NYET)
1789 hhcd->hc[chnum].state = HC_HALTED;
1790 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1792 else if (hhcd->hc[chnum].state == HC_STALL)
1794 hhcd->hc[chnum].state = HC_HALTED;
1795 hhcd->hc[chnum].urb_state = URB_STALL;
1797 else if ((hhcd->hc[chnum].state == HC_XACTERR) ||
1798 (hhcd->hc[chnum].state == HC_DATATGLERR))
1800 hhcd->hc[chnum].state = HC_HALTED;
1801 hhcd->hc[chnum].ErrCnt++;
1802 if (hhcd->hc[chnum].ErrCnt > 2U)
1804 hhcd->hc[chnum].ErrCnt = 0U;
1805 hhcd->hc[chnum].urb_state = URB_ERROR;
1809 hhcd->hc[chnum].urb_state = URB_NOTREADY;
1812 tmpreg = USBx_HC(chnum)->HCCHAR;
1813 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1814 tmpreg |= USB_OTG_HCCHAR_CHENA;
1815 USBx_HC(chnum)->HCCHAR = tmpreg;
1823#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1824 hhcd->HC_NotifyURBChangeCallback(hhcd, chnum, hhcd->hc[chnum].urb_state);
1826 HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
1840static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd)
1842 const USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1843 uint32_t USBx_BASE = (uint32_t)USBx;
1846 uint32_t GrxstspReg;
1847 uint32_t xferSizePktCnt;
1851 GrxstspReg = hhcd->Instance->GRXSTSP;
1852 chnum = GrxstspReg & USB_OTG_GRXSTSP_EPNUM;
1853 pktsts = (GrxstspReg & USB_OTG_GRXSTSP_PKTSTS) >> 17;
1854 pktcnt = (GrxstspReg & USB_OTG_GRXSTSP_BCNT) >> 4;
1858 case GRXSTS_PKTSTS_IN:
1860 if ((pktcnt > 0U) && (hhcd->hc[chnum].xfer_buff != (
void *)0))
1862 if ((hhcd->hc[chnum].xfer_count + pktcnt) <= hhcd->hc[chnum].xfer_len)
1864 (void)USB_ReadPacket(hhcd->Instance,
1865 hhcd->hc[chnum].xfer_buff, (uint16_t)pktcnt);
1868 hhcd->hc[chnum].xfer_buff += pktcnt;
1869 hhcd->hc[chnum].xfer_count += pktcnt;
1872 xferSizePktCnt = (USBx_HC(chnum)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) >> 19;
1874 if ((hhcd->hc[chnum].max_packet == pktcnt) && (xferSizePktCnt > 0U))
1877 tmpreg = USBx_HC(chnum)->HCCHAR;
1878 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1879 tmpreg |= USB_OTG_HCCHAR_CHENA;
1880 USBx_HC(chnum)->HCCHAR = tmpreg;
1881 hhcd->hc[chnum].toggle_in ^= 1U;
1886 hhcd->hc[chnum].urb_state = URB_ERROR;
1891 case GRXSTS_PKTSTS_DATA_TOGGLE_ERR:
1894 case GRXSTS_PKTSTS_IN_XFER_COMP:
1895 case GRXSTS_PKTSTS_CH_HALTED:
1906static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd)
1908 const USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1909 uint32_t USBx_BASE = (uint32_t)USBx;
1910 __IO uint32_t hprt0;
1911 __IO uint32_t hprt0_dup;
1915 hprt0_dup = USBx_HPRT0;
1917 hprt0_dup &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | \
1918 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);
1921 if ((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET)
1923 if ((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS)
1925#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1926 hhcd->ConnectCallback(hhcd);
1928 HAL_HCD_Connect_Callback(hhcd);
1931 hprt0_dup |= USB_OTG_HPRT_PCDET;
1935 if ((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG)
1937 hprt0_dup |= USB_OTG_HPRT_PENCHNG;
1939 if ((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA)
1941 if (hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY)
1943 if ((hprt0 & USB_OTG_HPRT_PSPD) == (HPRT0_PRTSPD_LOW_SPEED << 17))
1945 (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_6_MHZ);
1949 (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_48_MHZ);
1954 if (hhcd->Init.speed == HCD_SPEED_FULL)
1956 USBx_HOST->HFIR = HFIR_60_MHZ;
1959#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1960 hhcd->PortEnabledCallback(hhcd);
1962 HAL_HCD_PortEnabled_Callback(hhcd);
1968#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1969 hhcd->PortDisabledCallback(hhcd);
1971 HAL_HCD_PortDisabled_Callback(hhcd);
1977 if ((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG)
1979 hprt0_dup |= USB_OTG_HPRT_POCCHNG;
1983 USBx_HPRT0 = hprt0_dup;
#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__)