63#ifdef HAL_HCD_MODULE_ENABLED
64#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
112#if defined (USB_OTG_FS)
113 const USB_OTG_GlobalTypeDef *USBx;
125#if defined (USB_OTG_FS)
134#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
142 if (hhcd->MspInitCallback == NULL)
148 hhcd->MspInitCallback(hhcd);
157#if defined (USB_OTG_FS)
159 if (USBx == USB_OTG_FS)
161 hhcd->
Init.dma_enable = 0U;
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;
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)
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);
302#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
303 if (hhcd->MspDeInitCallback == NULL)
309 hhcd->MspDeInitCallback(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);
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)
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);
613#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
614 hhcd->SOFCallback(hhcd);
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)
646 USB_MASK_INTERRUPT(hhcd->
Instance, USB_OTG_GINTSTS_RXFLVL);
650 USB_UNMASK_INTERRUPT(hhcd->
Instance, USB_OTG_GINTSTS_RXFLVL);
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;
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;
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;
901 case HAL_HCD_SOF_CB_ID :
905 case HAL_HCD_CONNECT_CB_ID :
909 case HAL_HCD_DISCONNECT_CB_ID :
913 case HAL_HCD_PORT_ENABLED_CB_ID :
917 case HAL_HCD_PORT_DISABLED_CB_ID :
921 case HAL_HCD_MSPINIT_CB_ID :
925 case HAL_HCD_MSPDEINIT_CB_ID :
931 hhcd->
ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
942 case HAL_HCD_MSPINIT_CB_ID :
946 case HAL_HCD_MSPDEINIT_CB_ID :
952 hhcd->
ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
962 hhcd->
ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
981 pHCD_HC_NotifyURBChangeCallbackTypeDef pCallback)
985 if (pCallback == NULL)
988 hhcd->
ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
998 hhcd->HC_NotifyURBChangeCallback = pCallback;
1003 hhcd->
ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
1036 hhcd->
ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
1077 (void)USB_DriveVbus(hhcd->
Instance, 1U);
1095 (void)USB_StopHost(hhcd->
Instance);
1108 return (USB_ResetPort(hhcd->
Instance));
1156 return hhcd->
hc[chnum].urb_state;
1169 return hhcd->
hc[chnum].xfer_count;
1191 return hhcd->
hc[chnum].state;
1201 return (USB_GetCurrentFrame(hhcd->
Instance));
1211 return (USB_GetHostSpeed(hhcd->
Instance));
1224 uint8_t addr, uint8_t PortNbr)
1226 uint32_t HostCoreSpeed = USB_GetHostSpeed(hhcd->
Instance);
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;
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;
1282 const USB_OTG_GlobalTypeDef *USBx = hhcd->
Instance;
1283 uint32_t USBx_BASE = (uint32_t)USBx;
1289 hhcd->
hc[chnum].state = HC_XACTERR;
1290 (void)USB_HC_Halt(hhcd->
Instance, chnum);
1295 hhcd->
hc[chnum].state = HC_BBLERR;
1296 (void)USB_HC_Halt(hhcd->
Instance, chnum);
1301 hhcd->
hc[chnum].state = HC_STALL;
1302 (void)USB_HC_Halt(hhcd->
Instance, chnum);
1307 hhcd->
hc[chnum].state = HC_DATATGLERR;
1308 (void)USB_HC_Halt(hhcd->
Instance, chnum);
1313 hhcd->
hc[chnum].state = HC_XACTERR;
1314 (void)USB_HC_Halt(hhcd->
Instance, chnum);
1323 (void)USB_HC_Halt(hhcd->
Instance, chnum);
1331 if (hhcd->
hc[chnum].do_csplit == 1U)
1333 hhcd->
hc[chnum].do_csplit = 0U;
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;
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);
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);
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;
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);
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;
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;
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);
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);
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;
1601 const USB_OTG_GlobalTypeDef *USBx = hhcd->
Instance;
1602 uint32_t USBx_BASE = (uint32_t)USBx;
1604 uint32_t num_packets;
1609 hhcd->
hc[chnum].state = HC_XACTERR;
1610 (void)USB_HC_Halt(hhcd->
Instance, chnum);
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;
1641 (void)USB_HC_Halt(hhcd->
Instance, chnum);
1645 hhcd->
hc[chnum].ErrCnt = 0U;
1650 hhcd->
hc[chnum].do_ping = 1U;
1654 if (hhcd->
hc[chnum].do_csplit != 0U)
1656 hhcd->
hc[chnum].do_csplit = 0U;
1661 hhcd->
hc[chnum].state = HC_XFRC;
1662 (void)USB_HC_Halt(hhcd->
Instance, chnum);
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);
1680 hhcd->
hc[chnum].state = HC_STALL;
1681 (void)USB_HC_Halt(hhcd->
Instance, chnum);
1685 hhcd->
hc[chnum].ErrCnt = 0U;
1686 hhcd->
hc[chnum].state = HC_NAK;
1688 if (hhcd->
hc[chnum].do_ping == 0U)
1692 hhcd->
hc[chnum].do_ping = 1U;
1696 (void)USB_HC_Halt(hhcd->
Instance, chnum);
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);
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;
1735 hhcd->
hc[chnum].state = HC_DATATGLERR;
1736 (void)USB_HC_Halt(hhcd->
Instance, chnum);
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;
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);
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:
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);
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);
1956 USBx_HOST->HFIR = HFIR_60_MHZ;
1959#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1960 hhcd->PortEnabledCallback(hhcd);
1968#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1969 hhcd->PortDisabledCallback(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 HCD_DEVICE_SPEED_HIGH
#define HCD_DEVICE_SPEED_FULL
void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd)
DeInitialize the HCD MSP.
HAL_StatusTypeDef HAL_HCD_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num)
Halt a host channel.
void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd)
Initialize the HCD MSP.
HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd, uint8_t ch_num, uint8_t epnum, uint8_t dev_address, uint8_t speed, uint8_t ep_type, uint16_t mps)
Initialize a host channel.
HAL_StatusTypeDef HAL_HCD_DeInit(HCD_HandleTypeDef *hhcd)
DeInitialize the host driver.
HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd)
Initialize the host driver.
void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd)
Port Disabled Event callback.
void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd)
Connection Event callback.
void HAL_HCD_PortEnabled_Callback(HCD_HandleTypeDef *hhcd)
Port Enabled Event callback.
void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state)
Notify URB state change callback.
void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd)
SOF callback.
HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, uint8_t ch_num, uint8_t direction, uint8_t ep_type, uint8_t token, uint8_t *pbuff, uint16_t length, uint8_t do_ping)
Submit a new URB for processing.
void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd)
Handle HCD interrupt request.
void HAL_HCD_WKUP_IRQHandler(HCD_HandleTypeDef *hhcd)
Handles HCD Wakeup interrupt request.
void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd)
Disconnection Event callback.
HAL_StatusTypeDef HAL_HCD_Stop(HCD_HandleTypeDef *hhcd)
Stop the host driver.
HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd)
Reset the host port.
HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd)
Start the host driver.
HAL_StatusTypeDef HAL_HCD_HC_SetHubInfo(HCD_HandleTypeDef *hhcd, uint8_t ch_num, uint8_t addr, uint8_t PortNbr)
Set host channel Hub information.
HAL_StatusTypeDef HAL_HCD_HC_ClearHubInfo(HCD_HandleTypeDef *hhcd, uint8_t ch_num)
Clear host channel hub information.
HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef const *hhcd, uint8_t chnum)
Return URB state for a channel.
HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef const *hhcd, uint8_t chnum)
Return the Host Channel state.
uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd)
Return the current Host frame number.
uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd)
Return the Host enumeration speed.
HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef const *hhcd)
Return the HCD handle state.
uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef const *hhcd, uint8_t chnum)
Return the last host transfer size.
#define __HAL_HCD_GET_CH_FLAG(__HANDLE__, __chnum__, __INTERRUPT__)
#define __HAL_HCD_DISABLE(__HANDLE__)
#define __HAL_HCD_CLEAR_HC_CSPLT(chnum)
#define __HAL_HCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__)
#define __HAL_HCD_CLEAR_HC_INT(chnum, __INTERRUPT__)
#define __HAL_HCD_UNMASK_ACK_HC_INT(chnum)
#define __HAL_HCD_IS_INVALID_INTERRUPT(__HANDLE__)
#define __HAL_HCD_ENABLE(__HANDLE__)
#define __HAL_HCD_GET_FLAG(__HANDLE__, __INTERRUPT__)
USB_OTG_URBStateTypeDef HCD_URBStateTypeDef
USB_OTG_HCStateTypeDef HCD_HCStateTypeDef
static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd)
Handle Rx Queue Level interrupt requests.
static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd)
Handle Host Port interrupt requests.
static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
Handle Host Channel IN interrupt requests.
static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
Handle Host Channel OUT interrupt requests.
#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__)
__IO HCD_StateTypeDef State