STM32F4xx HAL Documentation
Hardware Abstraction Layer for STM32F4 familiy
Loading...
Searching...
No Matches
stm32f4xx_hal_pcd.c
Go to the documentation of this file.
1
57/* Includes ------------------------------------------------------------------*/
58#include "stm32f4xx_hal.h"
59
69#ifdef HAL_PCD_MODULE_ENABLED
70
71#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
72
73/* Private types -------------------------------------------------------------*/
74/* Private variables ---------------------------------------------------------*/
75/* Private constants ---------------------------------------------------------*/
76/* Private macros ------------------------------------------------------------*/
80#define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b))
81#define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b))
86/* Private functions prototypes ----------------------------------------------*/
90#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
91static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum);
94#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */
99/* Exported functions --------------------------------------------------------*/
124{
125#if defined (USB_OTG_FS)
126 const USB_OTG_GlobalTypeDef *USBx;
127#endif /* defined (USB_OTG_FS) */
128 uint8_t i;
129
130 /* Check the PCD handle allocation */
131 if (hpcd == NULL)
132 {
133 return HAL_ERROR;
134 }
135
136 /* Check the parameters */
137 assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance));
138
139#if defined (USB_OTG_FS)
140 USBx = hpcd->Instance;
141#endif /* defined (USB_OTG_FS) */
142
143 if (hpcd->State == HAL_PCD_STATE_RESET)
144 {
145 /* Allocate lock resource and initialize it */
146 hpcd->Lock = HAL_UNLOCKED;
147
148#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
149 hpcd->SOFCallback = HAL_PCD_SOFCallback;
150 hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback;
151 hpcd->ResetCallback = HAL_PCD_ResetCallback;
152 hpcd->SuspendCallback = HAL_PCD_SuspendCallback;
153 hpcd->ResumeCallback = HAL_PCD_ResumeCallback;
154 hpcd->ConnectCallback = HAL_PCD_ConnectCallback;
155 hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback;
156 hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback;
157 hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback;
158 hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback;
159 hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback;
160 hpcd->LPMCallback = HAL_PCDEx_LPM_Callback;
161 hpcd->BCDCallback = HAL_PCDEx_BCD_Callback;
162
163 if (hpcd->MspInitCallback == NULL)
164 {
165 hpcd->MspInitCallback = HAL_PCD_MspInit;
166 }
167
168 /* Init the low level hardware */
169 hpcd->MspInitCallback(hpcd);
170#else
171 /* Init the low level hardware : GPIO, CLOCK, NVIC... */
172 HAL_PCD_MspInit(hpcd);
173#endif /* (USE_HAL_PCD_REGISTER_CALLBACKS) */
174 }
175
177
178#if defined (USB_OTG_FS)
179 /* Disable DMA mode for FS instance */
180 if (USBx == USB_OTG_FS)
181 {
182 hpcd->Init.dma_enable = 0U;
183 }
184#endif /* defined (USB_OTG_FS) */
185
186 /* Disable the Interrupts */
187 __HAL_PCD_DISABLE(hpcd);
188
189 /*Init the Core (common init.) */
190 if (USB_CoreInit(hpcd->Instance, hpcd->Init) != HAL_OK)
191 {
193 return HAL_ERROR;
194 }
195
196 /* Force Device Mode */
197 if (USB_SetCurrentMode(hpcd->Instance, USB_DEVICE_MODE) != HAL_OK)
198 {
200 return HAL_ERROR;
201 }
202
203 /* Init endpoints structures */
204 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
205 {
206 /* Init ep structure */
207 hpcd->IN_ep[i].is_in = 1U;
208 hpcd->IN_ep[i].num = i;
209 hpcd->IN_ep[i].tx_fifo_num = i;
210 /* Control until ep is activated */
211 hpcd->IN_ep[i].type = EP_TYPE_CTRL;
212 hpcd->IN_ep[i].maxpacket = 0U;
213 hpcd->IN_ep[i].xfer_buff = 0U;
214 hpcd->IN_ep[i].xfer_len = 0U;
215 }
216
217 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
218 {
219 hpcd->OUT_ep[i].is_in = 0U;
220 hpcd->OUT_ep[i].num = i;
221 /* Control until ep is activated */
222 hpcd->OUT_ep[i].type = EP_TYPE_CTRL;
223 hpcd->OUT_ep[i].maxpacket = 0U;
224 hpcd->OUT_ep[i].xfer_buff = 0U;
225 hpcd->OUT_ep[i].xfer_len = 0U;
226 }
227
228 /* Init Device */
229 if (USB_DevInit(hpcd->Instance, hpcd->Init) != HAL_OK)
230 {
232 return HAL_ERROR;
233 }
234
235 hpcd->USB_Address = 0U;
237#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \
238 || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \
239 || defined(STM32F423xx)
240 /* Activate LPM */
241 if (hpcd->Init.lpm_enable == 1U)
242 {
243 (void)HAL_PCDEx_ActivateLPM(hpcd);
244 }
245#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||
246 defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||
247 defined(STM32F423xx) */
248 (void)USB_DevDisconnect(hpcd->Instance);
249
250 return HAL_OK;
251}
252
259{
260 /* Check the PCD handle allocation */
261 if (hpcd == NULL)
262 {
263 return HAL_ERROR;
264 }
265
267
268 /* Stop Device */
269 if (USB_StopDevice(hpcd->Instance) != HAL_OK)
270 {
271 return HAL_ERROR;
272 }
273
274#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
275 if (hpcd->MspDeInitCallback == NULL)
276 {
277 hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; /* Legacy weak MspDeInit */
278 }
279
280 /* DeInit the low level hardware */
281 hpcd->MspDeInitCallback(hpcd);
282#else
283 /* DeInit the low level hardware: CLOCK, NVIC.*/
284 HAL_PCD_MspDeInit(hpcd);
285#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
286
288
289 return HAL_OK;
290}
291
298{
299 /* Prevent unused argument(s) compilation warning */
300 UNUSED(hpcd);
301
302 /* NOTE : This function should not be modified, when the callback is needed,
303 the HAL_PCD_MspInit could be implemented in the user file
304 */
305}
306
313{
314 /* Prevent unused argument(s) compilation warning */
315 UNUSED(hpcd);
316
317 /* NOTE : This function should not be modified, when the callback is needed,
318 the HAL_PCD_MspDeInit could be implemented in the user file
319 */
320}
321
322#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
341HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd,
342 HAL_PCD_CallbackIDTypeDef CallbackID,
343 pPCD_CallbackTypeDef pCallback)
344{
345 HAL_StatusTypeDef status = HAL_OK;
346
347 if (pCallback == NULL)
348 {
349 /* Update the error code */
350 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
351 return HAL_ERROR;
352 }
353 /* Process locked */
354 __HAL_LOCK(hpcd);
355
356 if (hpcd->State == HAL_PCD_STATE_READY)
357 {
358 switch (CallbackID)
359 {
360 case HAL_PCD_SOF_CB_ID :
361 hpcd->SOFCallback = pCallback;
362 break;
363
364 case HAL_PCD_SETUPSTAGE_CB_ID :
365 hpcd->SetupStageCallback = pCallback;
366 break;
367
368 case HAL_PCD_RESET_CB_ID :
369 hpcd->ResetCallback = pCallback;
370 break;
371
372 case HAL_PCD_SUSPEND_CB_ID :
373 hpcd->SuspendCallback = pCallback;
374 break;
375
376 case HAL_PCD_RESUME_CB_ID :
377 hpcd->ResumeCallback = pCallback;
378 break;
379
380 case HAL_PCD_CONNECT_CB_ID :
381 hpcd->ConnectCallback = pCallback;
382 break;
383
384 case HAL_PCD_DISCONNECT_CB_ID :
385 hpcd->DisconnectCallback = pCallback;
386 break;
387
388 case HAL_PCD_MSPINIT_CB_ID :
389 hpcd->MspInitCallback = pCallback;
390 break;
391
392 case HAL_PCD_MSPDEINIT_CB_ID :
393 hpcd->MspDeInitCallback = pCallback;
394 break;
395
396 default :
397 /* Update the error code */
398 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
399 /* Return error status */
400 status = HAL_ERROR;
401 break;
402 }
403 }
404 else if (hpcd->State == HAL_PCD_STATE_RESET)
405 {
406 switch (CallbackID)
407 {
408 case HAL_PCD_MSPINIT_CB_ID :
409 hpcd->MspInitCallback = pCallback;
410 break;
411
412 case HAL_PCD_MSPDEINIT_CB_ID :
413 hpcd->MspDeInitCallback = pCallback;
414 break;
415
416 default :
417 /* Update the error code */
418 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
419 /* Return error status */
420 status = HAL_ERROR;
421 break;
422 }
423 }
424 else
425 {
426 /* Update the error code */
427 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
428 /* Return error status */
429 status = HAL_ERROR;
430 }
431
432 /* Release Lock */
433 __HAL_UNLOCK(hpcd);
434 return status;
435}
436
454HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID)
455{
456 HAL_StatusTypeDef status = HAL_OK;
457
458 /* Process locked */
459 __HAL_LOCK(hpcd);
460
461 /* Setup Legacy weak Callbacks */
462 if (hpcd->State == HAL_PCD_STATE_READY)
463 {
464 switch (CallbackID)
465 {
466 case HAL_PCD_SOF_CB_ID :
467 hpcd->SOFCallback = HAL_PCD_SOFCallback;
468 break;
469
470 case HAL_PCD_SETUPSTAGE_CB_ID :
471 hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback;
472 break;
473
474 case HAL_PCD_RESET_CB_ID :
475 hpcd->ResetCallback = HAL_PCD_ResetCallback;
476 break;
477
478 case HAL_PCD_SUSPEND_CB_ID :
479 hpcd->SuspendCallback = HAL_PCD_SuspendCallback;
480 break;
481
482 case HAL_PCD_RESUME_CB_ID :
483 hpcd->ResumeCallback = HAL_PCD_ResumeCallback;
484 break;
485
486 case HAL_PCD_CONNECT_CB_ID :
487 hpcd->ConnectCallback = HAL_PCD_ConnectCallback;
488 break;
489
490 case HAL_PCD_DISCONNECT_CB_ID :
491 hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback;
492 break;
493
494 case HAL_PCD_MSPINIT_CB_ID :
495 hpcd->MspInitCallback = HAL_PCD_MspInit;
496 break;
497
498 case HAL_PCD_MSPDEINIT_CB_ID :
499 hpcd->MspDeInitCallback = HAL_PCD_MspDeInit;
500 break;
501
502 default :
503 /* Update the error code */
504 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
505
506 /* Return error status */
507 status = HAL_ERROR;
508 break;
509 }
510 }
511 else if (hpcd->State == HAL_PCD_STATE_RESET)
512 {
513 switch (CallbackID)
514 {
515 case HAL_PCD_MSPINIT_CB_ID :
516 hpcd->MspInitCallback = HAL_PCD_MspInit;
517 break;
518
519 case HAL_PCD_MSPDEINIT_CB_ID :
520 hpcd->MspDeInitCallback = HAL_PCD_MspDeInit;
521 break;
522
523 default :
524 /* Update the error code */
525 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
526
527 /* Return error status */
528 status = HAL_ERROR;
529 break;
530 }
531 }
532 else
533 {
534 /* Update the error code */
535 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
536
537 /* Return error status */
538 status = HAL_ERROR;
539 }
540
541 /* Release Lock */
542 __HAL_UNLOCK(hpcd);
543 return status;
544}
545
553HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd,
554 pPCD_DataOutStageCallbackTypeDef pCallback)
555{
556 HAL_StatusTypeDef status = HAL_OK;
557
558 if (pCallback == NULL)
559 {
560 /* Update the error code */
561 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
562
563 return HAL_ERROR;
564 }
565
566 /* Process locked */
567 __HAL_LOCK(hpcd);
568
569 if (hpcd->State == HAL_PCD_STATE_READY)
570 {
571 hpcd->DataOutStageCallback = pCallback;
572 }
573 else
574 {
575 /* Update the error code */
576 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
577
578 /* Return error status */
579 status = HAL_ERROR;
580 }
581
582 /* Release Lock */
583 __HAL_UNLOCK(hpcd);
584
585 return status;
586}
587
594HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd)
595{
596 HAL_StatusTypeDef status = HAL_OK;
597
598 /* Process locked */
599 __HAL_LOCK(hpcd);
600
601 if (hpcd->State == HAL_PCD_STATE_READY)
602 {
603 hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; /* Legacy weak DataOutStageCallback */
604 }
605 else
606 {
607 /* Update the error code */
608 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
609
610 /* Return error status */
611 status = HAL_ERROR;
612 }
613
614 /* Release Lock */
615 __HAL_UNLOCK(hpcd);
616
617 return status;
618}
619
627HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd,
628 pPCD_DataInStageCallbackTypeDef pCallback)
629{
630 HAL_StatusTypeDef status = HAL_OK;
631
632 if (pCallback == NULL)
633 {
634 /* Update the error code */
635 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
636
637 return HAL_ERROR;
638 }
639
640 /* Process locked */
641 __HAL_LOCK(hpcd);
642
643 if (hpcd->State == HAL_PCD_STATE_READY)
644 {
645 hpcd->DataInStageCallback = pCallback;
646 }
647 else
648 {
649 /* Update the error code */
650 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
651
652 /* Return error status */
653 status = HAL_ERROR;
654 }
655
656 /* Release Lock */
657 __HAL_UNLOCK(hpcd);
658
659 return status;
660}
661
668HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd)
669{
670 HAL_StatusTypeDef status = HAL_OK;
671
672 /* Process locked */
673 __HAL_LOCK(hpcd);
674
675 if (hpcd->State == HAL_PCD_STATE_READY)
676 {
677 hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; /* Legacy weak DataInStageCallback */
678 }
679 else
680 {
681 /* Update the error code */
682 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
683
684 /* Return error status */
685 status = HAL_ERROR;
686 }
687
688 /* Release Lock */
689 __HAL_UNLOCK(hpcd);
690
691 return status;
692}
693
701HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd,
702 pPCD_IsoOutIncpltCallbackTypeDef pCallback)
703{
704 HAL_StatusTypeDef status = HAL_OK;
705
706 if (pCallback == NULL)
707 {
708 /* Update the error code */
709 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
710
711 return HAL_ERROR;
712 }
713
714 /* Process locked */
715 __HAL_LOCK(hpcd);
716
717 if (hpcd->State == HAL_PCD_STATE_READY)
718 {
719 hpcd->ISOOUTIncompleteCallback = pCallback;
720 }
721 else
722 {
723 /* Update the error code */
724 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
725
726 /* Return error status */
727 status = HAL_ERROR;
728 }
729
730 /* Release Lock */
731 __HAL_UNLOCK(hpcd);
732
733 return status;
734}
735
743HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd)
744{
745 HAL_StatusTypeDef status = HAL_OK;
746
747 /* Process locked */
748 __HAL_LOCK(hpcd);
749
750 if (hpcd->State == HAL_PCD_STATE_READY)
751 {
752 hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; /* Legacy weak ISOOUTIncompleteCallback */
753 }
754 else
755 {
756 /* Update the error code */
757 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
758
759 /* Return error status */
760 status = HAL_ERROR;
761 }
762
763 /* Release Lock */
764 __HAL_UNLOCK(hpcd);
765
766 return status;
767}
768
776HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd,
777 pPCD_IsoInIncpltCallbackTypeDef pCallback)
778{
779 HAL_StatusTypeDef status = HAL_OK;
780
781 if (pCallback == NULL)
782 {
783 /* Update the error code */
784 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
785
786 return HAL_ERROR;
787 }
788
789 /* Process locked */
790 __HAL_LOCK(hpcd);
791
792 if (hpcd->State == HAL_PCD_STATE_READY)
793 {
794 hpcd->ISOINIncompleteCallback = pCallback;
795 }
796 else
797 {
798 /* Update the error code */
799 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
800
801 /* Return error status */
802 status = HAL_ERROR;
803 }
804
805 /* Release Lock */
806 __HAL_UNLOCK(hpcd);
807
808 return status;
809}
810
818HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd)
819{
820 HAL_StatusTypeDef status = HAL_OK;
821
822 /* Process locked */
823 __HAL_LOCK(hpcd);
824
825 if (hpcd->State == HAL_PCD_STATE_READY)
826 {
827 hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; /* Legacy weak ISOINIncompleteCallback */
828 }
829 else
830 {
831 /* Update the error code */
832 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
833
834 /* Return error status */
835 status = HAL_ERROR;
836 }
837
838 /* Release Lock */
839 __HAL_UNLOCK(hpcd);
840
841 return status;
842}
843
851HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback)
852{
853 HAL_StatusTypeDef status = HAL_OK;
854
855 if (pCallback == NULL)
856 {
857 /* Update the error code */
858 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
859
860 return HAL_ERROR;
861 }
862
863 /* Process locked */
864 __HAL_LOCK(hpcd);
865
866 if (hpcd->State == HAL_PCD_STATE_READY)
867 {
868 hpcd->BCDCallback = pCallback;
869 }
870 else
871 {
872 /* Update the error code */
873 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
874
875 /* Return error status */
876 status = HAL_ERROR;
877 }
878
879 /* Release Lock */
880 __HAL_UNLOCK(hpcd);
881
882 return status;
883}
884
891HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd)
892{
893 HAL_StatusTypeDef status = HAL_OK;
894
895 /* Process locked */
896 __HAL_LOCK(hpcd);
897
898 if (hpcd->State == HAL_PCD_STATE_READY)
899 {
900 hpcd->BCDCallback = HAL_PCDEx_BCD_Callback; /* Legacy weak HAL_PCDEx_BCD_Callback */
901 }
902 else
903 {
904 /* Update the error code */
905 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
906
907 /* Return error status */
908 status = HAL_ERROR;
909 }
910
911 /* Release Lock */
912 __HAL_UNLOCK(hpcd);
913
914 return status;
915}
916
924HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback)
925{
926 HAL_StatusTypeDef status = HAL_OK;
927
928 if (pCallback == NULL)
929 {
930 /* Update the error code */
931 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
932
933 return HAL_ERROR;
934 }
935
936 /* Process locked */
937 __HAL_LOCK(hpcd);
938
939 if (hpcd->State == HAL_PCD_STATE_READY)
940 {
941 hpcd->LPMCallback = pCallback;
942 }
943 else
944 {
945 /* Update the error code */
946 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
947
948 /* Return error status */
949 status = HAL_ERROR;
950 }
951
952 /* Release Lock */
953 __HAL_UNLOCK(hpcd);
954
955 return status;
956}
957
964HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd)
965{
966 HAL_StatusTypeDef status = HAL_OK;
967
968 /* Process locked */
969 __HAL_LOCK(hpcd);
970
971 if (hpcd->State == HAL_PCD_STATE_READY)
972 {
973 hpcd->LPMCallback = HAL_PCDEx_LPM_Callback; /* Legacy weak HAL_PCDEx_LPM_Callback */
974 }
975 else
976 {
977 /* Update the error code */
978 hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;
979
980 /* Return error status */
981 status = HAL_ERROR;
982 }
983
984 /* Release Lock */
985 __HAL_UNLOCK(hpcd);
986
987 return status;
988}
989#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
990
1016{
1017 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1018
1019 __HAL_LOCK(hpcd);
1020
1021 if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) &&
1022 (hpcd->Init.battery_charging_enable == 1U))
1023 {
1024 /* Enable USB Transceiver */
1025 USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN;
1026 }
1027
1028 __HAL_PCD_ENABLE(hpcd);
1029 (void)USB_DevConnect(hpcd->Instance);
1030 __HAL_UNLOCK(hpcd);
1031
1032 return HAL_OK;
1033}
1034
1041{
1042 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1043
1044 __HAL_LOCK(hpcd);
1045 __HAL_PCD_DISABLE(hpcd);
1046 (void)USB_DevDisconnect(hpcd->Instance);
1047
1048 (void)USB_FlushTxFifo(hpcd->Instance, 0x10U);
1049
1050 if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) &&
1051 (hpcd->Init.battery_charging_enable == 1U))
1052 {
1053 /* Disable USB Transceiver */
1054 USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);
1055 }
1056
1057 __HAL_UNLOCK(hpcd);
1058
1059 return HAL_OK;
1060}
1061
1062#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
1069{
1070 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1071 uint32_t USBx_BASE = (uint32_t)USBx;
1072 USB_OTG_EPTypeDef *ep;
1073 uint32_t i;
1074 uint32_t ep_intr;
1075 uint32_t epint;
1076 uint32_t epnum;
1077 uint32_t fifoemptymsk;
1078 uint32_t RegVal;
1079
1080 /* ensure that we are in device mode */
1081 if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE)
1082 {
1083 /* avoid spurious interrupt */
1085 {
1086 return;
1087 }
1088
1089 /* store current frame number */
1090 hpcd->FrameNumber = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF_Msk) >> USB_OTG_DSTS_FNSOF_Pos;
1091
1092 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS))
1093 {
1094 /* incorrect mode, acknowledge the interrupt */
1095 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS);
1096 }
1097
1098 /* Handle RxQLevel Interrupt */
1099 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL))
1100 {
1101 USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
1102
1103 RegVal = USBx->GRXSTSP;
1104
1105 ep = &hpcd->OUT_ep[RegVal & USB_OTG_GRXSTSP_EPNUM];
1106
1107 if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT)
1108 {
1109 if ((RegVal & USB_OTG_GRXSTSP_BCNT) != 0U)
1110 {
1111 (void)USB_ReadPacket(USBx, ep->xfer_buff,
1112 (uint16_t)((RegVal & USB_OTG_GRXSTSP_BCNT) >> 4));
1113
1114 ep->xfer_buff += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4;
1115 ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4;
1116 }
1117 }
1118 else if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT)
1119 {
1120 (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U);
1121 ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4;
1122 }
1123 else
1124 {
1125 /* ... */
1126 }
1127
1128 USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
1129 }
1130
1131 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT))
1132 {
1133 epnum = 0U;
1134
1135 /* Read in the device interrupt bits */
1136 ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance);
1137
1138 while (ep_intr != 0U)
1139 {
1140 if ((ep_intr & 0x1U) != 0U)
1141 {
1142 epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, (uint8_t)epnum);
1143
1144 if ((epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC)
1145 {
1146 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC);
1147 (void)PCD_EP_OutXfrComplete_int(hpcd, epnum);
1148 }
1149
1150 if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP)
1151 {
1152 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP);
1153 /* Class B setup phase done for previous decoded setup */
1154 (void)PCD_EP_OutSetupPacket_int(hpcd, epnum);
1155 }
1156
1157 if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS)
1158 {
1159 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS);
1160 }
1161
1162 /* Clear OUT Endpoint disable interrupt */
1163 if ((epint & USB_OTG_DOEPINT_EPDISD) == USB_OTG_DOEPINT_EPDISD)
1164 {
1165 if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == USB_OTG_GINTSTS_BOUTNAKEFF)
1166 {
1167 USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGONAK;
1168 }
1169
1170 ep = &hpcd->OUT_ep[epnum];
1171
1172 if (ep->is_iso_incomplete == 1U)
1173 {
1174 ep->is_iso_incomplete = 0U;
1175
1176#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1177 hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum);
1178#else
1179 HAL_PCD_ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum);
1180#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1181 }
1182
1183 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_EPDISD);
1184 }
1185
1186 /* Clear Status Phase Received interrupt */
1188 {
1189 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);
1190 }
1191
1192 /* Clear OUT NAK interrupt */
1194 {
1195 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_NAK);
1196 }
1197 }
1198 epnum++;
1199 ep_intr >>= 1U;
1200 }
1201 }
1202
1203 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT))
1204 {
1205 /* Read in the device interrupt bits */
1206 ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance);
1207
1208 epnum = 0U;
1209
1210 while (ep_intr != 0U)
1211 {
1212 if ((ep_intr & 0x1U) != 0U) /* In ITR */
1213 {
1214 epint = USB_ReadDevInEPInterrupt(hpcd->Instance, (uint8_t)epnum);
1215
1216 if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC)
1217 {
1218 fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));
1219 USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
1220
1221 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC);
1222
1223 if (hpcd->Init.dma_enable == 1U)
1224 {
1225 hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket;
1226
1227 /* this is ZLP, so prepare EP0 for next setup */
1228 if ((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U))
1229 {
1230 /* prepare to rx more setup packets */
1231 (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
1232 }
1233 }
1234
1235#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1236 hpcd->DataInStageCallback(hpcd, (uint8_t)epnum);
1237#else
1238 HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum);
1239#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1240 }
1241 if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC)
1242 {
1243 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC);
1244 }
1245 if ((epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE)
1246 {
1247 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE);
1248 }
1249 if ((epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE)
1250 {
1251 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE);
1252 }
1253 if ((epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD)
1254 {
1255 (void)USB_FlushTxFifo(USBx, epnum);
1256
1257 ep = &hpcd->IN_ep[epnum];
1258
1259 if (ep->is_iso_incomplete == 1U)
1260 {
1261 ep->is_iso_incomplete = 0U;
1262
1263#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1264 hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum);
1265#else
1266 HAL_PCD_ISOINIncompleteCallback(hpcd, (uint8_t)epnum);
1267#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1268 }
1269
1270 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD);
1271 }
1272 if ((epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE)
1273 {
1274 (void)PCD_WriteEmptyTxFifo(hpcd, epnum);
1275 }
1276 }
1277 epnum++;
1278 ep_intr >>= 1U;
1279 }
1280 }
1281
1282 /* Handle Resume Interrupt */
1283 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT))
1284 {
1285 /* Clear the Remote Wake-up Signaling */
1286 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
1287
1288 if (hpcd->LPM_State == LPM_L1)
1289 {
1290 hpcd->LPM_State = LPM_L0;
1291
1292#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1293 hpcd->LPMCallback(hpcd, PCD_LPM_L0_ACTIVE);
1294#else
1296#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1297 }
1298 else
1299 {
1300#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1301 hpcd->ResumeCallback(hpcd);
1302#else
1304#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1305 }
1306
1307 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT);
1308 }
1309
1310 /* Handle Suspend Interrupt */
1311 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP))
1312 {
1313 if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)
1314 {
1315#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1316 hpcd->SuspendCallback(hpcd);
1317#else
1319#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1320 }
1321 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP);
1322 }
1323#if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) \
1324 || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) \
1325 || defined(STM32F423xx)
1326 /* Handle LPM Interrupt */
1327 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT))
1328 {
1329 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT);
1330
1331 if (hpcd->LPM_State == LPM_L0)
1332 {
1333 hpcd->LPM_State = LPM_L1;
1334 hpcd->BESL = (hpcd->Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >> 2U;
1335
1336#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1337 hpcd->LPMCallback(hpcd, PCD_LPM_L1_ACTIVE);
1338#else
1340#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1341 }
1342 else
1343 {
1344#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1345 hpcd->SuspendCallback(hpcd);
1346#else
1348#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1349 }
1350 }
1351#endif /* defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||
1352 defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||
1353 defined(STM32F423xx) */
1354 /* Handle Reset Interrupt */
1355 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST))
1356 {
1357 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
1358 (void)USB_FlushTxFifo(hpcd->Instance, 0x10U);
1359
1360 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
1361 {
1362 USBx_INEP(i)->DIEPINT = 0xFB7FU;
1363 USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL;
1364 USBx_OUTEP(i)->DOEPINT = 0xFB7FU;
1365 USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL;
1366 USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK;
1367 }
1368 USBx_DEVICE->DAINTMSK |= 0x10001U;
1369
1370 if (hpcd->Init.use_dedicated_ep1 != 0U)
1371 {
1372 USBx_DEVICE->DOUTEP1MSK |= USB_OTG_DOEPMSK_STUPM |
1373 USB_OTG_DOEPMSK_XFRCM |
1374 USB_OTG_DOEPMSK_EPDM;
1375
1376 USBx_DEVICE->DINEP1MSK |= USB_OTG_DIEPMSK_TOM |
1377 USB_OTG_DIEPMSK_XFRCM |
1378 USB_OTG_DIEPMSK_EPDM;
1379 }
1380 else
1381 {
1382 USBx_DEVICE->DOEPMSK |= USB_OTG_DOEPMSK_STUPM |
1383 USB_OTG_DOEPMSK_XFRCM |
1384 USB_OTG_DOEPMSK_EPDM |
1387
1388 USBx_DEVICE->DIEPMSK |= USB_OTG_DIEPMSK_TOM |
1389 USB_OTG_DIEPMSK_XFRCM |
1390 USB_OTG_DIEPMSK_EPDM;
1391 }
1392
1393 /* Set Default Address to 0 */
1394 USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD;
1395
1396 /* setup EP0 to receive SETUP packets */
1397 (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable,
1398 (uint8_t *)hpcd->Setup);
1399
1400 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST);
1401 }
1402
1403 /* Handle Enumeration done Interrupt */
1404 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE))
1405 {
1406 (void)USB_ActivateSetup(hpcd->Instance);
1407 hpcd->Init.speed = USB_GetDevSpeed(hpcd->Instance);
1408
1409 /* Set USB Turnaround time */
1410 (void)USB_SetTurnaroundTime(hpcd->Instance,
1412 (uint8_t)hpcd->Init.speed);
1413
1414#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1415 hpcd->ResetCallback(hpcd);
1416#else
1418#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1419
1420 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE);
1421 }
1422
1423 /* Handle SOF Interrupt */
1424 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF))
1425 {
1426#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1427 hpcd->SOFCallback(hpcd);
1428#else
1429 HAL_PCD_SOFCallback(hpcd);
1430#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1431
1432 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF);
1433 }
1434
1435 /* Handle Global OUT NAK effective Interrupt */
1436 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_BOUTNAKEFF))
1437 {
1438 USBx->GINTMSK &= ~USB_OTG_GINTMSK_GONAKEFFM;
1439
1440 for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++)
1441 {
1442 if (hpcd->OUT_ep[epnum].is_iso_incomplete == 1U)
1443 {
1444 /* Abort current transaction and disable the EP */
1445 (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)epnum);
1446 }
1447 }
1448 }
1449
1450 /* Handle Incomplete ISO IN Interrupt */
1451 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR))
1452 {
1453 for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++)
1454 {
1455 RegVal = USBx_INEP(epnum)->DIEPCTL;
1456
1457 if ((hpcd->IN_ep[epnum].type == EP_TYPE_ISOC) &&
1458 ((RegVal & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA))
1459 {
1460 hpcd->IN_ep[epnum].is_iso_incomplete = 1U;
1461
1462 /* Abort current transaction and disable the EP */
1463 (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)(epnum | 0x80U));
1464 }
1465 }
1466
1467 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR);
1468 }
1469
1470 /* Handle Incomplete ISO OUT Interrupt */
1471 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
1472 {
1473 for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++)
1474 {
1475 RegVal = USBx_OUTEP(epnum)->DOEPCTL;
1476
1477 if ((hpcd->OUT_ep[epnum].type == EP_TYPE_ISOC) &&
1478 ((RegVal & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) &&
1479 ((RegVal & (0x1U << 16)) == (hpcd->FrameNumber & 0x1U)))
1480 {
1481 hpcd->OUT_ep[epnum].is_iso_incomplete = 1U;
1482
1483 USBx->GINTMSK |= USB_OTG_GINTMSK_GONAKEFFM;
1484
1485 if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == 0U)
1486 {
1487 USBx_DEVICE->DCTL |= USB_OTG_DCTL_SGONAK;
1488 break;
1489 }
1490 }
1491 }
1492
1493 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
1494 }
1495
1496 /* Handle Connection event Interrupt */
1497 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT))
1498 {
1499#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1500 hpcd->ConnectCallback(hpcd);
1501#else
1503#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1504
1505 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT);
1506 }
1507
1508 /* Handle Disconnection event Interrupt */
1509 if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT))
1510 {
1511 RegVal = hpcd->Instance->GOTGINT;
1512
1513 if ((RegVal & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET)
1514 {
1515#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
1516 hpcd->DisconnectCallback(hpcd);
1517#else
1519#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
1520 }
1521 hpcd->Instance->GOTGINT |= RegVal;
1522 }
1523 }
1524}
1525
1526
1533{
1534#if defined (USB_OTG_FS)
1535 USB_OTG_GlobalTypeDef *USBx;
1536 USBx = hpcd->Instance;
1537
1538 if (USBx == USB_OTG_FS)
1539 {
1540 /* Clear EXTI pending Bit */
1542 }
1543 else
1544#endif /* defined (USB_OTG_FS) */
1545 {
1546 /* Clear EXTI pending Bit */
1548 }
1549}
1550#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */
1551
1552
1559__weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
1560{
1561 /* Prevent unused argument(s) compilation warning */
1562 UNUSED(hpcd);
1563 UNUSED(epnum);
1564
1565 /* NOTE : This function should not be modified, when the callback is needed,
1566 the HAL_PCD_DataOutStageCallback could be implemented in the user file
1567 */
1568}
1569
1576__weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
1577{
1578 /* Prevent unused argument(s) compilation warning */
1579 UNUSED(hpcd);
1580 UNUSED(epnum);
1581
1582 /* NOTE : This function should not be modified, when the callback is needed,
1583 the HAL_PCD_DataInStageCallback could be implemented in the user file
1584 */
1585}
1592{
1593 /* Prevent unused argument(s) compilation warning */
1594 UNUSED(hpcd);
1595
1596 /* NOTE : This function should not be modified, when the callback is needed,
1597 the HAL_PCD_SetupStageCallback could be implemented in the user file
1598 */
1599}
1600
1607{
1608 /* Prevent unused argument(s) compilation warning */
1609 UNUSED(hpcd);
1610
1611 /* NOTE : This function should not be modified, when the callback is needed,
1612 the HAL_PCD_SOFCallback could be implemented in the user file
1613 */
1614}
1615
1622{
1623 /* Prevent unused argument(s) compilation warning */
1624 UNUSED(hpcd);
1625
1626 /* NOTE : This function should not be modified, when the callback is needed,
1627 the HAL_PCD_ResetCallback could be implemented in the user file
1628 */
1629}
1630
1637{
1638 /* Prevent unused argument(s) compilation warning */
1639 UNUSED(hpcd);
1640
1641 /* NOTE : This function should not be modified, when the callback is needed,
1642 the HAL_PCD_SuspendCallback could be implemented in the user file
1643 */
1644}
1645
1652{
1653 /* Prevent unused argument(s) compilation warning */
1654 UNUSED(hpcd);
1655
1656 /* NOTE : This function should not be modified, when the callback is needed,
1657 the HAL_PCD_ResumeCallback could be implemented in the user file
1658 */
1659}
1660
1668{
1669 /* Prevent unused argument(s) compilation warning */
1670 UNUSED(hpcd);
1671 UNUSED(epnum);
1672
1673 /* NOTE : This function should not be modified, when the callback is needed,
1674 the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file
1675 */
1676}
1677
1685{
1686 /* Prevent unused argument(s) compilation warning */
1687 UNUSED(hpcd);
1688 UNUSED(epnum);
1689
1690 /* NOTE : This function should not be modified, when the callback is needed,
1691 the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file
1692 */
1693}
1694
1701{
1702 /* Prevent unused argument(s) compilation warning */
1703 UNUSED(hpcd);
1704
1705 /* NOTE : This function should not be modified, when the callback is needed,
1706 the HAL_PCD_ConnectCallback could be implemented in the user file
1707 */
1708}
1709
1716{
1717 /* Prevent unused argument(s) compilation warning */
1718 UNUSED(hpcd);
1719
1720 /* NOTE : This function should not be modified, when the callback is needed,
1721 the HAL_PCD_DisconnectCallback could be implemented in the user file
1722 */
1723}
1724
1750{
1751 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1752
1753 __HAL_LOCK(hpcd);
1754
1755 if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) &&
1756 (hpcd->Init.battery_charging_enable == 1U))
1757 {
1758 /* Enable USB Transceiver */
1759 USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN;
1760 }
1761 (void)USB_DevConnect(hpcd->Instance);
1762 __HAL_UNLOCK(hpcd);
1763
1764 return HAL_OK;
1765}
1766
1773{
1774 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
1775
1776 __HAL_LOCK(hpcd);
1777 (void)USB_DevDisconnect(hpcd->Instance);
1778
1779 if (((USBx->GUSBCFG & USB_OTG_GUSBCFG_PHYSEL) != 0U) &&
1780 (hpcd->Init.battery_charging_enable == 1U))
1781 {
1782 /* Disable USB Transceiver */
1783 USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);
1784 }
1785
1786 __HAL_UNLOCK(hpcd);
1787
1788 return HAL_OK;
1789}
1790
1798{
1799 __HAL_LOCK(hpcd);
1800 hpcd->USB_Address = address;
1801 (void)USB_SetDevAddress(hpcd->Instance, address);
1802 __HAL_UNLOCK(hpcd);
1803
1804 return HAL_OK;
1805}
1815 uint16_t ep_mps, uint8_t ep_type)
1816{
1818 PCD_EPTypeDef *ep;
1819
1820 if ((ep_addr & 0x80U) == 0x80U)
1821 {
1822 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1823 ep->is_in = 1U;
1824 }
1825 else
1826 {
1827 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1828 ep->is_in = 0U;
1829 }
1830
1831 ep->num = ep_addr & EP_ADDR_MSK;
1832 ep->maxpacket = (uint32_t)ep_mps & 0x7FFU;
1833 ep->type = ep_type;
1834
1835 if (ep->is_in != 0U)
1836 {
1837 /* Assign a Tx FIFO */
1838 ep->tx_fifo_num = ep->num;
1839 }
1840
1841 /* Set initial data PID. */
1842 if (ep_type == EP_TYPE_BULK)
1843 {
1844 ep->data_pid_start = 0U;
1845 }
1846
1847 __HAL_LOCK(hpcd);
1848 (void)USB_ActivateEndpoint(hpcd->Instance, ep);
1849 __HAL_UNLOCK(hpcd);
1850
1851 return ret;
1852}
1853
1861{
1862 PCD_EPTypeDef *ep;
1863
1864 if ((ep_addr & 0x80U) == 0x80U)
1865 {
1866 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1867 ep->is_in = 1U;
1868 }
1869 else
1870 {
1871 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1872 ep->is_in = 0U;
1873 }
1874 ep->num = ep_addr & EP_ADDR_MSK;
1875
1876 __HAL_LOCK(hpcd);
1877 (void)USB_DeactivateEndpoint(hpcd->Instance, ep);
1878 __HAL_UNLOCK(hpcd);
1879 return HAL_OK;
1880}
1881
1882
1891HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
1892{
1893 PCD_EPTypeDef *ep;
1894
1895 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
1896
1897 /*setup and start the Xfer */
1898 ep->xfer_buff = pBuf;
1899 ep->xfer_len = len;
1900 ep->xfer_count = 0U;
1901 ep->is_in = 0U;
1902 ep->num = ep_addr & EP_ADDR_MSK;
1903
1904 if (hpcd->Init.dma_enable == 1U)
1905 {
1906 ep->dma_addr = (uint32_t)pBuf;
1907 }
1908
1909 (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable);
1910
1911 return HAL_OK;
1912}
1913
1920uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef const *hpcd, uint8_t ep_addr)
1921{
1922 return hpcd->OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count;
1923}
1932HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
1933{
1934 PCD_EPTypeDef *ep;
1935
1936 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1937
1938 /*setup and start the Xfer */
1939 ep->xfer_buff = pBuf;
1940 ep->xfer_len = len;
1941 ep->xfer_count = 0U;
1942 ep->is_in = 1U;
1943 ep->num = ep_addr & EP_ADDR_MSK;
1944
1945 if (hpcd->Init.dma_enable == 1U)
1946 {
1947 ep->dma_addr = (uint32_t)pBuf;
1948 }
1949
1950 (void)USB_EPStartXfer(hpcd->Instance, ep, (uint8_t)hpcd->Init.dma_enable);
1951
1952 return HAL_OK;
1953}
1954
1962{
1963 PCD_EPTypeDef *ep;
1964
1965 if (((uint32_t)ep_addr & EP_ADDR_MSK) > hpcd->Init.dev_endpoints)
1966 {
1967 return HAL_ERROR;
1968 }
1969
1970 if ((0x80U & ep_addr) == 0x80U)
1971 {
1972 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
1973 ep->is_in = 1U;
1974 }
1975 else
1976 {
1977 ep = &hpcd->OUT_ep[ep_addr];
1978 ep->is_in = 0U;
1979 }
1980
1981 ep->is_stall = 1U;
1982 ep->num = ep_addr & EP_ADDR_MSK;
1983
1984 __HAL_LOCK(hpcd);
1985
1986 (void)USB_EPSetStall(hpcd->Instance, ep);
1987
1988 if ((ep_addr & EP_ADDR_MSK) == 0U)
1989 {
1990 (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t)hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup);
1991 }
1992
1993 __HAL_UNLOCK(hpcd);
1994
1995 return HAL_OK;
1996}
1997
2005{
2006 PCD_EPTypeDef *ep;
2007
2008 if (((uint32_t)ep_addr & 0x0FU) > hpcd->Init.dev_endpoints)
2009 {
2010 return HAL_ERROR;
2011 }
2012
2013 if ((0x80U & ep_addr) == 0x80U)
2014 {
2015 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
2016 ep->is_in = 1U;
2017 }
2018 else
2019 {
2020 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
2021 ep->is_in = 0U;
2022 }
2023
2024 ep->is_stall = 0U;
2025 ep->num = ep_addr & EP_ADDR_MSK;
2026
2027 __HAL_LOCK(hpcd);
2028 (void)USB_EPClearStall(hpcd->Instance, ep);
2029 __HAL_UNLOCK(hpcd);
2030
2031 return HAL_OK;
2032}
2033
2041{
2043 PCD_EPTypeDef *ep;
2044
2045 if ((0x80U & ep_addr) == 0x80U)
2046 {
2047 ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
2048 }
2049 else
2050 {
2051 ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
2052 }
2053
2054 /* Stop Xfer */
2055 ret = USB_EPStopXfer(hpcd->Instance, ep);
2056
2057 return ret;
2058}
2059
2067{
2068 __HAL_LOCK(hpcd);
2069
2070 if ((ep_addr & 0x80U) == 0x80U)
2071 {
2072 (void)USB_FlushTxFifo(hpcd->Instance, (uint32_t)ep_addr & EP_ADDR_MSK);
2073 }
2074 else
2075 {
2076 (void)USB_FlushRxFifo(hpcd->Instance);
2077 }
2078
2079 __HAL_UNLOCK(hpcd);
2080
2081 return HAL_OK;
2082}
2083
2090{
2091 return (USB_ActivateRemoteWakeup(hpcd->Instance));
2092}
2093
2100{
2101 return (USB_DeActivateRemoteWakeup(hpcd->Instance));
2102}
2103
2129{
2130 return hpcd->State;
2131}
2132
2133#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
2141{
2142 const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
2143 uint32_t USBx_BASE = (uint32_t)USBx;
2144
2145 switch (testmode)
2146 {
2147 case TEST_J:
2148 case TEST_K:
2149 case TEST_SE0_NAK:
2150 case TEST_PACKET:
2151 case TEST_FORCE_EN:
2152 USBx_DEVICE->DCTL |= (uint32_t)testmode << 4;
2153 break;
2154
2155 default:
2156 break;
2157 }
2158
2159 return HAL_OK;
2160}
2161#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */
2170/* Private functions ---------------------------------------------------------*/
2174#if defined (USB_OTG_FS) || defined (USB_OTG_HS)
2182{
2183 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
2184 uint32_t USBx_BASE = (uint32_t)USBx;
2185 USB_OTG_EPTypeDef *ep;
2186 uint32_t len;
2187 uint32_t len32b;
2188 uint32_t fifoemptymsk;
2189
2190 ep = &hpcd->IN_ep[epnum];
2191
2192 if (ep->xfer_count > ep->xfer_len)
2193 {
2194 return HAL_ERROR;
2195 }
2196
2197 len = ep->xfer_len - ep->xfer_count;
2198
2199 if (len > ep->maxpacket)
2200 {
2201 len = ep->maxpacket;
2202 }
2203
2204 len32b = (len + 3U) / 4U;
2205
2206 while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b) &&
2207 (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0U))
2208 {
2209 /* Write the FIFO */
2210 len = ep->xfer_len - ep->xfer_count;
2211
2212 if (len > ep->maxpacket)
2213 {
2214 len = ep->maxpacket;
2215 }
2216 len32b = (len + 3U) / 4U;
2217
2218 (void)USB_WritePacket(USBx, ep->xfer_buff, (uint8_t)epnum, (uint16_t)len,
2219 (uint8_t)hpcd->Init.dma_enable);
2220
2221 ep->xfer_buff += len;
2222 ep->xfer_count += len;
2223 }
2224
2225 if (ep->xfer_len <= ep->xfer_count)
2226 {
2227 fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));
2228 USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
2229 }
2230
2231 return HAL_OK;
2232}
2233
2234
2242{
2243 USB_OTG_EPTypeDef *ep;
2244 const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
2245 uint32_t USBx_BASE = (uint32_t)USBx;
2246 uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U);
2247 uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;
2248
2249 if (hpcd->Init.dma_enable == 1U)
2250 {
2251 if ((DoepintReg & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) /* Class C */
2252 {
2253 /* StupPktRcvd = 1 this is a setup packet */
2254 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2256 {
2257 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);
2258 }
2259 }
2260 else if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) /* Class E */
2261 {
2262 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);
2263 }
2264 else if ((DoepintReg & (USB_OTG_DOEPINT_STUP | USB_OTG_DOEPINT_OTEPSPR)) == 0U)
2265 {
2266 /* StupPktRcvd = 1 this is a setup packet */
2267 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2269 {
2270 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);
2271 }
2272 else
2273 {
2274 ep = &hpcd->OUT_ep[epnum];
2275
2276 /* out data packet received over EP */
2277 ep->xfer_count = ep->xfer_size - (USBx_OUTEP(epnum)->DOEPTSIZ & USB_OTG_DOEPTSIZ_XFRSIZ);
2278
2279 if (epnum == 0U)
2280 {
2281 if (ep->xfer_len == 0U)
2282 {
2283 /* this is ZLP, so prepare EP0 for next setup */
2284 (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
2285 }
2286 else
2287 {
2288 ep->xfer_buff += ep->xfer_count;
2289 }
2290 }
2291
2292#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2293 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2294#else
2295 HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum);
2296#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
2297 }
2298 }
2299 else
2300 {
2301 /* ... */
2302 }
2303 }
2304 else
2305 {
2306 if (gSNPSiD == USB_OTG_CORE_ID_310A)
2307 {
2308 /* StupPktRcvd = 1 this is a setup packet */
2310 {
2311 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);
2312 }
2313 else
2314 {
2316 {
2317 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);
2318 }
2319
2320#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2321 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2322#else
2323 HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum);
2324#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
2325 }
2326 }
2327 else
2328 {
2329 if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U))
2330 {
2331 /* this is ZLP, so prepare EP0 for next setup */
2332 (void)USB_EP0_OutStart(hpcd->Instance, 0U, (uint8_t *)hpcd->Setup);
2333 }
2334
2335#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2336 hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);
2337#else
2338 HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum);
2339#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
2340 }
2341 }
2342
2343 return HAL_OK;
2344}
2345
2346
2354{
2355 const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
2356 uint32_t USBx_BASE = (uint32_t)USBx;
2357 uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U);
2358 uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;
2359
2360 if ((gSNPSiD > USB_OTG_CORE_ID_300A) &&
2362 {
2363 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);
2364 }
2365
2366 /* Inform the upper layer that a setup packet is available */
2367#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
2368 hpcd->SetupStageCallback(hpcd);
2369#else
2371#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
2372
2373 if ((gSNPSiD > USB_OTG_CORE_ID_300A) && (hpcd->Init.dma_enable == 1U))
2374 {
2375 (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
2376 }
2377
2378 return HAL_OK;
2379}
2380#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */
2381
2385#endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */
2386#endif /* HAL_PCD_MODULE_ENABLED */
void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
Send LPM message to user layer callback.
void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg)
Send BatteryCharging message to user layer callback.
HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd)
Activate LPM feature.
void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
Initializes the PCD MSP.
void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
DeInitializes PCD MSP.
HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)
Initializes the PCD according to the specified parameters in the PCD_InitTypeDef and initialize the a...
HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd)
DeInitializes the PCD peripheral.
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
USB Start Of Frame callback.
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
Setup stage callback.
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Incomplete ISO OUT callback.
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
Suspend event callback.
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
Handles PCD interrupt request.
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Data IN stage callback.
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Incomplete ISO IN callback.
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
Disconnection event callback.
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
Connection event callback.
void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd)
Handles PCD Wakeup interrupt request.
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Data OUT stage callback.
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
USB Reset callback.
HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd)
Stop the USB device.
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
Resume event callback.
HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)
Start the USB device.
HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
Receive an amount of data.
HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
Send an amount of data.
HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Deactivate an endpoint.
HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Clear a STALL condition over in an endpoint.
HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address)
Set the USB Device address.
uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef const *hpcd, uint8_t ep_addr)
Get Received Data Size.
HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd)
Connect the USB device.
HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd)
Disconnect the USB device.
HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type)
Open and configure an endpoint.
HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
De-activate remote wakeup signalling.
HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
Activate remote wakeup signalling.
HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Set a STALL condition over an endpoint.
HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Flush an endpoint.
HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Abort an USB EP transaction.
PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef const *hpcd)
Return the PCD handle state.
HAL_StatusTypeDef HAL_PCD_SetTestMode(const PCD_HandleTypeDef *hpcd, uint8_t testmode)
Set the USB Device high speed test mode.
#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__)
#define __HAL_PCD_DISABLE(__HANDLE__)
#define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG()
#define __HAL_PCD_ENABLE(__HANDLE__)
#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__)
#define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG()
#define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__)
PCD_StateTypeDef
PCD State structure definition.
USB_OTG_EPTypeDef PCD_EPTypeDef
@ HAL_PCD_STATE_ERROR
@ HAL_PCD_STATE_BUSY
@ HAL_PCD_STATE_READY
@ HAL_PCD_STATE_RESET
@ PCD_LPM_L0_ACTIVE
@ PCD_LPM_L1_ACTIVE
@ LPM_L1
@ LPM_L0
static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
process EP OUT setup packet received interrupt.
static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)
process EP OUT transfer complete interrupt.
static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
Check FIFO for the next packet to be loaded.
#define USB_OTG_DOEPINT_NAK
#define USB_OTG_DOEPMSK_OTEPSPRM
#define USB_OTG_DOEPINT_OTEPSPR
#define USB_OTG_DOEPMSK_NAKM
#define USB_OTG_DOEPINT_STPKTRX
uint32_t HAL_RCC_GetHCLKFreq(void)
Returns the HCLK frequency.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition
@ HAL_ERROR
@ HAL_OK
#define UNUSED(X)
#define __HAL_UNLOCK(__HANDLE__)
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)
PCD Handle Structure definition.
__IO uint32_t ErrorCode
PCD_EPTypeDef OUT_ep[16]
PCD_LPM_StateTypeDef LPM_State
HAL_LockTypeDef Lock
__IO PCD_StateTypeDef State
PCD_EPTypeDef IN_ep[16]
PCD_InitTypeDef Init
PCD_TypeDef * Instance