STM32L4xx_HAL_Driver  1.14.0
stm32l4xx_hal_pcd.h
Go to the documentation of this file.
1 
20 /* Define to prevent recursive inclusion -------------------------------------*/
21 #ifndef STM32L4xx_HAL_PCD_H
22 #define STM32L4xx_HAL_PCD_H
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /* Includes ------------------------------------------------------------------*/
29 #include "stm32l4xx_ll_usb.h"
30 
31 #if defined (USB) || defined (USB_OTG_FS)
32 
41 /* Exported types ------------------------------------------------------------*/
49 typedef enum
50 {
57 
58 /* Device LPM suspend state */
59 typedef enum
60 {
61  LPM_L0 = 0x00, /* on */
62  LPM_L1 = 0x01, /* LPM L1 sleep */
63  LPM_L2 = 0x02, /* suspend */
64  LPM_L3 = 0x03, /* off */
66 
67 typedef enum
68 {
69  PCD_LPM_L0_ACTIVE = 0x00, /* on */
70  PCD_LPM_L1_ACTIVE = 0x01, /* LPM L1 sleep */
72 
73 typedef enum
74 {
75  PCD_BCD_ERROR = 0xFF,
81 
83 
84 #if defined (USB)
85 
86 #endif /* defined (USB) */
87 #if defined (USB_OTG_FS)
88 typedef USB_OTG_GlobalTypeDef PCD_TypeDef;
91 #endif /* defined (USB_OTG_FS) */
92 #if defined (USB)
93 typedef USB_TypeDef PCD_TypeDef;
96 #endif /* defined (USB) */
97 
101 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
102 typedef struct __PCD_HandleTypeDef
103 #else
104 typedef struct
105 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
106 {
107  PCD_TypeDef *Instance;
108  PCD_InitTypeDef Init;
109  __IO uint8_t USB_Address;
110 #if defined (USB_OTG_FS)
111  PCD_EPTypeDef IN_ep[16];
112  PCD_EPTypeDef OUT_ep[16];
113 #endif /* defined (USB_OTG_FS) */
114 #if defined (USB)
115  PCD_EPTypeDef IN_ep[8];
116  PCD_EPTypeDef OUT_ep[8];
117 #endif /* defined (USB) */
118  HAL_LockTypeDef Lock;
120  __IO uint32_t ErrorCode;
121  uint32_t Setup[12];
123  uint32_t BESL;
124 
125 
126  uint32_t lpm_active;
131  void *pData;
133 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
134  void (* SOFCallback)(struct __PCD_HandleTypeDef *hpcd);
135  void (* SetupStageCallback)(struct __PCD_HandleTypeDef *hpcd);
136  void (* ResetCallback)(struct __PCD_HandleTypeDef *hpcd);
137  void (* SuspendCallback)(struct __PCD_HandleTypeDef *hpcd);
138  void (* ResumeCallback)(struct __PCD_HandleTypeDef *hpcd);
139  void (* ConnectCallback)(struct __PCD_HandleTypeDef *hpcd);
140  void (* DisconnectCallback)(struct __PCD_HandleTypeDef *hpcd);
142  void (* DataOutStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum);
143  void (* DataInStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum);
144  void (* ISOOUTIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum);
145  void (* ISOINIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum);
146  void (* BCDCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg);
147  void (* LPMCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg);
149  void (* MspInitCallback)(struct __PCD_HandleTypeDef *hpcd);
150  void (* MspDeInitCallback)(struct __PCD_HandleTypeDef *hpcd);
151 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
153 
158 /* Include PCD HAL Extended module */
159 #include "stm32l4xx_hal_pcd_ex.h"
160 
161 /* Exported constants --------------------------------------------------------*/
169 #define PCD_SPEED_FULL USBD_FS_SPEED
170 
177 #define PCD_PHY_ULPI 1U
178 #define PCD_PHY_EMBEDDED 2U
179 #define PCD_PHY_UTMI 3U
180 
188 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
189 #define HAL_PCD_ERROR_INVALID_CALLBACK (0x00000010U)
190 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
191 
200 /* Exported macros -----------------------------------------------------------*/
205 #if defined (USB_OTG_FS)
206 #define __HAL_PCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance)
207 #define __HAL_PCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance)
208 
209 #define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__) ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__))
210 #define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) &= (__INTERRUPT__))
211 #define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U)
212 
213 
214 #define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__) *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= \
215  ~(USB_OTG_PCGCCTL_STOPCLK)
216 
217 #define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__) *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK
218 
219 #define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__) ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE)) & 0x10U)
220 
221 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR1 |= USB_OTG_FS_WAKEUP_EXTI_LINE
222 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR1 &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE)
223 #endif /* defined (USB_OTG_FS) */
224 
225 #if defined (USB)
226 #define __HAL_PCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance)
227 #define __HAL_PCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance)
228 #define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__) ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__))
229 #define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->ISTR) &= ~(__INTERRUPT__))
230 
231 #define __HAL_USB_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR1 |= USB_WAKEUP_EXTI_LINE
232 #define __HAL_USB_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR1 &= ~(USB_WAKEUP_EXTI_LINE)
233 #endif /* defined (USB) */
234 
239 /* Exported functions --------------------------------------------------------*/
244 /* Initialization/de-initialization functions ********************************/
248 HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd);
249 HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd);
252 
253 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
254 
258 typedef enum
259 {
281 typedef void (*pPCD_CallbackTypeDef)(PCD_HandleTypeDef *hpcd);
282 typedef void (*pPCD_DataOutStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum);
283 typedef void (*pPCD_DataInStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum);
284 typedef void (*pPCD_IsoOutIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum);
285 typedef void (*pPCD_IsoInIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum);
293 HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, pPCD_CallbackTypeDef pCallback);
294 HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID);
295 
298 
301 
304 
307 
308 HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback);
309 HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd);
310 
311 HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback);
312 HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd);
313 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
314 
318 /* I/O operation functions ***************************************************/
319 /* Non-Blocking mode: Interrupt */
323 HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd);
324 HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd);
326 
334 
335 void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);
336 void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);
337 void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);
338 void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);
343 /* Peripheral Control functions **********************************************/
347 HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd);
348 HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd);
349 HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address);
350 HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type);
351 HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
352 HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len);
353 HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len);
354 uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
355 HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
356 HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
357 HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
358 HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd);
359 HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd);
364 /* Peripheral State functions ************************************************/
377 /* Private constants ---------------------------------------------------------*/
384 #if defined (USB_OTG_FS)
385 #define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE 0x08U
386 #define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE 0x0CU
387 #define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U
388 
389 #define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 17)
390 #endif /* defined (USB_OTG_FS) */
391 
392 #if defined (USB)
393 #define USB_WAKEUP_EXTI_LINE (0x1U << 17)
394 #endif /* defined (USB) */
395 
399 #if defined (USB)
400 
403 #define PCD_EP0MPS_64 DEP0CTL_MPS_64
404 #define PCD_EP0MPS_32 DEP0CTL_MPS_32
405 #define PCD_EP0MPS_16 DEP0CTL_MPS_16
406 #define PCD_EP0MPS_08 DEP0CTL_MPS_8
407 
414 #define PCD_ENDP0 0U
415 #define PCD_ENDP1 1U
416 #define PCD_ENDP2 2U
417 #define PCD_ENDP3 3U
418 #define PCD_ENDP4 4U
419 #define PCD_ENDP5 5U
420 #define PCD_ENDP6 6U
421 #define PCD_ENDP7 7U
422 
429 #define PCD_SNG_BUF 0U
430 #define PCD_DBL_BUF 1U
431 
434 #endif /* defined (USB) */
435 
439 #if defined (USB_OTG_FS)
440 #ifndef USB_OTG_DOEPINT_OTEPSPR
441 #define USB_OTG_DOEPINT_OTEPSPR (0x1UL << 5)
442 #endif
443 
444 #ifndef USB_OTG_DOEPMSK_OTEPSPRM
445 #define USB_OTG_DOEPMSK_OTEPSPRM (0x1UL << 5)
446 #endif
447 
448 #ifndef USB_OTG_DOEPINT_NAK
449 #define USB_OTG_DOEPINT_NAK (0x1UL << 13)
450 #endif
451 
452 #ifndef USB_OTG_DOEPMSK_NAKM
453 #define USB_OTG_DOEPMSK_NAKM (0x1UL << 13)
454 #endif
455 
456 #ifndef USB_OTG_DOEPINT_STPKTRX
457 #define USB_OTG_DOEPINT_STPKTRX (0x1UL << 15)
458 #endif
459 
460 #ifndef USB_OTG_DOEPMSK_NYETM
461 #define USB_OTG_DOEPMSK_NYETM (0x1UL << 14)
462 #endif
463 #endif /* defined (USB_OTG_FS) */
464 
465 /* Private macros ------------------------------------------------------------*/
469 #if defined (USB)
470 /******************** Bit definition for USB_COUNTn_RX register *************/
471 #define USB_CNTRX_NBLK_MSK (0x1FU << 10)
472 #define USB_CNTRX_BLSIZE (0x1U << 15)
473 
474 /* SetENDPOINT */
475 #define PCD_SET_ENDPOINT(USBx, bEpNum, wRegValue) (*(__IO uint16_t *)(&(USBx)->EP0R + ((bEpNum) * 2U)) = (uint16_t)(wRegValue))
476 
477 /* GetENDPOINT */
478 #define PCD_GET_ENDPOINT(USBx, bEpNum) (*(__IO uint16_t *)(&(USBx)->EP0R + ((bEpNum) * 2U)))
479 
480 /* ENDPOINT transfer */
481 #define USB_EP0StartXfer USB_EPStartXfer
482 
490 #define PCD_SET_EPTYPE(USBx, bEpNum, wType) (PCD_SET_ENDPOINT((USBx), (bEpNum), \
491  ((PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EP_T_MASK) | (wType) | USB_EP_CTR_TX | USB_EP_CTR_RX)))
492 
499 #define PCD_GET_EPTYPE(USBx, bEpNum) (PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EP_T_FIELD)
500 
508 #define PCD_FreeUserBuffer(USBx, bEpNum, bDir) do { \
509  if ((bDir) == 0U) \
510  { \
511  /* OUT double buffered endpoint */ \
512  PCD_TX_DTOG((USBx), (bEpNum)); \
513  } \
514  else if ((bDir) == 1U) \
515  { \
516  /* IN double buffered endpoint */ \
517  PCD_RX_DTOG((USBx), (bEpNum)); \
518  } \
519 } while(0)
520 
528 #define PCD_SET_EP_TX_STATUS(USBx, bEpNum, wState) do { \
529  register uint16_t _wRegVal; \
530  \
531  _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPTX_DTOGMASK; \
532  /* toggle first bit ? */ \
533  if ((USB_EPTX_DTOG1 & (wState))!= 0U) \
534  { \
535  _wRegVal ^= USB_EPTX_DTOG1; \
536  } \
537  /* toggle second bit ? */ \
538  if ((USB_EPTX_DTOG2 & (wState))!= 0U) \
539  { \
540  _wRegVal ^= USB_EPTX_DTOG2; \
541  } \
542  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \
543  } while(0) /* PCD_SET_EP_TX_STATUS */
544 
552 #define PCD_SET_EP_RX_STATUS(USBx, bEpNum,wState) do { \
553  register uint16_t _wRegVal; \
554  \
555  _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPRX_DTOGMASK; \
556  /* toggle first bit ? */ \
557  if ((USB_EPRX_DTOG1 & (wState))!= 0U) \
558  { \
559  _wRegVal ^= USB_EPRX_DTOG1; \
560  } \
561  /* toggle second bit ? */ \
562  if ((USB_EPRX_DTOG2 & (wState))!= 0U) \
563  { \
564  _wRegVal ^= USB_EPRX_DTOG2; \
565  } \
566  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \
567  } while(0) /* PCD_SET_EP_RX_STATUS */
568 
577 #define PCD_SET_EP_TXRX_STATUS(USBx, bEpNum, wStaterx, wStatetx) do { \
578  register uint16_t _wRegVal; \
579  \
580  _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (USB_EPRX_DTOGMASK | USB_EPTX_STAT); \
581  /* toggle first bit ? */ \
582  if ((USB_EPRX_DTOG1 & (wStaterx))!= 0U) \
583  { \
584  _wRegVal ^= USB_EPRX_DTOG1; \
585  } \
586  /* toggle second bit ? */ \
587  if ((USB_EPRX_DTOG2 & (wStaterx))!= 0U) \
588  { \
589  _wRegVal ^= USB_EPRX_DTOG2; \
590  } \
591  /* toggle first bit ? */ \
592  if ((USB_EPTX_DTOG1 & (wStatetx))!= 0U) \
593  { \
594  _wRegVal ^= USB_EPTX_DTOG1; \
595  } \
596  /* toggle second bit ? */ \
597  if ((USB_EPTX_DTOG2 & (wStatetx))!= 0U) \
598  { \
599  _wRegVal ^= USB_EPTX_DTOG2; \
600  } \
601  \
602  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \
603  } while(0) /* PCD_SET_EP_TXRX_STATUS */
604 
612 #define PCD_GET_EP_TX_STATUS(USBx, bEpNum) ((uint16_t)PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPTX_STAT)
613 #define PCD_GET_EP_RX_STATUS(USBx, bEpNum) ((uint16_t)PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPRX_STAT)
614 
621 #define PCD_SET_EP_TX_VALID(USBx, bEpNum) (PCD_SET_EP_TX_STATUS((USBx), (bEpNum), USB_EP_TX_VALID))
622 #define PCD_SET_EP_RX_VALID(USBx, bEpNum) (PCD_SET_EP_RX_STATUS((USBx), (bEpNum), USB_EP_RX_VALID))
623 
630 #define PCD_GET_EP_TX_STALL_STATUS(USBx, bEpNum) (PCD_GET_EP_TX_STATUS((USBx), (bEpNum)) \
631  == USB_EP_TX_STALL)
632 #define PCD_GET_EP_RX_STALL_STATUS(USBx, bEpNum) (PCD_GET_EP_RX_STATUS((USBx), (bEpNum)) \
633  == USB_EP_RX_STALL)
634 
641 #define PCD_SET_EP_KIND(USBx, bEpNum) do { \
642  register uint16_t _wRegVal; \
643  \
644  _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \
645  \
646  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_KIND)); \
647  } while(0) /* PCD_SET_EP_KIND */
648 
649 #define PCD_CLEAR_EP_KIND(USBx, bEpNum) do { \
650  register uint16_t _wRegVal; \
651  \
652  _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPKIND_MASK; \
653  \
654  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \
655  } while(0) /* PCD_CLEAR_EP_KIND */
656 
663 #define PCD_SET_OUT_STATUS(USBx, bEpNum) PCD_SET_EP_KIND((USBx), (bEpNum))
664 #define PCD_CLEAR_OUT_STATUS(USBx, bEpNum) PCD_CLEAR_EP_KIND((USBx), (bEpNum))
665 
672 #define PCD_SET_EP_DBUF(USBx, bEpNum) PCD_SET_EP_KIND((USBx), (bEpNum))
673 #define PCD_CLEAR_EP_DBUF(USBx, bEpNum) PCD_CLEAR_EP_KIND((USBx), (bEpNum))
674 
681 #define PCD_CLEAR_RX_EP_CTR(USBx, bEpNum) do { \
682  register uint16_t _wRegVal; \
683  \
684  _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (0x7FFFU & USB_EPREG_MASK); \
685  \
686  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_TX)); \
687  } while(0) /* PCD_CLEAR_RX_EP_CTR */
688 
689 #define PCD_CLEAR_TX_EP_CTR(USBx, bEpNum) do { \
690  register uint16_t _wRegVal; \
691  \
692  _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (0xFF7FU & USB_EPREG_MASK); \
693  \
694  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX)); \
695  } while(0) /* PCD_CLEAR_TX_EP_CTR */
696 
703 #define PCD_RX_DTOG(USBx, bEpNum) do { \
704  register uint16_t _wEPVal; \
705  \
706  _wEPVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \
707  \
708  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wEPVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_RX)); \
709  } while(0) /* PCD_RX_DTOG */
710 
711 #define PCD_TX_DTOG(USBx, bEpNum) do { \
712  register uint16_t _wEPVal; \
713  \
714  _wEPVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \
715  \
716  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wEPVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_TX)); \
717  } while(0) /* PCD_TX_DTOG */
718 
724 #define PCD_CLEAR_RX_DTOG(USBx, bEpNum) do { \
725  register uint16_t _wRegVal; \
726  \
727  _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)); \
728  \
729  if ((_wRegVal & USB_EP_DTOG_RX) != 0U)\
730  { \
731  PCD_RX_DTOG((USBx), (bEpNum)); \
732  } \
733  } while(0) /* PCD_CLEAR_RX_DTOG */
734 
735 #define PCD_CLEAR_TX_DTOG(USBx, bEpNum) do { \
736  register uint16_t _wRegVal; \
737  \
738  _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)); \
739  \
740  if ((_wRegVal & USB_EP_DTOG_TX) != 0U)\
741  { \
742  PCD_TX_DTOG((USBx), (bEpNum)); \
743  } \
744  } while(0) /* PCD_CLEAR_TX_DTOG */
745 
753 #define PCD_SET_EP_ADDRESS(USBx, bEpNum, bAddr) do { \
754  register uint16_t _wRegVal; \
755  \
756  _wRegVal = (PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK) | (bAddr); \
757  \
758  PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \
759  } while(0) /* PCD_SET_EP_ADDRESS */
760 
767 #define PCD_GET_EP_ADDRESS(USBx, bEpNum) ((uint8_t)(PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPADDR_FIELD))
768 
769 #define PCD_EP_TX_CNT(USBx, bEpNum) ((uint16_t *)((((uint32_t)(USBx)->BTABLE + ((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS) + ((uint32_t)(USBx) + 0x400U)))
770 #define PCD_EP_RX_CNT(USBx, bEpNum) ((uint16_t *)((((uint32_t)(USBx)->BTABLE + ((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS) + ((uint32_t)(USBx) + 0x400U)))
771 
779 #define PCD_SET_EP_TX_ADDRESS(USBx, bEpNum, wAddr) do { \
780  register uint16_t *_wRegVal; \
781  register uint32_t _wRegBase = (uint32_t)USBx; \
782  \
783  _wRegBase += (uint32_t)(USBx)->BTABLE; \
784  _wRegVal = (uint16_t *)(_wRegBase + 0x400U + (((uint32_t)(bEpNum) * 8U) * PMA_ACCESS)); \
785  *_wRegVal = ((wAddr) >> 1) << 1; \
786 } while(0) /* PCD_SET_EP_TX_ADDRESS */
787 
788 #define PCD_SET_EP_RX_ADDRESS(USBx, bEpNum, wAddr) do { \
789  register uint16_t *_wRegVal; \
790  register uint32_t _wRegBase = (uint32_t)USBx; \
791  \
792  _wRegBase += (uint32_t)(USBx)->BTABLE; \
793  _wRegVal = (uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 4U) * PMA_ACCESS)); \
794  *_wRegVal = ((wAddr) >> 1) << 1; \
795 } while(0) /* PCD_SET_EP_RX_ADDRESS */
796 
803 #define PCD_GET_EP_TX_ADDRESS(USBx, bEpNum) ((uint16_t)*PCD_EP_TX_ADDRESS((USBx), (bEpNum)))
804 #define PCD_GET_EP_RX_ADDRESS(USBx, bEpNum) ((uint16_t)*PCD_EP_RX_ADDRESS((USBx), (bEpNum)))
805 
813 #define PCD_CALC_BLK32(pdwReg, wCount, wNBlocks) do { \
814  (wNBlocks) = (wCount) >> 5; \
815  *(pdwReg) = (uint16_t)(((wNBlocks) << 10) | USB_CNTRX_BLSIZE); \
816  } while(0) /* PCD_CALC_BLK32 */
817 
818 #define PCD_CALC_BLK2(pdwReg, wCount, wNBlocks) do { \
819  (wNBlocks) = (wCount) >> 1; \
820  if (((wCount) & 0x1U) != 0U) \
821  { \
822  (wNBlocks)++; \
823  } \
824  *(pdwReg) = (uint16_t)((wNBlocks) << 10); \
825  } while(0) /* PCD_CALC_BLK2 */
826 
827 #define PCD_SET_EP_CNT_RX_REG(pdwReg, wCount) do { \
828  uint32_t wNBlocks; \
829  if ((wCount) == 0U) \
830  { \
831  *(pdwReg) &= (uint16_t)~USB_CNTRX_NBLK_MSK; \
832  *(pdwReg) |= USB_CNTRX_BLSIZE; \
833  } \
834  else if((wCount) < 62U) \
835  { \
836  PCD_CALC_BLK2((pdwReg), (wCount), wNBlocks); \
837  } \
838  else \
839  { \
840  PCD_CALC_BLK32((pdwReg),(wCount), wNBlocks); \
841  } \
842  } while(0) /* PCD_SET_EP_CNT_RX_REG */
843 
844 #define PCD_SET_EP_RX_DBUF0_CNT(USBx, bEpNum, wCount) do { \
845  register uint32_t _wRegBase = (uint32_t)(USBx); \
846  uint16_t *pdwReg; \
847  \
848  _wRegBase += (uint32_t)(USBx)->BTABLE; \
849  pdwReg = (uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS)); \
850  PCD_SET_EP_CNT_RX_REG(pdwReg, (wCount)); \
851  } while(0)
852 
860 #define PCD_SET_EP_TX_CNT(USBx, bEpNum, wCount) do { \
861  register uint32_t _wRegBase = (uint32_t)(USBx); \
862  uint16_t *_wRegVal; \
863  \
864  _wRegBase += (uint32_t)(USBx)->BTABLE; \
865  _wRegVal = (uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS)); \
866  *_wRegVal = (uint16_t)(wCount); \
867 } while(0)
868 
869 #define PCD_SET_EP_RX_CNT(USBx, bEpNum, wCount) do { \
870  register uint32_t _wRegBase = (uint32_t)(USBx); \
871  uint16_t *_wRegVal; \
872  \
873  _wRegBase += (uint32_t)(USBx)->BTABLE; \
874  _wRegVal = (uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS)); \
875  PCD_SET_EP_CNT_RX_REG(_wRegVal, (wCount)); \
876 } while(0)
877 
884 #define PCD_GET_EP_TX_CNT(USBx, bEpNum) ((uint32_t)(*PCD_EP_TX_CNT((USBx), (bEpNum))) & 0x3ffU)
885 #define PCD_GET_EP_RX_CNT(USBx, bEpNum) ((uint32_t)(*PCD_EP_RX_CNT((USBx), (bEpNum))) & 0x3ffU)
886 
894 #define PCD_SET_EP_DBUF0_ADDR(USBx, bEpNum, wBuf0Addr) do { \
895  PCD_SET_EP_TX_ADDRESS((USBx), (bEpNum), (wBuf0Addr)); \
896  } while(0) /* PCD_SET_EP_DBUF0_ADDR */
897 #define PCD_SET_EP_DBUF1_ADDR(USBx, bEpNum, wBuf1Addr) do { \
898  PCD_SET_EP_RX_ADDRESS((USBx), (bEpNum), (wBuf1Addr)); \
899  } while(0) /* PCD_SET_EP_DBUF1_ADDR */
900 
909 #define PCD_SET_EP_DBUF_ADDR(USBx, bEpNum, wBuf0Addr, wBuf1Addr) do { \
910  PCD_SET_EP_DBUF0_ADDR((USBx), (bEpNum), (wBuf0Addr)); \
911  PCD_SET_EP_DBUF1_ADDR((USBx), (bEpNum), (wBuf1Addr)); \
912  } while(0) /* PCD_SET_EP_DBUF_ADDR */
913 
920 #define PCD_GET_EP_DBUF0_ADDR(USBx, bEpNum) (PCD_GET_EP_TX_ADDRESS((USBx), (bEpNum)))
921 #define PCD_GET_EP_DBUF1_ADDR(USBx, bEpNum) (PCD_GET_EP_RX_ADDRESS((USBx), (bEpNum)))
922 
932 #define PCD_SET_EP_DBUF0_CNT(USBx, bEpNum, bDir, wCount) do { \
933  if ((bDir) == 0U) \
934  /* OUT endpoint */ \
935  { \
936  PCD_SET_EP_RX_DBUF0_CNT((USBx), (bEpNum), (wCount)); \
937  } \
938  else \
939  { \
940  if ((bDir) == 1U) \
941  { \
942  /* IN endpoint */ \
943  PCD_SET_EP_TX_CNT((USBx), (bEpNum), (wCount)); \
944  } \
945  } \
946  } while(0) /* SetEPDblBuf0Count*/
947 
948 #define PCD_SET_EP_DBUF1_CNT(USBx, bEpNum, bDir, wCount) do { \
949  register uint32_t _wBase = (uint32_t)(USBx); \
950  uint16_t *_wEPRegVal; \
951  \
952  if ((bDir) == 0U) \
953  { \
954  /* OUT endpoint */ \
955  PCD_SET_EP_RX_CNT((USBx), (bEpNum), (wCount)); \
956  } \
957  else \
958  { \
959  if ((bDir) == 1U) \
960  { \
961  /* IN endpoint */ \
962  _wBase += (uint32_t)(USBx)->BTABLE; \
963  _wEPRegVal = (uint16_t *)(_wBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS)); \
964  *_wEPRegVal = (uint16_t)(wCount); \
965  } \
966  } \
967  } while(0) /* SetEPDblBuf1Count */
968 
969 #define PCD_SET_EP_DBUF_CNT(USBx, bEpNum, bDir, wCount) do { \
970  PCD_SET_EP_DBUF0_CNT((USBx), (bEpNum), (bDir), (wCount)); \
971  PCD_SET_EP_DBUF1_CNT((USBx), (bEpNum), (bDir), (wCount)); \
972  } while(0) /* PCD_SET_EP_DBUF_CNT */
973 
980 #define PCD_GET_EP_DBUF0_CNT(USBx, bEpNum) (PCD_GET_EP_TX_CNT((USBx), (bEpNum)))
981 #define PCD_GET_EP_DBUF1_CNT(USBx, bEpNum) (PCD_GET_EP_RX_CNT((USBx), (bEpNum)))
982 
983 #endif /* defined (USB) */
984 
996 #endif /* defined (USB) || defined (USB_OTG_FS) */
997 
998 #ifdef __cplusplus
999 }
1000 #endif
1001 
1002 #endif /* STM32L4xx_HAL_PCD_H */
1003 
1004 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataInStageCallbackTypeDef pCallback)
Register USB PCD Data IN Stage Callback To be used instead of the weak HAL_PCD_DataInStageCallback() ...
void(* pPCD_CallbackTypeDef)(PCD_HandleTypeDef *hpcd)
USB_OTG_GlobalTypeDef PCD_TypeDef
void(* pPCD_IsoInIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum)
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
Resume event callback.
USB_OTG_EPTypeDef PCD_EPTypeDef
uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Get Received Data Size.
HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, pPCD_CallbackTypeDef pCallback)
Register a User USB PCD Callback To be used instead of the weak predefined callback.
HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoOutIncpltCallbackTypeDef pCallback)
Register USB PCD Iso OUT incomplete Callback To be used instead of the weak HAL_PCD_ISOOUTIncompleteC...
void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
Initializes the PCD MSP.
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Data OUT stage callback.
HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd)
UnRegister the USB PCD Data IN Stage Callback USB PCD Data OUT Stage Callback is redirected to the we...
PCD_StateTypeDef
PCD State structure definition.
void(* pPCD_DataInStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum)
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_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd)
UnRegister the USB PCD LPM Callback USB LPM Callback is redirected to the weak HAL_PCDEx_LPM_Callback...
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
USB Start Of Frame callback.
Header file of PCD HAL Extension module.
void(* pPCD_DataOutStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum)
HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Deactivate an endpoint.
HAL_PCD_CallbackIDTypeDef
struct __PCD_HandleTypeDef else typedef struct endif PCD_HandleTypeDef
PCD Handle Structure definition.
HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd)
UnRegister the USB PCD BCD Callback USB BCD Callback is redirected to the weak HAL_PCDEx_BCD_Callback...
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Incomplete ISO IN callback.
HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd)
Disconnect the USB device.
void(* pPCD_IsoOutIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum)
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Data IN stage callback.
HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
Send an amount of data.
uint32_t lpm_active
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
USB Reset callback.
HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback)
Register USB PCD BCD Callback To be used instead of the weak HAL_PCDEx_BCD_Callback() predefined call...
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
Incomplete ISO OUT callback.
HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd)
Connect the USB device.
USB_OTG_CfgTypeDef PCD_InitTypeDef
PCD_BCD_MsgTypeDef
__IO uint8_t USB_Address
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
Setup stage callback.
HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)
Start the USB device.
HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback)
Register USB PCD LPM Callback To be used instead of the weak HAL_PCDEx_LPM_Callback() predefined call...
HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Set a STALL condition over an endpoint.
HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)
Initializes the PCD according to the specified parameters in the PCD_InitTypeDef and initialize the a...
__IO PCD_StateTypeDef State
PCD_LPM_StateTypeDef LPM_State
HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
Flush an endpoint.
HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd)
DeInitializes the PCD peripheral.
HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd)
UnRegister the USB PCD Data OUT Stage Callback USB PCD Data OUT Stage Callback is redirected to the w...
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
Suspend event callback.
USB OTG Initialization Structure definition.
USB Initialization Structure definition.
PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd)
Return the PCD handle state.
HAL_LockTypeDef
HAL Lock structures definition.
uint32_t battery_charging_active
HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd)
UnRegister the USB PCD Iso IN incomplete Callback USB PCD Iso IN incomplete Callback is redirected to...
uint32_t BESL
HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
Receive an amount of data.
ADC handle Structure definition.
PCD_LPM_MsgTypeDef
HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd)
Stop 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_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataOutStageCallbackTypeDef pCallback)
Register USB PCD Data OUT Stage Callback To be used instead of the weak HAL_PCD_DataOutStageCallback(...
PCD_InitTypeDef Init
void(* pPCD_LpmCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)
HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address)
Set the USB Device address.
HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd)
UnRegister the USB PCD Iso OUT incomplete Callback USB PCD Iso OUT incomplete Callback is redirected ...
PCD_LPM_StateTypeDef
HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
Activate remote wakeup signalling.
Header file of USB Low Layer HAL module.
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
Disconnection event callback.
HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
De-activate remote wakeup signalling.
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
Connection event callback.
PCD_TypeDef * Instance
HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID)
Unregister an USB PCD Callback USB PCD callabck is redirected to the weak predefined callback...
void(* pPCD_BcdCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg)
void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
Handles PCD interrupt request.
void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
DeInitializes PCD MSP.
HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoInIncpltCallbackTypeDef pCallback)
Register USB PCD Iso IN incomplete Callback To be used instead of the weak HAL_PCD_ISOINIncompleteCal...