1 /** 2 ****************************************************************************** 3 * @file stm32u5xx_hal_pcd.h 4 * @author MCD Application Team 5 * @brief Header file of PCD HAL module. 6 ****************************************************************************** 7 * @attention 8 * 9 * Copyright (c) 2021 STMicroelectronics. 10 * All rights reserved. 11 * 12 * This software is licensed under terms that can be found in the LICENSE file 13 * in the root directory of this software component. 14 * If no LICENSE file comes with this software, it is provided AS-IS. 15 * 16 ****************************************************************************** 17 */ 18 19 /* Define to prevent recursive inclusion -------------------------------------*/ 20 #ifndef STM32U5xx_HAL_PCD_H 21 #define STM32U5xx_HAL_PCD_H 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 /* Includes ------------------------------------------------------------------*/ 28 #include "stm32u5xx_ll_usb.h" 29 30 #if defined (USB_OTG_FS) || defined (USB_OTG_HS) 31 32 /** @addtogroup STM32U5xx_HAL_Driver 33 * @{ 34 */ 35 36 /** @addtogroup PCD 37 * @{ 38 */ 39 40 /* Exported types ------------------------------------------------------------*/ 41 /** @defgroup PCD_Exported_Types PCD Exported Types 42 * @{ 43 */ 44 45 /** 46 * @brief PCD State structure definition 47 */ 48 typedef enum 49 { 50 HAL_PCD_STATE_RESET = 0x00, 51 HAL_PCD_STATE_READY = 0x01, 52 HAL_PCD_STATE_ERROR = 0x02, 53 HAL_PCD_STATE_BUSY = 0x03, 54 HAL_PCD_STATE_TIMEOUT = 0x04 55 } PCD_StateTypeDef; 56 57 /* Device LPM suspend state */ 58 typedef enum 59 { 60 LPM_L0 = 0x00, /* on */ 61 LPM_L1 = 0x01, /* LPM L1 sleep */ 62 LPM_L2 = 0x02, /* suspend */ 63 LPM_L3 = 0x03, /* off */ 64 } PCD_LPM_StateTypeDef; 65 66 typedef enum 67 { 68 PCD_LPM_L0_ACTIVE = 0x00, /* on */ 69 PCD_LPM_L1_ACTIVE = 0x01, /* LPM L1 sleep */ 70 } PCD_LPM_MsgTypeDef; 71 72 typedef enum 73 { 74 PCD_BCD_ERROR = 0xFF, 75 PCD_BCD_CONTACT_DETECTION = 0xFE, 76 PCD_BCD_STD_DOWNSTREAM_PORT = 0xFD, 77 PCD_BCD_CHARGING_DOWNSTREAM_PORT = 0xFC, 78 PCD_BCD_DEDICATED_CHARGING_PORT = 0xFB, 79 PCD_BCD_DISCOVERY_COMPLETED = 0x00, 80 81 } PCD_BCD_MsgTypeDef; 82 83 #if defined (USB_OTG_FS) || defined (USB_OTG_HS) 84 typedef USB_OTG_GlobalTypeDef PCD_TypeDef; 85 typedef USB_OTG_CfgTypeDef PCD_InitTypeDef; 86 typedef USB_OTG_EPTypeDef PCD_EPTypeDef; 87 #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ 88 89 /** 90 * @brief PCD Handle Structure definition 91 */ 92 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 93 typedef struct __PCD_HandleTypeDef 94 #else 95 typedef struct 96 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ 97 { 98 PCD_TypeDef *Instance; /*!< Register base address */ 99 PCD_InitTypeDef Init; /*!< PCD required parameters */ 100 __IO uint8_t USB_Address; /*!< USB Address */ 101 PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ 102 PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ 103 HAL_LockTypeDef Lock; /*!< PCD peripheral status */ 104 __IO PCD_StateTypeDef State; /*!< PCD communication state */ 105 __IO uint32_t ErrorCode; /*!< PCD Error code */ 106 uint32_t Setup[12]; /*!< Setup packet buffer */ 107 PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ 108 uint32_t BESL; 109 110 111 uint32_t lpm_active; /*!< Enable or disable the Link Power Management . 112 This parameter can be set to ENABLE or DISABLE */ 113 114 uint32_t battery_charging_active; /*!< Enable or disable Battery charging. 115 This parameter can be set to ENABLE or DISABLE */ 116 void *pData; /*!< Pointer to upper stack Handler */ 117 118 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 119 void (* SOFCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD SOF callback */ 120 void (* SetupStageCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Setup Stage callback */ 121 void (* ResetCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Reset callback */ 122 void (* SuspendCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Suspend callback */ 123 void (* ResumeCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Resume callback */ 124 void (* ConnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Connect callback */ 125 void (* DisconnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Disconnect callback */ 126 127 void (* DataOutStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data OUT Stage callback */ 128 void (* DataInStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data IN Stage callback */ 129 void (* ISOOUTIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO OUT Incomplete callback */ 130 void (* ISOINIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO IN Incomplete callback */ 131 void (* BCDCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); /*!< USB OTG PCD BCD callback */ 132 void (* LPMCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< USB OTG PCD LPM callback */ 133 134 void (* MspInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp Init callback */ 135 void (* MspDeInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp DeInit callback */ 136 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ 137 } PCD_HandleTypeDef; 138 139 /** 140 * @} 141 */ 142 143 /* Include PCD HAL Extended module */ 144 #include "stm32u5xx_hal_pcd_ex.h" 145 146 /* Exported constants --------------------------------------------------------*/ 147 /** @defgroup PCD_Exported_Constants PCD Exported Constants 148 * @{ 149 */ 150 151 /** @defgroup PCD_Speed PCD Speed 152 * @{ 153 */ 154 #define PCD_SPEED_HIGH USBD_HS_SPEED 155 #define PCD_SPEED_HIGH_IN_FULL USBD_HSINFS_SPEED 156 #define PCD_SPEED_FULL USBD_FS_SPEED 157 /** 158 * @} 159 */ 160 161 /** @defgroup PCD_PHY_Module PCD PHY Module 162 * @{ 163 */ 164 #define PCD_PHY_ULPI 1U 165 #define PCD_PHY_EMBEDDED 2U 166 #define PCD_PHY_UTMI 3U 167 /** 168 * @} 169 */ 170 171 /** @defgroup PCD_Error_Code_definition PCD Error Code definition 172 * @brief PCD Error Code definition 173 * @{ 174 */ 175 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 176 #define HAL_PCD_ERROR_INVALID_CALLBACK (0x00000010U) /*!< Invalid Callback error */ 177 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ 178 179 /** 180 * @} 181 */ 182 183 /** 184 * @} 185 */ 186 187 /* Exported macros -----------------------------------------------------------*/ 188 /** @defgroup PCD_Exported_Macros PCD Exported Macros 189 * @brief macros to handle interrupts and specific clock configurations 190 * @{ 191 */ 192 #if defined (USB_OTG_FS) || defined (USB_OTG_HS) 193 #define __HAL_PCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance) 194 #define __HAL_PCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance) 195 196 #define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__) \ 197 ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__)) 198 199 #define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) &= (__INTERRUPT__)) 200 #define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U) 201 202 #define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__) \ 203 *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= ~(USB_OTG_PCGCCTL_STOPCLK) 204 205 #define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__) \ 206 *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK 207 208 #define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__) \ 209 ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE)) & 0x10U) 210 #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ 211 212 213 /** 214 * @} 215 */ 216 217 /* Exported functions --------------------------------------------------------*/ 218 /** @addtogroup PCD_Exported_Functions PCD Exported Functions 219 * @{ 220 */ 221 222 /* Initialization/de-initialization functions ********************************/ 223 /** @addtogroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions 224 * @{ 225 */ 226 HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd); 227 HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd); 228 void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd); 229 void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd); 230 231 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) 232 /** @defgroup HAL_PCD_Callback_ID_enumeration_definition HAL USB OTG PCD Callback ID enumeration definition 233 * @brief HAL USB OTG PCD Callback ID enumeration definition 234 * @{ 235 */ 236 typedef enum 237 { 238 HAL_PCD_SOF_CB_ID = 0x01, /*!< USB PCD SOF callback ID */ 239 HAL_PCD_SETUPSTAGE_CB_ID = 0x02, /*!< USB PCD Setup Stage callback ID */ 240 HAL_PCD_RESET_CB_ID = 0x03, /*!< USB PCD Reset callback ID */ 241 HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ 242 HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ 243 HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ 244 HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ 245 246 HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ 247 HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ 248 249 } HAL_PCD_CallbackIDTypeDef; 250 /** 251 * @} 252 */ 253 254 /** @defgroup HAL_PCD_Callback_pointer_definition HAL USB OTG PCD Callback pointer definition 255 * @brief HAL USB OTG PCD Callback pointer definition 256 * @{ 257 */ 258 259 typedef void (*pPCD_CallbackTypeDef)(PCD_HandleTypeDef *hpcd); /*!< pointer to a common USB OTG PCD callback function */ 260 typedef void (*pPCD_DataOutStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data OUT Stage callback */ 261 typedef void (*pPCD_DataInStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data IN Stage callback */ 262 typedef void (*pPCD_IsoOutIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO OUT Incomplete callback */ 263 typedef void (*pPCD_IsoInIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO IN Incomplete callback */ 264 typedef void (*pPCD_LpmCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); /*!< pointer to USB OTG PCD LPM callback */ 265 typedef void (*pPCD_BcdCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); /*!< pointer to USB OTG PCD BCD callback */ 266 267 /** 268 * @} 269 */ 270 271 HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, 272 HAL_PCD_CallbackIDTypeDef CallbackID, 273 pPCD_CallbackTypeDef pCallback); 274 275 HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, 276 HAL_PCD_CallbackIDTypeDef CallbackID); 277 278 HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, 279 pPCD_DataOutStageCallbackTypeDef pCallback); 280 281 HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd); 282 283 HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, 284 pPCD_DataInStageCallbackTypeDef pCallback); 285 286 HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd); 287 288 HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, 289 pPCD_IsoOutIncpltCallbackTypeDef pCallback); 290 291 HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd); 292 293 HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, 294 pPCD_IsoInIncpltCallbackTypeDef pCallback); 295 296 HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd); 297 298 HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, 299 pPCD_BcdCallbackTypeDef pCallback); 300 301 HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd); 302 303 HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, 304 pPCD_LpmCallbackTypeDef pCallback); 305 306 HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd); 307 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ 308 /** 309 * @} 310 */ 311 312 /* I/O operation functions ***************************************************/ 313 /* Non-Blocking mode: Interrupt */ 314 /** @addtogroup PCD_Exported_Functions_Group2 Input and Output operation functions 315 * @{ 316 */ 317 HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd); 318 HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd); 319 void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd); 320 321 void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd); 322 void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd); 323 void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd); 324 void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd); 325 void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd); 326 void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd); 327 void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd); 328 329 void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); 330 void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); 331 void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); 332 void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); 333 /** 334 * @} 335 */ 336 337 /* Peripheral Control functions **********************************************/ 338 /** @addtogroup PCD_Exported_Functions_Group3 Peripheral Control functions 339 * @{ 340 */ 341 HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd); 342 HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd); 343 HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address); 344 HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, 345 uint16_t ep_mps, uint8_t ep_type); 346 347 HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); 348 HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, 349 uint8_t *pBuf, uint32_t len); 350 351 HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, 352 uint8_t *pBuf, uint32_t len); 353 354 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); 360 361 uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); 362 /** 363 * @} 364 */ 365 366 /* Peripheral State functions ************************************************/ 367 /** @addtogroup PCD_Exported_Functions_Group4 Peripheral State functions 368 * @{ 369 */ 370 PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd); 371 /** 372 * @} 373 */ 374 375 /** 376 * @} 377 */ 378 379 /* Private constants ---------------------------------------------------------*/ 380 /** @defgroup PCD_Private_Constants PCD Private Constants 381 * @{ 382 */ 383 /** 384 * @} 385 */ 386 387 #if defined (USB_OTG_FS) || defined (USB_OTG_HS) 388 #ifndef USB_OTG_DOEPINT_OTEPSPR 389 #define USB_OTG_DOEPINT_OTEPSPR (0x1UL << 5) /*!< Status Phase Received interrupt */ 390 #endif /* defined USB_OTG_DOEPINT_OTEPSPR */ 391 392 #ifndef USB_OTG_DOEPMSK_OTEPSPRM 393 #define USB_OTG_DOEPMSK_OTEPSPRM (0x1UL << 5) /*!< Setup Packet Received interrupt mask */ 394 #endif /* defined USB_OTG_DOEPMSK_OTEPSPRM */ 395 396 #ifndef USB_OTG_DOEPINT_NAK 397 #define USB_OTG_DOEPINT_NAK (0x1UL << 13) /*!< NAK interrupt */ 398 #endif /* defined USB_OTG_DOEPINT_NAK */ 399 400 #ifndef USB_OTG_DOEPMSK_NAKM 401 #define USB_OTG_DOEPMSK_NAKM (0x1UL << 13) /*!< OUT Packet NAK interrupt mask */ 402 #endif /* defined USB_OTG_DOEPMSK_NAKM */ 403 404 #ifndef USB_OTG_DOEPINT_STPKTRX 405 #define USB_OTG_DOEPINT_STPKTRX (0x1UL << 15) /*!< Setup Packet Received interrupt */ 406 #endif /* defined USB_OTG_DOEPINT_STPKTRX */ 407 408 #ifndef USB_OTG_DOEPMSK_NYETM 409 #define USB_OTG_DOEPMSK_NYETM (0x1UL << 14) /*!< Setup Packet Received interrupt mask */ 410 #endif /* defined USB_OTG_DOEPMSK_NYETM */ 411 #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ 412 413 /* Private macros ------------------------------------------------------------*/ 414 /** @defgroup PCD_Private_Macros PCD Private Macros 415 * @{ 416 */ 417 418 /** 419 * @} 420 */ 421 422 /** 423 * @} 424 */ 425 426 /** 427 * @} 428 */ 429 #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ 430 431 #ifdef __cplusplus 432 } 433 #endif 434 435 #endif /* STM32U5xx_HAL_PCD_H */ 436