STM32L4xx_HAL_Driver  1.14.0
stm32l4xx_hal_hcd.c
Go to the documentation of this file.
1 
53 /* Includes ------------------------------------------------------------------*/
54 #include "stm32l4xx_hal.h"
55 
60 #ifdef HAL_HCD_MODULE_ENABLED
61 
62 #if defined (USB_OTG_FS)
63 
69 /* Private typedef -----------------------------------------------------------*/
70 /* Private define ------------------------------------------------------------*/
71 /* Private macro -------------------------------------------------------------*/
72 /* Private variables ---------------------------------------------------------*/
73 /* Private function prototypes -----------------------------------------------*/
77 static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
78 static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
79 static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd);
80 static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd);
85 /* Exported functions --------------------------------------------------------*/
108 HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd)
109 {
110  USB_OTG_GlobalTypeDef *USBx;
111 
112  /* Check the HCD handle allocation */
113  if (hhcd == NULL)
114  {
115  return HAL_ERROR;
116  }
117 
118  /* Check the parameters */
119  assert_param(IS_HCD_ALL_INSTANCE(hhcd->Instance));
120 
121  USBx = hhcd->Instance;
122 
123  if (hhcd->State == HAL_HCD_STATE_RESET)
124  {
125  /* Allocate lock resource and initialize it */
126  hhcd->Lock = HAL_UNLOCKED;
127 
128 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
129  hhcd->SOFCallback = HAL_HCD_SOF_Callback;
130  hhcd->ConnectCallback = HAL_HCD_Connect_Callback;
131  hhcd->DisconnectCallback = HAL_HCD_Disconnect_Callback;
132  hhcd->PortEnabledCallback = HAL_HCD_PortEnabled_Callback;
133  hhcd->PortDisabledCallback = HAL_HCD_PortDisabled_Callback;
134  hhcd->HC_NotifyURBChangeCallback = HAL_HCD_HC_NotifyURBChange_Callback;
135 
136  if (hhcd->MspInitCallback == NULL)
137  {
138  hhcd->MspInitCallback = HAL_HCD_MspInit;
139  }
140 
141  /* Init the low level hardware */
142  hhcd->MspInitCallback(hhcd);
143 #else
144  /* Init the low level hardware : GPIO, CLOCK, NVIC... */
145  HAL_HCD_MspInit(hhcd);
146 #endif /* (USE_HAL_HCD_REGISTER_CALLBACKS) */
147  }
148 
149  hhcd->State = HAL_HCD_STATE_BUSY;
150 
151  /* Disable DMA mode for FS instance */
152  if ((USBx->CID & (0x1U << 8)) == 0U)
153  {
154  hhcd->Init.dma_enable = 0U;
155  }
156 
157  /* Disable the Interrupts */
158  __HAL_HCD_DISABLE(hhcd);
159 
160  /* Init the Core (common init.) */
161  (void)USB_CoreInit(hhcd->Instance, hhcd->Init);
162 
163  /* Force Host Mode*/
164  (void)USB_SetCurrentMode(hhcd->Instance, USB_HOST_MODE);
165 
166  /* Init Host */
167  (void)USB_HostInit(hhcd->Instance, hhcd->Init);
168 
169  hhcd->State = HAL_HCD_STATE_READY;
170 
171  return HAL_OK;
172 }
173 
197 HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd,
198  uint8_t ch_num,
199  uint8_t epnum,
200  uint8_t dev_address,
201  uint8_t speed,
202  uint8_t ep_type,
203  uint16_t mps)
204 {
205  HAL_StatusTypeDef status;
206 
207  __HAL_LOCK(hhcd);
208  hhcd->hc[ch_num].do_ping = 0U;
209  hhcd->hc[ch_num].dev_addr = dev_address;
210  hhcd->hc[ch_num].max_packet = mps;
211  hhcd->hc[ch_num].ch_num = ch_num;
212  hhcd->hc[ch_num].ep_type = ep_type;
213  hhcd->hc[ch_num].ep_num = epnum & 0x7FU;
214 
215  if ((epnum & 0x80U) == 0x80U)
216  {
217  hhcd->hc[ch_num].ep_is_in = 1U;
218  }
219  else
220  {
221  hhcd->hc[ch_num].ep_is_in = 0U;
222  }
223 
224  hhcd->hc[ch_num].speed = speed;
225 
226  status = USB_HC_Init(hhcd->Instance,
227  ch_num,
228  epnum,
229  dev_address,
230  speed,
231  ep_type,
232  mps);
233  __HAL_UNLOCK(hhcd);
234 
235  return status;
236 }
237 
245 HAL_StatusTypeDef HAL_HCD_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num)
246 {
247  HAL_StatusTypeDef status = HAL_OK;
248 
249  __HAL_LOCK(hhcd);
250  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
251  __HAL_UNLOCK(hhcd);
252 
253  return status;
254 }
255 
261 HAL_StatusTypeDef HAL_HCD_DeInit(HCD_HandleTypeDef *hhcd)
262 {
263  /* Check the HCD handle allocation */
264  if (hhcd == NULL)
265  {
266  return HAL_ERROR;
267  }
268 
269  hhcd->State = HAL_HCD_STATE_BUSY;
270 
271 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
272  if (hhcd->MspDeInitCallback == NULL)
273  {
274  hhcd->MspDeInitCallback = HAL_HCD_MspDeInit; /* Legacy weak MspDeInit */
275  }
276 
277  /* DeInit the low level hardware */
278  hhcd->MspDeInitCallback(hhcd);
279 #else
280  /* DeInit the low level hardware: CLOCK, NVIC.*/
281  HAL_HCD_MspDeInit(hhcd);
282 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
283 
284  __HAL_HCD_DISABLE(hhcd);
285 
286  hhcd->State = HAL_HCD_STATE_RESET;
287 
288  return HAL_OK;
289 }
290 
297 {
298  /* Prevent unused argument(s) compilation warning */
299  UNUSED(hhcd);
300 
301  /* NOTE : This function should not be modified, when the callback is needed,
302  the HAL_HCD_MspInit could be implemented in the user file
303  */
304 }
305 
312 {
313  /* Prevent unused argument(s) compilation warning */
314  UNUSED(hhcd);
315 
316  /* NOTE : This function should not be modified, when the callback is needed,
317  the HAL_HCD_MspDeInit could be implemented in the user file
318  */
319 }
320 
364  uint8_t ch_num,
365  uint8_t direction,
366  uint8_t ep_type,
367  uint8_t token,
368  uint8_t *pbuff,
369  uint16_t length,
370  uint8_t do_ping)
371 {
372  UNUSED(do_ping);
373 
374  hhcd->hc[ch_num].ep_is_in = direction;
375  hhcd->hc[ch_num].ep_type = ep_type;
376 
377  if (token == 0U)
378  {
379  hhcd->hc[ch_num].data_pid = HC_PID_SETUP;
380  }
381  else
382  {
383  hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
384  }
385 
386  /* Manage Data Toggle */
387  switch (ep_type)
388  {
389  case EP_TYPE_CTRL:
390  if ((token == 1U) && (direction == 0U)) /*send data */
391  {
392  if (length == 0U)
393  {
394  /* For Status OUT stage, Length==0, Status Out PID = 1 */
395  hhcd->hc[ch_num].toggle_out = 1U;
396  }
397 
398  /* Set the Data Toggle bit as per the Flag */
399  if (hhcd->hc[ch_num].toggle_out == 0U)
400  {
401  /* Put the PID 0 */
402  hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
403  }
404  else
405  {
406  /* Put the PID 1 */
407  hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
408  }
409  }
410  break;
411 
412  case EP_TYPE_BULK:
413  if (direction == 0U)
414  {
415  /* Set the Data Toggle bit as per the Flag */
416  if (hhcd->hc[ch_num].toggle_out == 0U)
417  {
418  /* Put the PID 0 */
419  hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
420  }
421  else
422  {
423  /* Put the PID 1 */
424  hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
425  }
426  }
427  else
428  {
429  if (hhcd->hc[ch_num].toggle_in == 0U)
430  {
431  hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
432  }
433  else
434  {
435  hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
436  }
437  }
438 
439  break;
440  case EP_TYPE_INTR:
441  if (direction == 0U)
442  {
443  /* Set the Data Toggle bit as per the Flag */
444  if (hhcd->hc[ch_num].toggle_out == 0U)
445  {
446  /* Put the PID 0 */
447  hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
448  }
449  else
450  {
451  /* Put the PID 1 */
452  hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
453  }
454  }
455  else
456  {
457  if (hhcd->hc[ch_num].toggle_in == 0U)
458  {
459  hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
460  }
461  else
462  {
463  hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
464  }
465  }
466  break;
467 
468  case EP_TYPE_ISOC:
469  hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
470  break;
471 
472  default:
473  break;
474  }
475 
476  hhcd->hc[ch_num].xfer_buff = pbuff;
477  hhcd->hc[ch_num].xfer_len = length;
478  hhcd->hc[ch_num].urb_state = URB_IDLE;
479  hhcd->hc[ch_num].xfer_count = 0U;
480  hhcd->hc[ch_num].ch_num = ch_num;
481  hhcd->hc[ch_num].state = HC_IDLE;
482 
483  return USB_HC_StartXfer(hhcd->Instance, &hhcd->hc[ch_num]);
484 }
485 
492 {
493  USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
494  uint32_t USBx_BASE = (uint32_t)USBx;
495  uint32_t i, interrupt;
496 
497  /* Ensure that we are in device mode */
498  if (USB_GetMode(hhcd->Instance) == USB_OTG_MODE_HOST)
499  {
500  /* Avoid spurious interrupt */
501  if (__HAL_HCD_IS_INVALID_INTERRUPT(hhcd))
502  {
503  return;
504  }
505 
506  if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
507  {
508  /* Incorrect mode, acknowledge the interrupt */
509  __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
510  }
511 
512  if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR))
513  {
514  /* Incorrect mode, acknowledge the interrupt */
515  __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR);
516  }
517 
518  if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE))
519  {
520  /* Incorrect mode, acknowledge the interrupt */
521  __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE);
522  }
523 
524  if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_MMIS))
525  {
526  /* Incorrect mode, acknowledge the interrupt */
527  __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_MMIS);
528  }
529 
530  /* Handle Host Disconnect Interrupts */
531  if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT))
532  {
533 
534  /* Cleanup HPRT */
535  USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | \
536  USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);
537 
538  /* Handle Host Port Disconnect Interrupt */
539 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
540  hhcd->DisconnectCallback(hhcd);
541 #else
543 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
544 
545  (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_48_MHZ);
546  __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT);
547  }
548 
549  /* Handle Host Port Interrupts */
550  if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HPRTINT))
551  {
552  HCD_Port_IRQHandler(hhcd);
553  }
554 
555  /* Handle Host SOF Interrupt */
556  if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_SOF))
557  {
558 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
559  hhcd->SOFCallback(hhcd);
560 #else
561  HAL_HCD_SOF_Callback(hhcd);
562 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
563 
564  __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SOF);
565  }
566 
567  /* Handle Host channel Interrupt */
568  if (__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HCINT))
569  {
570  interrupt = USB_HC_ReadInterrupt(hhcd->Instance);
571  for (i = 0U; i < hhcd->Init.Host_channels; i++)
572  {
573  if ((interrupt & (1UL << (i & 0xFU))) != 0U)
574  {
575  if ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_EPDIR) == USB_OTG_HCCHAR_EPDIR)
576  {
577  HCD_HC_IN_IRQHandler(hhcd, (uint8_t)i);
578  }
579  else
580  {
581  HCD_HC_OUT_IRQHandler(hhcd, (uint8_t)i);
582  }
583  }
584  }
585  __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_HCINT);
586  }
587 
588  /* Handle Rx Queue Level Interrupts */
589  if ((__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_RXFLVL)) != 0U)
590  {
591  USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
592 
593  HCD_RXQLVL_IRQHandler(hhcd);
594 
595  USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
596  }
597  }
598 }
599 
606 {
607  /* Prevent unused argument(s) compilation warning */
608  UNUSED(hhcd);
609 
610  /* NOTE : This function should not be modified, when the callback is needed,
611  the HAL_HCD_SOF_Callback could be implemented in the user file
612  */
613 }
614 
621 {
622  /* Prevent unused argument(s) compilation warning */
623  UNUSED(hhcd);
624 
625  /* NOTE : This function should not be modified, when the callback is needed,
626  the HAL_HCD_Connect_Callback could be implemented in the user file
627  */
628 }
629 
636 {
637  /* Prevent unused argument(s) compilation warning */
638  UNUSED(hhcd);
639 
640  /* NOTE : This function should not be modified, when the callback is needed,
641  the HAL_HCD_Disconnect_Callback could be implemented in the user file
642  */
643 }
644 
651 {
652  /* Prevent unused argument(s) compilation warning */
653  UNUSED(hhcd);
654 
655  /* NOTE : This function should not be modified, when the callback is needed,
656  the HAL_HCD_Disconnect_Callback could be implemented in the user file
657  */
658 }
659 
666 {
667  /* Prevent unused argument(s) compilation warning */
668  UNUSED(hhcd);
669 
670  /* NOTE : This function should not be modified, when the callback is needed,
671  the HAL_HCD_Disconnect_Callback could be implemented in the user file
672  */
673 }
674 
691 {
692  /* Prevent unused argument(s) compilation warning */
693  UNUSED(hhcd);
694  UNUSED(chnum);
695  UNUSED(urb_state);
696 
697  /* NOTE : This function should not be modified, when the callback is needed,
698  the HAL_HCD_HC_NotifyURBChange_Callback could be implemented in the user file
699  */
700 }
701 
702 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
703 
720 {
721  HAL_StatusTypeDef status = HAL_OK;
722 
723  if (pCallback == NULL)
724  {
725  /* Update the error code */
726  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
727  return HAL_ERROR;
728  }
729  /* Process locked */
730  __HAL_LOCK(hhcd);
731 
732  if (hhcd->State == HAL_HCD_STATE_READY)
733  {
734  switch (CallbackID)
735  {
736  case HAL_HCD_SOF_CB_ID :
737  hhcd->SOFCallback = pCallback;
738  break;
739 
740  case HAL_HCD_CONNECT_CB_ID :
741  hhcd->ConnectCallback = pCallback;
742  break;
743 
745  hhcd->DisconnectCallback = pCallback;
746  break;
747 
749  hhcd->PortEnabledCallback = pCallback;
750  break;
751 
753  hhcd->PortDisabledCallback = pCallback;
754  break;
755 
756  case HAL_HCD_MSPINIT_CB_ID :
757  hhcd->MspInitCallback = pCallback;
758  break;
759 
761  hhcd->MspDeInitCallback = pCallback;
762  break;
763 
764  default :
765  /* Update the error code */
766  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
767  /* Return error status */
768  status = HAL_ERROR;
769  break;
770  }
771  }
772  else if (hhcd->State == HAL_HCD_STATE_RESET)
773  {
774  switch (CallbackID)
775  {
776  case HAL_HCD_MSPINIT_CB_ID :
777  hhcd->MspInitCallback = pCallback;
778  break;
779 
781  hhcd->MspDeInitCallback = pCallback;
782  break;
783 
784  default :
785  /* Update the error code */
786  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
787  /* Return error status */
788  status = HAL_ERROR;
789  break;
790  }
791  }
792  else
793  {
794  /* Update the error code */
795  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
796  /* Return error status */
797  status = HAL_ERROR;
798  }
799 
800  /* Release Lock */
801  __HAL_UNLOCK(hhcd);
802  return status;
803 }
804 
821 {
822  HAL_StatusTypeDef status = HAL_OK;
823 
824  /* Process locked */
825  __HAL_LOCK(hhcd);
826 
827  /* Setup Legacy weak Callbacks */
828  if (hhcd->State == HAL_HCD_STATE_READY)
829  {
830  switch (CallbackID)
831  {
832  case HAL_HCD_SOF_CB_ID :
833  hhcd->SOFCallback = HAL_HCD_SOF_Callback;
834  break;
835 
836  case HAL_HCD_CONNECT_CB_ID :
837  hhcd->ConnectCallback = HAL_HCD_Connect_Callback;
838  break;
839 
841  hhcd->DisconnectCallback = HAL_HCD_Disconnect_Callback;
842  break;
843 
845  hhcd->PortEnabledCallback = HAL_HCD_PortEnabled_Callback;
846  break;
847 
849  hhcd->PortDisabledCallback = HAL_HCD_PortDisabled_Callback;
850  break;
851 
852  case HAL_HCD_MSPINIT_CB_ID :
853  hhcd->MspInitCallback = HAL_HCD_MspInit;
854  break;
855 
857  hhcd->MspDeInitCallback = HAL_HCD_MspDeInit;
858  break;
859 
860  default :
861  /* Update the error code */
862  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
863 
864  /* Return error status */
865  status = HAL_ERROR;
866  break;
867  }
868  }
869  else if (hhcd->State == HAL_HCD_STATE_RESET)
870  {
871  switch (CallbackID)
872  {
873  case HAL_HCD_MSPINIT_CB_ID :
874  hhcd->MspInitCallback = HAL_HCD_MspInit;
875  break;
876 
878  hhcd->MspDeInitCallback = HAL_HCD_MspDeInit;
879  break;
880 
881  default :
882  /* Update the error code */
883  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
884 
885  /* Return error status */
886  status = HAL_ERROR;
887  break;
888  }
889  }
890  else
891  {
892  /* Update the error code */
893  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
894 
895  /* Return error status */
896  status = HAL_ERROR;
897  }
898 
899  /* Release Lock */
900  __HAL_UNLOCK(hhcd);
901  return status;
902 }
903 
912 {
913  HAL_StatusTypeDef status = HAL_OK;
914 
915  if (pCallback == NULL)
916  {
917  /* Update the error code */
918  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
919 
920  return HAL_ERROR;
921  }
922 
923  /* Process locked */
924  __HAL_LOCK(hhcd);
925 
926  if (hhcd->State == HAL_HCD_STATE_READY)
927  {
928  hhcd->HC_NotifyURBChangeCallback = pCallback;
929  }
930  else
931  {
932  /* Update the error code */
933  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
934 
935  /* Return error status */
936  status = HAL_ERROR;
937  }
938 
939  /* Release Lock */
940  __HAL_UNLOCK(hhcd);
941 
942  return status;
943 }
944 
952 {
953  HAL_StatusTypeDef status = HAL_OK;
954 
955  /* Process locked */
956  __HAL_LOCK(hhcd);
957 
958  if (hhcd->State == HAL_HCD_STATE_READY)
959  {
960  hhcd->HC_NotifyURBChangeCallback = HAL_HCD_HC_NotifyURBChange_Callback; /* Legacy weak DataOutStageCallback */
961  }
962  else
963  {
964  /* Update the error code */
965  hhcd->ErrorCode |= HAL_HCD_ERROR_INVALID_CALLBACK;
966 
967  /* Return error status */
968  status = HAL_ERROR;
969  }
970 
971  /* Release Lock */
972  __HAL_UNLOCK(hhcd);
973 
974  return status;
975 }
976 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
977 
1002 HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd)
1003 {
1004  __HAL_LOCK(hhcd);
1005  __HAL_HCD_ENABLE(hhcd);
1006  (void)USB_DriveVbus(hhcd->Instance, 1U);
1007  __HAL_UNLOCK(hhcd);
1008  return HAL_OK;
1009 }
1010 
1017 HAL_StatusTypeDef HAL_HCD_Stop(HCD_HandleTypeDef *hhcd)
1018 {
1019  __HAL_LOCK(hhcd);
1020  (void)USB_StopHost(hhcd->Instance);
1021  __HAL_UNLOCK(hhcd);
1022  return HAL_OK;
1023 }
1024 
1030 HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd)
1031 {
1032  return (USB_ResetPort(hhcd->Instance));
1033 }
1034 
1060 {
1061  return hhcd->State;
1062 }
1063 
1079 {
1080  return hhcd->hc[chnum].urb_state;
1081 }
1082 
1083 
1091 uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef *hhcd, uint8_t chnum)
1092 {
1093  return hhcd->hc[chnum].xfer_count;
1094 }
1095 
1114 {
1115  return hhcd->hc[chnum].state;
1116 }
1117 
1124 {
1125  return (USB_GetCurrentFrame(hhcd->Instance));
1126 }
1127 
1134 {
1135  return (USB_GetHostSpeed(hhcd->Instance));
1136 }
1137 
1156 static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
1157 {
1158  USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1159  uint32_t USBx_BASE = (uint32_t)USBx;
1160  uint32_t ch_num = (uint32_t)chnum;
1161 
1162  uint32_t tmpreg;
1163 
1164  if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_AHBERR) == USB_OTG_HCINT_AHBERR)
1165  {
1166  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_AHBERR);
1167  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1168  }
1169  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_ACK) == USB_OTG_HCINT_ACK)
1170  {
1171  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_ACK);
1172  }
1173  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_STALL) == USB_OTG_HCINT_STALL)
1174  {
1175  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1176  hhcd->hc[ch_num].state = HC_STALL;
1177  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1178  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_STALL);
1179  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1180  }
1181  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_DTERR) == USB_OTG_HCINT_DTERR)
1182  {
1183  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1184  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1185  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1186  hhcd->hc[ch_num].state = HC_DATATGLERR;
1187  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_DTERR);
1188  }
1189  else
1190  {
1191  /* ... */
1192  }
1193 
1194  if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_FRMOR) == USB_OTG_HCINT_FRMOR)
1195  {
1196  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1197  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1198  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_FRMOR);
1199  }
1200  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_XFRC) == USB_OTG_HCINT_XFRC)
1201  {
1202  hhcd->hc[ch_num].state = HC_XFRC;
1203  hhcd->hc[ch_num].ErrCnt = 0U;
1204  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_XFRC);
1205 
1206  if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL) ||
1207  (hhcd->hc[ch_num].ep_type == EP_TYPE_BULK))
1208  {
1209  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1210  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1211  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1212  }
1213  else if (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR)
1214  {
1215  USBx_HC(ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM;
1216  hhcd->hc[ch_num].urb_state = URB_DONE;
1217 
1218 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1219  hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
1220 #else
1221  HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
1222 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
1223  }
1224  else
1225  {
1226  /* ... */
1227  }
1228  hhcd->hc[ch_num].toggle_in ^= 1U;
1229 
1230  }
1231  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH)
1232  {
1233  __HAL_HCD_MASK_HALT_HC_INT(ch_num);
1234 
1235  if (hhcd->hc[ch_num].state == HC_XFRC)
1236  {
1237  hhcd->hc[ch_num].urb_state = URB_DONE;
1238  }
1239  else if (hhcd->hc[ch_num].state == HC_STALL)
1240  {
1241  hhcd->hc[ch_num].urb_state = URB_STALL;
1242  }
1243  else if ((hhcd->hc[ch_num].state == HC_XACTERR) ||
1244  (hhcd->hc[ch_num].state == HC_DATATGLERR))
1245  {
1246  hhcd->hc[ch_num].ErrCnt++;
1247  if (hhcd->hc[ch_num].ErrCnt > 3U)
1248  {
1249  hhcd->hc[ch_num].ErrCnt = 0U;
1250  hhcd->hc[ch_num].urb_state = URB_ERROR;
1251  }
1252  else
1253  {
1254  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1255  }
1256 
1257  /* re-activate the channel */
1258  tmpreg = USBx_HC(ch_num)->HCCHAR;
1259  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1260  tmpreg |= USB_OTG_HCCHAR_CHENA;
1261  USBx_HC(ch_num)->HCCHAR = tmpreg;
1262  }
1263  else if (hhcd->hc[ch_num].state == HC_NAK)
1264  {
1265  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1266  /* re-activate the channel */
1267  tmpreg = USBx_HC(ch_num)->HCCHAR;
1268  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1269  tmpreg |= USB_OTG_HCCHAR_CHENA;
1270  USBx_HC(ch_num)->HCCHAR = tmpreg;
1271  }
1272  else
1273  {
1274  /* ... */
1275  }
1276  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH);
1277  HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
1278  }
1279  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_TXERR) == USB_OTG_HCINT_TXERR)
1280  {
1281  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1282  hhcd->hc[ch_num].ErrCnt++;
1283  hhcd->hc[ch_num].state = HC_XACTERR;
1284  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1285  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_TXERR);
1286  }
1287  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NAK) == USB_OTG_HCINT_NAK)
1288  {
1289  if (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR)
1290  {
1291  hhcd->hc[ch_num].ErrCnt = 0U;
1292  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1293  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1294  }
1295  else if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL) ||
1296  (hhcd->hc[ch_num].ep_type == EP_TYPE_BULK))
1297  {
1298  hhcd->hc[ch_num].ErrCnt = 0U;
1299  hhcd->hc[ch_num].state = HC_NAK;
1300  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1301  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1302  }
1303  else
1304  {
1305  /* ... */
1306  }
1307  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1308  }
1309  else
1310  {
1311  /* ... */
1312  }
1313 }
1314 
1322 static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
1323 {
1324  USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1325  uint32_t USBx_BASE = (uint32_t)USBx;
1326  uint32_t ch_num = (uint32_t)chnum;
1327  uint32_t tmpreg;
1328 
1329  if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_AHBERR) == USB_OTG_HCINT_AHBERR)
1330  {
1331  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_AHBERR);
1332  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1333  }
1334  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_ACK) == USB_OTG_HCINT_ACK)
1335  {
1336  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_ACK);
1337 
1338  if (hhcd->hc[ch_num].do_ping == 1U)
1339  {
1340  hhcd->hc[ch_num].do_ping = 0U;
1341  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1342  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1343  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1344  }
1345  }
1346  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NYET) == USB_OTG_HCINT_NYET)
1347  {
1348  hhcd->hc[ch_num].state = HC_NYET;
1349  hhcd->hc[ch_num].do_ping = 1U;
1350  hhcd->hc[ch_num].ErrCnt = 0U;
1351  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1352  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1353  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NYET);
1354  }
1355  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_FRMOR) == USB_OTG_HCINT_FRMOR)
1356  {
1357  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1358  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1359  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_FRMOR);
1360  }
1361  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_XFRC) == USB_OTG_HCINT_XFRC)
1362  {
1363  hhcd->hc[ch_num].ErrCnt = 0U;
1364  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1365  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1366  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_XFRC);
1367  hhcd->hc[ch_num].state = HC_XFRC;
1368  }
1369  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_STALL) == USB_OTG_HCINT_STALL)
1370  {
1371  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_STALL);
1372  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1373  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1374  hhcd->hc[ch_num].state = HC_STALL;
1375  }
1376  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_NAK) == USB_OTG_HCINT_NAK)
1377  {
1378  hhcd->hc[ch_num].ErrCnt = 0U;
1379  hhcd->hc[ch_num].state = HC_NAK;
1380 
1381  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1382  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1383  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1384  }
1385  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_TXERR) == USB_OTG_HCINT_TXERR)
1386  {
1387  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1388  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1389  hhcd->hc[ch_num].state = HC_XACTERR;
1390  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_TXERR);
1391  }
1392  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_DTERR) == USB_OTG_HCINT_DTERR)
1393  {
1394  __HAL_HCD_UNMASK_HALT_HC_INT(ch_num);
1395  (void)USB_HC_Halt(hhcd->Instance, (uint8_t)ch_num);
1396  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_NAK);
1397  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_DTERR);
1398  hhcd->hc[ch_num].state = HC_DATATGLERR;
1399  }
1400  else if ((USBx_HC(ch_num)->HCINT & USB_OTG_HCINT_CHH) == USB_OTG_HCINT_CHH)
1401  {
1402  __HAL_HCD_MASK_HALT_HC_INT(ch_num);
1403 
1404  if (hhcd->hc[ch_num].state == HC_XFRC)
1405  {
1406  hhcd->hc[ch_num].urb_state = URB_DONE;
1407  if ((hhcd->hc[ch_num].ep_type == EP_TYPE_BULK) ||
1408  (hhcd->hc[ch_num].ep_type == EP_TYPE_INTR))
1409  {
1410  hhcd->hc[ch_num].toggle_out ^= 1U;
1411  }
1412  }
1413  else if (hhcd->hc[ch_num].state == HC_NAK)
1414  {
1415  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1416  }
1417  else if (hhcd->hc[ch_num].state == HC_NYET)
1418  {
1419  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1420  }
1421  else if (hhcd->hc[ch_num].state == HC_STALL)
1422  {
1423  hhcd->hc[ch_num].urb_state = URB_STALL;
1424  }
1425  else if ((hhcd->hc[ch_num].state == HC_XACTERR) ||
1426  (hhcd->hc[ch_num].state == HC_DATATGLERR))
1427  {
1428  hhcd->hc[ch_num].ErrCnt++;
1429  if (hhcd->hc[ch_num].ErrCnt > 3U)
1430  {
1431  hhcd->hc[ch_num].ErrCnt = 0U;
1432  hhcd->hc[ch_num].urb_state = URB_ERROR;
1433  }
1434  else
1435  {
1436  hhcd->hc[ch_num].urb_state = URB_NOTREADY;
1437  }
1438 
1439  /* re-activate the channel */
1440  tmpreg = USBx_HC(ch_num)->HCCHAR;
1441  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1442  tmpreg |= USB_OTG_HCCHAR_CHENA;
1443  USBx_HC(ch_num)->HCCHAR = tmpreg;
1444  }
1445  else
1446  {
1447  /* ... */
1448  }
1449 
1450  __HAL_HCD_CLEAR_HC_INT(ch_num, USB_OTG_HCINT_CHH);
1451  HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num].urb_state);
1452  }
1453  else
1454  {
1455  /* ... */
1456  }
1457 }
1458 
1465 {
1466  USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1467  uint32_t USBx_BASE = (uint32_t)USBx;
1468  uint32_t pktsts;
1469  uint32_t pktcnt;
1470  uint32_t temp;
1471  uint32_t tmpreg;
1472  uint32_t ch_num;
1473 
1474  temp = hhcd->Instance->GRXSTSP;
1475  ch_num = temp & USB_OTG_GRXSTSP_EPNUM;
1476  pktsts = (temp & USB_OTG_GRXSTSP_PKTSTS) >> 17;
1477  pktcnt = (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
1478 
1479  switch (pktsts)
1480  {
1481  case GRXSTS_PKTSTS_IN:
1482  /* Read the data into the host buffer. */
1483  if ((pktcnt > 0U) && (hhcd->hc[ch_num].xfer_buff != (void *)0))
1484  {
1485  (void)USB_ReadPacket(hhcd->Instance, hhcd->hc[ch_num].xfer_buff, (uint16_t)pktcnt);
1486 
1487  /*manage multiple Xfer */
1488  hhcd->hc[ch_num].xfer_buff += pktcnt;
1489  hhcd->hc[ch_num].xfer_count += pktcnt;
1490 
1491  if ((USBx_HC(ch_num)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) > 0U)
1492  {
1493  /* re-activate the channel when more packets are expected */
1494  tmpreg = USBx_HC(ch_num)->HCCHAR;
1495  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
1496  tmpreg |= USB_OTG_HCCHAR_CHENA;
1497  USBx_HC(ch_num)->HCCHAR = tmpreg;
1498  hhcd->hc[ch_num].toggle_in ^= 1U;
1499  }
1500  }
1501  break;
1502 
1503  case GRXSTS_PKTSTS_DATA_TOGGLE_ERR:
1504  break;
1505 
1506  case GRXSTS_PKTSTS_IN_XFER_COMP:
1507  case GRXSTS_PKTSTS_CH_HALTED:
1508  default:
1509  break;
1510  }
1511 }
1512 
1519 {
1520  USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
1521  uint32_t USBx_BASE = (uint32_t)USBx;
1522  __IO uint32_t hprt0, hprt0_dup;
1523 
1524  /* Handle Host Port Interrupts */
1525  hprt0 = USBx_HPRT0;
1526  hprt0_dup = USBx_HPRT0;
1527 
1528  hprt0_dup &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | \
1529  USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);
1530 
1531  /* Check whether Port Connect detected */
1532  if ((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET)
1533  {
1534  if ((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS)
1535  {
1536  USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
1537 
1538 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1539  hhcd->ConnectCallback(hhcd);
1540 #else
1542 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
1543  }
1544  hprt0_dup |= USB_OTG_HPRT_PCDET;
1545  }
1546 
1547  /* Check whether Port Enable Changed */
1548  if ((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG)
1549  {
1550  hprt0_dup |= USB_OTG_HPRT_PENCHNG;
1551 
1552  if ((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA)
1553  {
1554  if (hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY)
1555  {
1556  if ((hprt0 & USB_OTG_HPRT_PSPD) == (HPRT0_PRTSPD_LOW_SPEED << 17))
1557  {
1558  (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_6_MHZ);
1559  }
1560  else
1561  {
1562  (void)USB_InitFSLSPClkSel(hhcd->Instance, HCFG_48_MHZ);
1563  }
1564  }
1565  else
1566  {
1567  if (hhcd->Init.speed == HCD_SPEED_FULL)
1568  {
1569  USBx_HOST->HFIR = 60000U;
1570  }
1571  }
1572 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1573  hhcd->PortEnabledCallback(hhcd);
1574  hhcd->ConnectCallback(hhcd);
1575 #else
1578 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
1579 
1580  }
1581  else
1582  {
1583 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
1584  hhcd->PortDisabledCallback(hhcd);
1585 #else
1587 #endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
1588 
1589  /* Cleanup HPRT */
1590  USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | \
1591  USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);
1592 
1593  USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
1594  }
1595  }
1596 
1597  /* Check for an overcurrent */
1598  if ((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG)
1599  {
1600  hprt0_dup |= USB_OTG_HPRT_POCCHNG;
1601  }
1602 
1603  /* Clear Port Interrupts */
1604  USBx_HPRT0 = hprt0_dup;
1605 }
1606 
1615 #endif /* defined (USB_OTG_FS) */
1616 #endif /* HAL_HCD_MODULE_ENABLED */
1617 
1626 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
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 HAL_HCD_Stop(HCD_HandleTypeDef *hhcd)
Stop the host driver.
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...
USB_OTG_URBStateTypeDef
URB States definition.
HAL_HCD_CallbackIDTypeDef
uint32_t USB_HC_ReadInterrupt(USB_OTG_GlobalTypeDef *USBx)
Read all host channel interrupts status.
HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state)
USB_DriveVbus : activate or de-activate vbus.
static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd)
Handle Rx Queue Level interrupt requests.
void HAL_HCD_PortDisabled_Callback(HCD_HandleTypeDef *hhcd)
Port Disabled Event callback.
HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef *hhcd, uint8_t chnum)
Return the Host Channel state.
void * USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len)
USB_ReadPacket : read a packet from the RX FIFO.
HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx)
USB_OTG_ResetPort : Reset Host Port.
HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd)
Initialize the host driver.
HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd)
Reset the host port.
This file contains all the functions prototypes for the HAL module driver.
uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd)
Return the Host enumeration speed.
HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx, uint8_t freq)
USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the HCFG register on the PHY type and set ...
void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd)
DeInitialize the HCD MSP.
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...
__HAL_UNLOCK(hrtc)
HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc)
Start a transfer over a host channel.
void(* pHCD_CallbackTypeDef)(HCD_HandleTypeDef *hhcd)
HCD_StateTypeDef
uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd)
Return the current Host frame number.
struct __HCD_HandleTypeDef else typedef struct endif HCD_HandleTypeDef
void(* pHCD_HC_NotifyURBChangeCallbackTypeDef)(HCD_HandleTypeDef *hhcd, uint8_t epnum, HCD_URBStateTypeDef urb_state)
void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd)
Disconnection Event callback.
__HAL_LOCK(hrtc)
HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef *hhcd, uint8_t chnum)
Return URB state for a channel.
HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num)
Halt a host channel.
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_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num)
Halt a host channel.
return HAL_OK
HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
Initializes the USB Core.
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_PortEnabled_Callback(HCD_HandleTypeDef *hhcd)
Port Enabled Event callback.
HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef *hhcd)
Return the HCD handle state.
uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef *USBx)
Return Host Current Frame number.
static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd)
Handle Host Port interrupt requests.
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_Start(HCD_HandleTypeDef *hhcd)
Start the host driver.
USB_OTG_HCStateTypeDef
Host channel States definition.
HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx)
Stop Host Core.
void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd)
Initialize the HCD MSP.
void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd)
Connection Event callback.
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.
void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd)
SOF callback.
static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
Handle Host Channel IN interrupt requests.
HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_ModeTypeDef mode)
USB_SetCurrentMode : Set functional mode.
HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
USB_HostInit : Initializes the USB OTG controller registers for Host mode.
static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
Handle Host Channel OUT interrupt requests.
HAL_StatusTypeDef HAL_HCD_UnRegisterCallback(HCD_HandleTypeDef *hhcd, HAL_HCD_CallbackIDTypeDef CallbackID)
Unregister an USB HCD Callback USB HCD callabck is redirected to the weak predefined callback...
uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef *hhcd, uint8_t chnum)
Return the last host transfer size.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))
uint32_t USB_GetMode(USB_OTG_GlobalTypeDef *USBx)
Returns USB core mode.
uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx)
Return Host Core speed.