63 #ifdef HAL_HCD_MODULE_ENABLED
64 #if defined (USB_OTG_FS) || defined (USB_OTG_HS)
79 static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
80 static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
81 static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd);
82 static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd);
112 #if defined (USB_OTG_FS)
113 const USB_OTG_GlobalTypeDef *USBx;
123 assert_param(IS_HCD_ALL_INSTANCE(hhcd->Instance));
125 #if defined (USB_OTG_FS)
126 USBx = hhcd->Instance;
129 if (hhcd->State == HAL_HCD_STATE_RESET)
132 hhcd->Lock = HAL_UNLOCKED;
134 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
142 if (hhcd->MspInitCallback == NULL)
148 hhcd->MspInitCallback(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);
171 hhcd->State = HAL_HCD_STATE_ERROR;
178 hhcd->State = HAL_HCD_STATE_ERROR;
185 hhcd->State = HAL_HCD_STATE_ERROR;
189 hhcd->State = HAL_HCD_STATE_READY;
218 HAL_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)
221 HAL_StatusTypeDef status;
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;
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);
278 HAL_StatusTypeDef status = HAL_OK;
300 hhcd->State = HAL_HCD_STATE_BUSY;
302 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
303 if (hhcd->MspDeInitCallback == NULL)
309 hhcd->MspDeInitCallback(hhcd);
315 __HAL_HCD_DISABLE(hhcd);
317 hhcd->State = HAL_HCD_STATE_RESET;
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)
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)
589 if (hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY)
596 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
597 hhcd->DisconnectCallback(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);
619 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SOF);
623 if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HCINT))
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);
769 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
790 HAL_StatusTypeDef status = HAL_OK;
792 if (pCallback == NULL)
795 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
801 if (hhcd->State == HAL_HCD_STATE_READY)
806 hhcd->SOFCallback = pCallback;
810 hhcd->ConnectCallback = pCallback;
814 hhcd->DisconnectCallback = pCallback;
818 hhcd->PortEnabledCallback = pCallback;
822 hhcd->PortDisabledCallback = pCallback;
826 hhcd->MspInitCallback = pCallback;
830 hhcd->MspDeInitCallback = pCallback;
835 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
841 else if (hhcd->State == HAL_HCD_STATE_RESET)
846 hhcd->MspInitCallback = pCallback;
850 hhcd->MspDeInitCallback = pCallback;
855 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
864 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
891 HAL_StatusTypeDef status = HAL_OK;
897 if (hhcd->State == HAL_HCD_STATE_READY)
931 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
938 else if (hhcd->State == HAL_HCD_STATE_RESET)
952 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
962 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
983 HAL_StatusTypeDef status = HAL_OK;
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;
1024 HAL_StatusTypeDef status = HAL_OK;
1029 if (hhcd->State == HAL_HCD_STATE_READY)
1036 hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
1080 __HAL_HCD_ENABLE(hhcd);
1156 return hhcd->hc[chnum].urb_state;
1169 return hhcd->hc[chnum].xfer_count;
1191 return hhcd->hc[chnum].state;
1224 uint8_t addr, uint8_t PortNbr)
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;
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;
1280 static 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;
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;
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;
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;
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;
1321 if (__HAL_HCD_GET_CH_FLAG(hhcd, chnum, USB_OTG_HCINT_FRMOR))
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))
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);
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;
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);
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;
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;
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;
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);
1599 static 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;
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;
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;
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);
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;
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;
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;
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;
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;
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;
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;
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);
1840 static 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)
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:
1906 static 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);
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))
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);
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;
HAL_HCD_CallbackIDTypeDef
@ HAL_HCD_PORT_DISABLED_CB_ID
@ HAL_HCD_PORT_ENABLED_CB_ID
@ HAL_HCD_DISCONNECT_CB_ID
@ HAL_HCD_MSPDEINIT_CB_ID
void(* pHCD_HC_NotifyURBChangeCallbackTypeDef)(HCD_HandleTypeDef *hhcd, uint8_t epnum, HCD_URBStateTypeDef urb_state)
void(* pHCD_CallbackTypeDef)(HCD_HandleTypeDef *hhcd)
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.
HAL_StatusTypeDef HAL_HCD_RegisterCallback(HCD_HandleTypeDef *hhcd, HAL_HCD_CallbackIDTypeDef CallbackID, pHCD_CallbackTypeDef pCallback)
Register a User USB HCD Callback To be used instead of the weak predefined callback.
void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd)
Port Disabled Event callback.
void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd)
Connection Event callback.
HAL_StatusTypeDef HAL_HCD_RegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd, pHCD_HC_NotifyURBChangeCallbackTypeDef pCallback)
Register USB HCD Host Channel Notify URB Change Callback To be used instead of the weak HAL_HCD_HC_No...
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.
HAL_StatusTypeDef HAL_HCD_UnRegisterHC_NotifyURBChangeCallback(HCD_HandleTypeDef *hhcd)
Unregister the USB HCD Host Channel Notify URB Change Callback USB HCD Host Channel Notify URB Change...
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.
HAL_StatusTypeDef HAL_HCD_UnRegisterCallback(HCD_HandleTypeDef *hhcd, HAL_HCD_CallbackIDTypeDef CallbackID)
Unregister an USB HCD Callback USB HCD callback is redirected to the weak predefined callback.
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.
uint32_t USB_GetMode(const USB_OTG_GlobalTypeDef *USBx)
Returns USB core mode.
uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef const *USBx)
Return Host Core speed.
HAL_StatusTypeDef USB_ResetPort(const USB_OTG_GlobalTypeDef *USBx)
USB_OTG_ResetPort : Reset Host Port.
uint32_t USB_HC_ReadInterrupt(const USB_OTG_GlobalTypeDef *USBx)
Read all host channel interrupts status.
void * USB_ReadPacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len)
USB_ReadPacket : read a packet from the RX FIFO.
HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, 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 USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
Initializes the USB Core.
HAL_StatusTypeDef USB_HC_Halt(const USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num)
Halt a host channel.
HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
USB_HostInit : Initializes the USB OTG controller registers for Host mode.
HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma)
Start a transfer over a host channel.
HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_OTG_ModeTypeDef mode)
USB_SetCurrentMode Set functional mode.
HAL_StatusTypeDef USB_DriveVbus(const USB_OTG_GlobalTypeDef *USBx, uint8_t state)
USB_DriveVbus : activate or de-activate vbus.
HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx)
USB_FlushRxFifo Flush Rx FIFO.
HAL_StatusTypeDef USB_InitFSLSPClkSel(const USB_OTG_GlobalTypeDef *USBx, uint8_t freq)
USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the HCFG register on the PHY type and set ...
HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx)
Stop Host Core.
HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num)
USB_FlushTxFifo Flush a Tx FIFO.
uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef const *USBx)
Return Host Current Frame number.
USB_HCStateTypeDef
Host channel States definition.
USB_URBStateTypeDef
URB States definition.
This file contains all the functions prototypes for the HAL module driver.