STM32F439xx HAL User Manual
stm32f4xx_hal_pcd.h
Go to the documentation of this file.
00001 /**
00002   ******************************************************************************
00003   * @file    stm32f4xx_hal_pcd.h
00004   * @author  MCD Application Team
00005   * @brief   Header file of PCD HAL module.
00006   ******************************************************************************
00007   * @attention
00008   *
00009   * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
00010   *
00011   * Redistribution and use in source and binary forms, with or without modification,
00012   * are permitted provided that the following conditions are met:
00013   *   1. Redistributions of source code must retain the above copyright notice,
00014   *      this list of conditions and the following disclaimer.
00015   *   2. Redistributions in binary form must reproduce the above copyright notice,
00016   *      this list of conditions and the following disclaimer in the documentation
00017   *      and/or other materials provided with the distribution.
00018   *   3. Neither the name of STMicroelectronics nor the names of its contributors
00019   *      may be used to endorse or promote products derived from this software
00020   *      without specific prior written permission.
00021   *
00022   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00023   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00024   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00025   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00026   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00027   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00028   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00029   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00030   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00031   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00032   *
00033   ******************************************************************************
00034   */ 
00035 
00036 /* Define to prevent recursive inclusion -------------------------------------*/
00037 #ifndef __STM32F4xx_HAL_PCD_H
00038 #define __STM32F4xx_HAL_PCD_H
00039 
00040 #ifdef __cplusplus
00041  extern "C" {
00042 #endif
00043 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \
00044     defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
00045     defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \
00046     defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \
00047     defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx)
00048 /* Includes ------------------------------------------------------------------*/
00049 #include "stm32f4xx_ll_usb.h"
00050    
00051 /** @addtogroup STM32F4xx_HAL_Driver
00052   * @{
00053   */
00054 
00055 /** @addtogroup PCD
00056   * @{
00057   */ 
00058 
00059 /* Exported types ------------------------------------------------------------*/ 
00060 /** @defgroup PCD_Exported_Types PCD Exported Types
00061   * @{
00062   */
00063    
00064 /**
00065   * @brief  PCD State structure definition
00066   */
00067 typedef enum 
00068 {
00069   HAL_PCD_STATE_RESET   = 0x00U,
00070   HAL_PCD_STATE_READY   = 0x01U,
00071   HAL_PCD_STATE_ERROR   = 0x02U,
00072   HAL_PCD_STATE_BUSY    = 0x03U,
00073   HAL_PCD_STATE_TIMEOUT = 0x04U
00074 } PCD_StateTypeDef;
00075 
00076 #ifdef USB_OTG_GLPMCFG_LPMEN
00077 /* Device LPM suspend state */
00078 typedef enum  
00079 {
00080   LPM_L0 = 0x00U, /* on */
00081   LPM_L1 = 0x01U, /* LPM L1 sleep */
00082   LPM_L2 = 0x02U, /* suspend */
00083   LPM_L3 = 0x03U  /* off */
00084 }PCD_LPM_StateTypeDef;
00085 #endif /* USB_OTG_GLPMCFG_LPMEN */
00086 
00087 typedef USB_OTG_GlobalTypeDef  PCD_TypeDef;
00088 typedef USB_OTG_CfgTypeDef     PCD_InitTypeDef;
00089 typedef USB_OTG_EPTypeDef      PCD_EPTypeDef ;
00090 
00091 /** 
00092   * @brief  PCD Handle Structure definition  
00093   */ 
00094 typedef struct
00095 {
00096   PCD_TypeDef             *Instance;    /*!< Register base address              */
00097   PCD_InitTypeDef         Init;         /*!< PCD required parameters            */
00098   PCD_EPTypeDef           IN_ep[16U];   /*!< IN endpoint parameters             */
00099   PCD_EPTypeDef           OUT_ep[16U];  /*!< OUT endpoint parameters            */
00100   HAL_LockTypeDef         Lock;         /*!< PCD peripheral status              */
00101   __IO PCD_StateTypeDef   State;        /*!< PCD communication state            */
00102   uint32_t                Setup[12U];   /*!< Setup packet buffer                */
00103 #ifdef USB_OTG_GLPMCFG_LPMEN
00104   PCD_LPM_StateTypeDef    LPM_State;    /*!< LPM State                          */
00105   uint32_t                BESL;
00106   uint32_t                lpm_active;   /*!< Enable or disable the Link Power Management .
00107                                         This parameter can be set to ENABLE or DISABLE */
00108 #endif /* USB_OTG_GLPMCFG_LPMEN */
00109 #ifdef USB_OTG_GCCFG_BCDEN
00110   uint32_t battery_charging_active;     /*!< Enable or disable Battery charging.
00111                                         This parameter can be set to ENABLE or DISABLE */
00112 #endif /* USB_OTG_GCCFG_BCDEN */
00113   void                    *pData;       /*!< Pointer to upper stack Handler */
00114 } PCD_HandleTypeDef;
00115 
00116 /**
00117   * @}
00118   */
00119 
00120 /* Include PCD HAL Extension module */
00121 #include "stm32f4xx_hal_pcd_ex.h"
00122 
00123 /* Exported constants --------------------------------------------------------*/
00124 /** @defgroup PCD_Exported_Constants PCD Exported Constants
00125   * @{
00126   */
00127 
00128 /** @defgroup PCD_Speed PCD Speed
00129   * @{
00130   */
00131 #define PCD_SPEED_HIGH               0U
00132 #define PCD_SPEED_HIGH_IN_FULL       1U
00133 #define PCD_SPEED_FULL               2U
00134 /**
00135   * @}
00136   */
00137   
00138 /** @defgroup PCD_PHY_Module PCD PHY Module
00139   * @{
00140   */
00141 #define PCD_PHY_ULPI                 1U
00142 #define PCD_PHY_EMBEDDED             2U
00143 /**
00144   * @}
00145   */
00146   
00147 /** @defgroup PCD_Turnaround_Timeout Turnaround Timeout Value
00148   * @{
00149   */
00150 #ifndef USBD_HS_TRDT_VALUE
00151  #define USBD_HS_TRDT_VALUE           9U
00152 #endif /* USBD_HS_TRDT_VALUE */
00153 #ifndef USBD_FS_TRDT_VALUE
00154  #define USBD_FS_TRDT_VALUE           5U
00155 #endif /* USBD_FS_TRDT_VALUE */
00156 /**
00157   * @}
00158   */
00159 
00160 /**
00161   * @}
00162   */
00163 
00164 /* Exported macros -----------------------------------------------------------*/
00165 /** @defgroup PCD_Exported_Macros PCD Exported Macros
00166  *  @brief macros to handle interrupts and specific clock configurations
00167  * @{
00168  */
00169 #define __HAL_PCD_ENABLE(__HANDLE__)                   USB_EnableGlobalInt ((__HANDLE__)->Instance)
00170 #define __HAL_PCD_DISABLE(__HANDLE__)                  USB_DisableGlobalInt ((__HANDLE__)->Instance)
00171 
00172 #define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__)      ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__))
00173 #define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__)    (((__HANDLE__)->Instance->GINTSTS) &= (__INTERRUPT__))
00174 #define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__)         (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U)
00175 
00176 #define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__)             *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= \
00177                                                            ~(USB_OTG_PCGCCTL_STOPCLK)
00178 
00179 #define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__)               *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK
00180 
00181 #define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__)            ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE))&0x10U)
00182 
00183 #define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE                0x08U 
00184 #define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE               0x0CU 
00185 #define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE        0x10U 
00186 
00187 #define USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE                0x08U 
00188 #define USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE               0x0CU 
00189 #define USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE        0x10U 
00190 
00191 #define USB_OTG_HS_WAKEUP_EXTI_LINE              0x00100000U  /*!< External interrupt line 20 Connected to the USB HS EXTI Line */
00192 #define USB_OTG_FS_WAKEUP_EXTI_LINE              0x00040000U  /*!< External interrupt line 18 Connected to the USB FS EXTI Line */
00193 
00194 #define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT()    EXTI->IMR |= (USB_OTG_HS_WAKEUP_EXTI_LINE)
00195 #define __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT()   EXTI->IMR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE)
00196 #define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG()     EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE)
00197 #define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG()   EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE)
00198 
00199 #define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() do{EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\
00200                                                              EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE;\
00201                                                             }while(0U)
00202 
00203 #define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_FALLING_EDGE() do{EXTI->FTSR |= (USB_OTG_HS_WAKEUP_EXTI_LINE);\
00204                                                               EXTI->RTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\
00205                                                              }while(0U) 
00206 
00207 #define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE() do{EXTI->RTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\
00208                                                                      EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\
00209                                                                      EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE;\
00210                                                                      EXTI->FTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE;\
00211                                                                     }while(0U)
00212 
00213 #define __HAL_USB_OTG_HS_WAKEUP_EXTI_GENERATE_SWIT()   (EXTI->SWIER |= USB_OTG_FS_WAKEUP_EXTI_LINE) 
00214 
00215 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT()    EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE
00216 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT()   EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE)
00217 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG()     EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE)
00218 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG()   EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE
00219 
00220 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() do{EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\
00221                                                              EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE;\
00222                                                             }while(0U)  
00223 
00224 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_FALLING_EDGE()  do{EXTI->FTSR |= (USB_OTG_FS_WAKEUP_EXTI_LINE);\
00225                                                                EXTI->RTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\
00226                                                               }while(0U)
00227 
00228 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE()  do{EXTI->RTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\
00229                                                                       EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\
00230                                                                       EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE;\
00231                                                                       EXTI->FTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE;\
00232                                                                      }while(0U) 
00233 
00234 #define __HAL_USB_OTG_FS_WAKEUP_EXTI_GENERATE_SWIT()  (EXTI->SWIER |= USB_OTG_FS_WAKEUP_EXTI_LINE)
00235 /**
00236   * @}
00237   */ 
00238 
00239 /* Exported functions --------------------------------------------------------*/
00240 /** @addtogroup PCD_Exported_Functions PCD Exported Functions
00241   * @{
00242   */
00243 
00244 /* Initialization/de-initialization functions  ********************************/
00245 /** @addtogroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions
00246   * @{
00247   */
00248 HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd);
00249 HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd);
00250 void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd);
00251 void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd);
00252 /**
00253   * @}
00254   */
00255 
00256 /* I/O operation functions  ***************************************************/
00257 /* Non-Blocking mode: Interrupt */
00258 /** @addtogroup PCD_Exported_Functions_Group2 Input and Output operation functions
00259   * @{
00260   */
00261 /* Non-Blocking mode: Interrupt */
00262 HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd);
00263 HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd);
00264 void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd);
00265 
00266 void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);
00267 void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);
00268 void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd);
00269 void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd);
00270 void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd);
00271 void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd);
00272 void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd);
00273 void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);
00274 void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);
00275 void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd);
00276 void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd);
00277 /**
00278   * @}
00279   */
00280 
00281 /* Peripheral Control functions  **********************************************/
00282 /** @addtogroup PCD_Exported_Functions_Group3 Peripheral Control functions
00283   * @{
00284   */
00285 HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd);
00286 HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd);
00287 HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address);
00288 HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type);
00289 HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
00290 HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len);
00291 HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len);
00292 uint16_t          HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
00293 HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
00294 HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
00295 HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
00296 HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd);
00297 HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd);
00298 /**
00299   * @}
00300   */
00301 
00302 /* Peripheral State functions  ************************************************/
00303 /** @addtogroup PCD_Exported_Functions_Group4 Peripheral State functions
00304   * @{
00305   */
00306 PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd);
00307 /**
00308   * @}
00309   */ 
00310 
00311 /**
00312   * @}
00313   */
00314  
00315 /* Private macros ------------------------------------------------------------*/
00316 /** @defgroup PCD_Private_Macros PCD Private Macros
00317  * @{
00318  */
00319 
00320 /**
00321   * @}
00322   */ 
00323 
00324 /**
00325   * @}
00326   */ 
00327 
00328 /**
00329   * @}
00330   */ 
00331 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx ||
00332           STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Rx ||
00333           STM32F412Vx || STM32F412Cx || STM32F413xx || STM32F423xx */
00334 #ifdef __cplusplus
00335 }
00336 #endif
00337 
00338 
00339 #endif /* __STM32F4xx_HAL_PCD_H */
00340 
00341 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/