Rev 56 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 56 | Rev 61 | ||
|---|---|---|---|
| Line 287... | Line 287... | ||
| 287 | * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID |
287 | * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID |
| 288 | * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID |
288 | * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID |
| 289 | * @param pCallback pointer to the Callback function |
289 | * @param pCallback pointer to the Callback function |
| 290 | * @retval HAL status |
290 | * @retval HAL status |
| 291 | */ |
291 | */ |
| 292 | HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, pPCD_CallbackTypeDef pCallback) |
292 | HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, |
| - | 293 | HAL_PCD_CallbackIDTypeDef CallbackID, |
|
| - | 294 | pPCD_CallbackTypeDef pCallback) |
|
| 293 | { |
295 | { |
| 294 | HAL_StatusTypeDef status = HAL_OK; |
296 | HAL_StatusTypeDef status = HAL_OK; |
| 295 | 297 | ||
| 296 | if (pCallback == NULL) |
298 | if (pCallback == NULL) |
| 297 | { |
299 | { |
| Line 497... | Line 499... | ||
| 497 | * To be used instead of the weak HAL_PCD_DataOutStageCallback() predefined callback |
499 | * To be used instead of the weak HAL_PCD_DataOutStageCallback() predefined callback |
| 498 | * @param hpcd PCD handle |
500 | * @param hpcd PCD handle |
| 499 | * @param pCallback pointer to the USB PCD Data OUT Stage Callback function |
501 | * @param pCallback pointer to the USB PCD Data OUT Stage Callback function |
| 500 | * @retval HAL status |
502 | * @retval HAL status |
| 501 | */ |
503 | */ |
| 502 | HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataOutStageCallbackTypeDef pCallback) |
504 | HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, |
| - | 505 | pPCD_DataOutStageCallbackTypeDef pCallback) |
|
| 503 | { |
506 | { |
| 504 | HAL_StatusTypeDef status = HAL_OK; |
507 | HAL_StatusTypeDef status = HAL_OK; |
| 505 | 508 | ||
| 506 | if (pCallback == NULL) |
509 | if (pCallback == NULL) |
| 507 | { |
510 | { |
| Line 570... | Line 573... | ||
| 570 | * To be used instead of the weak HAL_PCD_DataInStageCallback() predefined callback |
573 | * To be used instead of the weak HAL_PCD_DataInStageCallback() predefined callback |
| 571 | * @param hpcd PCD handle |
574 | * @param hpcd PCD handle |
| 572 | * @param pCallback pointer to the USB PCD Data IN Stage Callback function |
575 | * @param pCallback pointer to the USB PCD Data IN Stage Callback function |
| 573 | * @retval HAL status |
576 | * @retval HAL status |
| 574 | */ |
577 | */ |
| 575 | HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataInStageCallbackTypeDef pCallback) |
578 | HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, |
| - | 579 | pPCD_DataInStageCallbackTypeDef pCallback) |
|
| 576 | { |
580 | { |
| 577 | HAL_StatusTypeDef status = HAL_OK; |
581 | HAL_StatusTypeDef status = HAL_OK; |
| 578 | 582 | ||
| 579 | if (pCallback == NULL) |
583 | if (pCallback == NULL) |
| 580 | { |
584 | { |
| Line 643... | Line 647... | ||
| 643 | * To be used instead of the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback |
647 | * To be used instead of the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback |
| 644 | * @param hpcd PCD handle |
648 | * @param hpcd PCD handle |
| 645 | * @param pCallback pointer to the USB PCD Iso OUT incomplete Callback function |
649 | * @param pCallback pointer to the USB PCD Iso OUT incomplete Callback function |
| 646 | * @retval HAL status |
650 | * @retval HAL status |
| 647 | */ |
651 | */ |
| 648 | HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoOutIncpltCallbackTypeDef pCallback) |
652 | HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, |
| - | 653 | pPCD_IsoOutIncpltCallbackTypeDef pCallback) |
|
| 649 | { |
654 | { |
| 650 | HAL_StatusTypeDef status = HAL_OK; |
655 | HAL_StatusTypeDef status = HAL_OK; |
| 651 | 656 | ||
| 652 | if (pCallback == NULL) |
657 | if (pCallback == NULL) |
| 653 | { |
658 | { |
| Line 679... | Line 684... | ||
| 679 | return status; |
684 | return status; |
| 680 | } |
685 | } |
| 681 | 686 | ||
| 682 | /** |
687 | /** |
| 683 | * @brief Unregister the USB PCD Iso OUT incomplete Callback |
688 | * @brief Unregister the USB PCD Iso OUT incomplete Callback |
| - | 689 | * USB PCD Iso OUT incomplete Callback is redirected |
|
| 684 | * USB PCD Iso OUT incomplete Callback is redirected to the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback |
690 | * to the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback |
| 685 | * @param hpcd PCD handle |
691 | * @param hpcd PCD handle |
| 686 | * @retval HAL status |
692 | * @retval HAL status |
| 687 | */ |
693 | */ |
| 688 | HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd) |
694 | HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd) |
| 689 | { |
695 | { |
| Line 716... | Line 722... | ||
| 716 | * To be used instead of the weak HAL_PCD_ISOINIncompleteCallback() predefined callback |
722 | * To be used instead of the weak HAL_PCD_ISOINIncompleteCallback() predefined callback |
| 717 | * @param hpcd PCD handle |
723 | * @param hpcd PCD handle |
| 718 | * @param pCallback pointer to the USB PCD Iso IN incomplete Callback function |
724 | * @param pCallback pointer to the USB PCD Iso IN incomplete Callback function |
| 719 | * @retval HAL status |
725 | * @retval HAL status |
| 720 | */ |
726 | */ |
| 721 | HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoInIncpltCallbackTypeDef pCallback) |
727 | HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, |
| - | 728 | pPCD_IsoInIncpltCallbackTypeDef pCallback) |
|
| 722 | { |
729 | { |
| 723 | HAL_StatusTypeDef status = HAL_OK; |
730 | HAL_StatusTypeDef status = HAL_OK; |
| 724 | 731 | ||
| 725 | if (pCallback == NULL) |
732 | if (pCallback == NULL) |
| 726 | { |
733 | { |
| Line 752... | Line 759... | ||
| 752 | return status; |
759 | return status; |
| 753 | } |
760 | } |
| 754 | 761 | ||
| 755 | /** |
762 | /** |
| 756 | * @brief Unregister the USB PCD Iso IN incomplete Callback |
763 | * @brief Unregister the USB PCD Iso IN incomplete Callback |
| - | 764 | * USB PCD Iso IN incomplete Callback is redirected |
|
| 757 | * USB PCD Iso IN incomplete Callback is redirected to the weak HAL_PCD_ISOINIncompleteCallback() predefined callback |
765 | * to the weak HAL_PCD_ISOINIncompleteCallback() predefined callback |
| 758 | * @param hpcd PCD handle |
766 | * @param hpcd PCD handle |
| 759 | * @retval HAL status |
767 | * @retval HAL status |
| 760 | */ |
768 | */ |
| 761 | HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd) |
769 | HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd) |
| 762 | { |
770 | { |
| Line 1187... | Line 1195... | ||
| 1187 | * @param ep_addr endpoint address |
1195 | * @param ep_addr endpoint address |
| 1188 | * @param ep_mps endpoint max packet size |
1196 | * @param ep_mps endpoint max packet size |
| 1189 | * @param ep_type endpoint type |
1197 | * @param ep_type endpoint type |
| 1190 | * @retval HAL status |
1198 | * @retval HAL status |
| 1191 | */ |
1199 | */ |
| 1192 | HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type) |
1200 | HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, |
| - | 1201 | uint16_t ep_mps, uint8_t ep_type) |
|
| 1193 | { |
1202 | { |
| 1194 | HAL_StatusTypeDef ret = HAL_OK; |
1203 | HAL_StatusTypeDef ret = HAL_OK; |
| 1195 | PCD_EPTypeDef *ep; |
1204 | PCD_EPTypeDef *ep; |
| 1196 | 1205 | ||
| 1197 | if ((ep_addr & 0x80U) == 0x80U) |
1206 | if ((ep_addr & 0x80U) == 0x80U) |
| Line 1364... | Line 1373... | ||
| 1364 | ep->num = ep_addr & EP_ADDR_MSK; |
1373 | ep->num = ep_addr & EP_ADDR_MSK; |
| 1365 | 1374 | ||
| 1366 | __HAL_LOCK(hpcd); |
1375 | __HAL_LOCK(hpcd); |
| 1367 | 1376 | ||
| 1368 | (void)USB_EPSetStall(hpcd->Instance, ep); |
1377 | (void)USB_EPSetStall(hpcd->Instance, ep); |
| 1369 | if ((ep_addr & EP_ADDR_MSK) == 0U) |
- | |
| 1370 | { |
- | |
| 1371 | (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t *)hpcd->Setup); |
- | |
| 1372 | } |
1378 | |
| 1373 | __HAL_UNLOCK(hpcd); |
1379 | __HAL_UNLOCK(hpcd); |
| 1374 | 1380 | ||
| 1375 | return HAL_OK; |
1381 | return HAL_OK; |
| 1376 | } |
1382 | } |
| 1377 | 1383 | ||
| Line 1502... | Line 1508... | ||
| 1502 | 1508 | ||
| 1503 | /* stay in loop while pending interrupts */ |
1509 | /* stay in loop while pending interrupts */ |
| 1504 | while ((hpcd->Instance->ISTR & USB_ISTR_CTR) != 0U) |
1510 | while ((hpcd->Instance->ISTR & USB_ISTR_CTR) != 0U) |
| 1505 | { |
1511 | { |
| 1506 | wIstr = hpcd->Instance->ISTR; |
1512 | wIstr = hpcd->Instance->ISTR; |
| - | 1513 | ||
| 1507 | /* extract highest priority endpoint number */ |
1514 | /* extract highest priority endpoint number */ |
| 1508 | epindex = (uint8_t)(wIstr & USB_ISTR_EP_ID); |
1515 | epindex = (uint8_t)(wIstr & USB_ISTR_EP_ID); |
| 1509 | 1516 | ||
| 1510 | if (epindex == 0U) |
1517 | if (epindex == 0U) |
| 1511 | { |
1518 | { |
| Line 1584... | Line 1591... | ||
| 1584 | #else |
1591 | #else |
| 1585 | HAL_PCD_DataOutStageCallback(hpcd, 0U); |
1592 | HAL_PCD_DataOutStageCallback(hpcd, 0U); |
| 1586 | #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
1593 | #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
| 1587 | } |
1594 | } |
| 1588 | 1595 | ||
| - | 1596 | if ((PCD_GET_ENDPOINT(hpcd->Instance, PCD_ENDP0) & USB_EP_SETUP) == 0U) |
|
| - | 1597 | { |
|
| 1589 | PCD_SET_EP_RX_CNT(hpcd->Instance, PCD_ENDP0, ep->maxpacket); |
1598 | PCD_SET_EP_RX_CNT(hpcd->Instance, PCD_ENDP0, ep->maxpacket); |
| 1590 | PCD_SET_EP_RX_STATUS(hpcd->Instance, PCD_ENDP0, USB_EP_RX_VALID); |
1599 | PCD_SET_EP_RX_STATUS(hpcd->Instance, PCD_ENDP0, USB_EP_RX_VALID); |
| - | 1600 | } |
|
| 1591 | } |
1601 | } |
| 1592 | } |
1602 | } |
| 1593 | } |
1603 | } |
| 1594 | else |
1604 | else |
| 1595 | { |
1605 | { |
| Line 1672... | Line 1682... | ||
| 1672 | ep = &hpcd->IN_ep[epindex]; |
1682 | ep = &hpcd->IN_ep[epindex]; |
| 1673 | 1683 | ||
| 1674 | /* clear int flag */ |
1684 | /* clear int flag */ |
| 1675 | PCD_CLEAR_TX_EP_CTR(hpcd->Instance, epindex); |
1685 | PCD_CLEAR_TX_EP_CTR(hpcd->Instance, epindex); |
| 1676 | 1686 | ||
| 1677 | /* Manage all non bulk transaction or Bulk Single Buffer Transaction */ |
1687 | /* Manage all non bulk/isoc transaction Bulk Single Buffer Transaction */ |
| 1678 | if ((ep->type != EP_TYPE_BULK) || |
1688 | if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_CTRL) || |
| 1679 | ((ep->type == EP_TYPE_BULK) && ((wEPVal & USB_EP_KIND) == 0U))) |
1689 | ((ep->type == EP_TYPE_BULK) && ((wEPVal & USB_EP_KIND) == 0U))) |
| 1680 | { |
1690 | { |
| 1681 | /* multi-packet on the NON control IN endpoint */ |
1691 | /* multi-packet on the NON control IN endpoint */ |
| 1682 | TxByteNbre = (uint16_t)PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num); |
1692 | TxByteNbre = (uint16_t)PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num); |
| 1683 | 1693 | ||
| 1684 | if (ep->xfer_len > TxByteNbre) |
1694 | if (ep->xfer_len > TxByteNbre) |
| Line 1706... | Line 1716... | ||
| 1706 | ep->xfer_buff += TxByteNbre; |
1716 | ep->xfer_buff += TxByteNbre; |
| 1707 | ep->xfer_count += TxByteNbre; |
1717 | ep->xfer_count += TxByteNbre; |
| 1708 | (void)USB_EPStartXfer(hpcd->Instance, ep); |
1718 | (void)USB_EPStartXfer(hpcd->Instance, ep); |
| 1709 | } |
1719 | } |
| 1710 | } |
1720 | } |
| 1711 | /* bulk in double buffer enable in case of transferLen> Ep_Mps */ |
1721 | /* Double Buffer Iso/bulk IN (bulk transfer Len > Ep_Mps) */ |
| 1712 | else |
1722 | else |
| 1713 | { |
1723 | { |
| 1714 | (void)HAL_PCD_EP_DB_Transmit(hpcd, ep, wEPVal); |
1724 | (void)HAL_PCD_EP_DB_Transmit(hpcd, ep, wEPVal); |
| 1715 | } |
1725 | } |
| 1716 | } |
1726 | } |
| Line 1830... | Line 1840... | ||
| 1830 | ep->xfer_len = 0U; |
1840 | ep->xfer_len = 0U; |
| 1831 | } |
1841 | } |
| 1832 | /* Transfer is completed */ |
1842 | /* Transfer is completed */ |
| 1833 | if (ep->xfer_len == 0U) |
1843 | if (ep->xfer_len == 0U) |
| 1834 | { |
1844 | { |
| - | 1845 | PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); |
|
| - | 1846 | PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); |
|
| - | 1847 | ||
| 1835 | /* TX COMPLETE */ |
1848 | /* TX COMPLETE */ |
| 1836 | #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
1849 | #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
| 1837 | hpcd->DataInStageCallback(hpcd, ep->num); |
1850 | hpcd->DataInStageCallback(hpcd, ep->num); |
| 1838 | #else |
1851 | #else |
| 1839 | HAL_PCD_DataInStageCallback(hpcd, ep->num); |
1852 | HAL_PCD_DataInStageCallback(hpcd, ep->num); |
| Line 1900... | Line 1913... | ||
| 1900 | } |
1913 | } |
| 1901 | 1914 | ||
| 1902 | /* Transfer is completed */ |
1915 | /* Transfer is completed */ |
| 1903 | if (ep->xfer_len == 0U) |
1916 | if (ep->xfer_len == 0U) |
| 1904 | { |
1917 | { |
| - | 1918 | PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); |
|
| - | 1919 | PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); |
|
| - | 1920 | ||
| 1905 | /* TX COMPLETE */ |
1921 | /* TX COMPLETE */ |
| 1906 | #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
1922 | #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) |
| 1907 | hpcd->DataInStageCallback(hpcd, ep->num); |
1923 | hpcd->DataInStageCallback(hpcd, ep->num); |
| 1908 | #else |
1924 | #else |
| 1909 | HAL_PCD_DataInStageCallback(hpcd, ep->num); |
1925 | HAL_PCD_DataInStageCallback(hpcd, ep->num); |
| 1910 | #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
1926 | #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ |
| 1911 | 1927 | ||
| 1912 | /*need to Free USB Buff*/ |
1928 | /* need to Free USB Buff */ |
| 1913 | if ((wEPVal & USB_EP_DTOG_RX) == 0U) |
1929 | if ((wEPVal & USB_EP_DTOG_RX) == 0U) |
| 1914 | { |
1930 | { |
| 1915 | PCD_FreeUserBuffer(hpcd->Instance, ep->num, 1U); |
1931 | PCD_FreeUserBuffer(hpcd->Instance, ep->num, 1U); |
| 1916 | } |
1932 | } |
| 1917 | } |
1933 | } |