inport from local

Dependents:   Hobbyking_Cheetah_0511

Committer:
NYX
Date:
Mon Mar 16 06:35:48 2020 +0000
Revision:
0:85b3fd62ea1a
reinport to mbed;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NYX 0:85b3fd62ea1a 1 /**
NYX 0:85b3fd62ea1a 2 ******************************************************************************
NYX 0:85b3fd62ea1a 3 * @file stm32f4xx_hal_pcd.c
NYX 0:85b3fd62ea1a 4 * @author MCD Application Team
NYX 0:85b3fd62ea1a 5 * @version V1.7.1
NYX 0:85b3fd62ea1a 6 * @date 14-April-2017
NYX 0:85b3fd62ea1a 7 * @brief PCD HAL module driver.
NYX 0:85b3fd62ea1a 8 * This file provides firmware functions to manage the following
NYX 0:85b3fd62ea1a 9 * functionalities of the USB Peripheral Controller:
NYX 0:85b3fd62ea1a 10 * + Initialization and de-initialization functions
NYX 0:85b3fd62ea1a 11 * + IO operation functions
NYX 0:85b3fd62ea1a 12 * + Peripheral Control functions
NYX 0:85b3fd62ea1a 13 * + Peripheral State functions
NYX 0:85b3fd62ea1a 14 *
NYX 0:85b3fd62ea1a 15 @verbatim
NYX 0:85b3fd62ea1a 16 ==============================================================================
NYX 0:85b3fd62ea1a 17 ##### How to use this driver #####
NYX 0:85b3fd62ea1a 18 ==============================================================================
NYX 0:85b3fd62ea1a 19 [..]
NYX 0:85b3fd62ea1a 20 The PCD HAL driver can be used as follows:
NYX 0:85b3fd62ea1a 21
NYX 0:85b3fd62ea1a 22 (#) Declare a PCD_HandleTypeDef handle structure, for example:
NYX 0:85b3fd62ea1a 23 PCD_HandleTypeDef hpcd;
NYX 0:85b3fd62ea1a 24
NYX 0:85b3fd62ea1a 25 (#) Fill parameters of Init structure in HCD handle
NYX 0:85b3fd62ea1a 26
NYX 0:85b3fd62ea1a 27 (#) Call HAL_PCD_Init() API to initialize the PCD peripheral (Core, Device core, ...)
NYX 0:85b3fd62ea1a 28
NYX 0:85b3fd62ea1a 29 (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API:
NYX 0:85b3fd62ea1a 30 (##) Enable the PCD/USB Low Level interface clock using
NYX 0:85b3fd62ea1a 31 (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
NYX 0:85b3fd62ea1a 32 (+++) __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); (For High Speed Mode)
NYX 0:85b3fd62ea1a 33
NYX 0:85b3fd62ea1a 34 (##) Initialize the related GPIO clocks
NYX 0:85b3fd62ea1a 35 (##) Configure PCD pin-out
NYX 0:85b3fd62ea1a 36 (##) Configure PCD NVIC interrupt
NYX 0:85b3fd62ea1a 37
NYX 0:85b3fd62ea1a 38 (#)Associate the Upper USB device stack to the HAL PCD Driver:
NYX 0:85b3fd62ea1a 39 (##) hpcd.pData = pdev;
NYX 0:85b3fd62ea1a 40
NYX 0:85b3fd62ea1a 41 (#)Enable PCD transmission and reception:
NYX 0:85b3fd62ea1a 42 (##) HAL_PCD_Start();
NYX 0:85b3fd62ea1a 43
NYX 0:85b3fd62ea1a 44 @endverbatim
NYX 0:85b3fd62ea1a 45 ******************************************************************************
NYX 0:85b3fd62ea1a 46 * @attention
NYX 0:85b3fd62ea1a 47 *
NYX 0:85b3fd62ea1a 48 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
NYX 0:85b3fd62ea1a 49 *
NYX 0:85b3fd62ea1a 50 * Redistribution and use in source and binary forms, with or without modification,
NYX 0:85b3fd62ea1a 51 * are permitted provided that the following conditions are met:
NYX 0:85b3fd62ea1a 52 * 1. Redistributions of source code must retain the above copyright notice,
NYX 0:85b3fd62ea1a 53 * this list of conditions and the following disclaimer.
NYX 0:85b3fd62ea1a 54 * 2. Redistributions in binary form must reproduce the above copyright notice,
NYX 0:85b3fd62ea1a 55 * this list of conditions and the following disclaimer in the documentation
NYX 0:85b3fd62ea1a 56 * and/or other materials provided with the distribution.
NYX 0:85b3fd62ea1a 57 * 3. Neither the name of STMicroelectronics nor the names of its contributors
NYX 0:85b3fd62ea1a 58 * may be used to endorse or promote products derived from this software
NYX 0:85b3fd62ea1a 59 * without specific prior written permission.
NYX 0:85b3fd62ea1a 60 *
NYX 0:85b3fd62ea1a 61 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
NYX 0:85b3fd62ea1a 62 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
NYX 0:85b3fd62ea1a 63 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
NYX 0:85b3fd62ea1a 64 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
NYX 0:85b3fd62ea1a 65 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
NYX 0:85b3fd62ea1a 66 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
NYX 0:85b3fd62ea1a 67 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
NYX 0:85b3fd62ea1a 68 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
NYX 0:85b3fd62ea1a 69 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
NYX 0:85b3fd62ea1a 70 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NYX 0:85b3fd62ea1a 71 *
NYX 0:85b3fd62ea1a 72 ******************************************************************************
NYX 0:85b3fd62ea1a 73 */
NYX 0:85b3fd62ea1a 74
NYX 0:85b3fd62ea1a 75 /* Includes ------------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 76 #include "stm32f4xx_hal.h"
NYX 0:85b3fd62ea1a 77
NYX 0:85b3fd62ea1a 78 /** @addtogroup STM32F4xx_HAL_Driver
NYX 0:85b3fd62ea1a 79 * @{
NYX 0:85b3fd62ea1a 80 */
NYX 0:85b3fd62ea1a 81
NYX 0:85b3fd62ea1a 82 /** @defgroup PCD PCD
NYX 0:85b3fd62ea1a 83 * @brief PCD HAL module driver
NYX 0:85b3fd62ea1a 84 * @{
NYX 0:85b3fd62ea1a 85 */
NYX 0:85b3fd62ea1a 86
NYX 0:85b3fd62ea1a 87 #ifdef HAL_PCD_MODULE_ENABLED
NYX 0:85b3fd62ea1a 88 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \
NYX 0:85b3fd62ea1a 89 defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
NYX 0:85b3fd62ea1a 90 defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \
NYX 0:85b3fd62ea1a 91 defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \
NYX 0:85b3fd62ea1a 92 defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx)
NYX 0:85b3fd62ea1a 93 /* Private types -------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 94 /* Private variables ---------------------------------------------------------*/
NYX 0:85b3fd62ea1a 95 /* Private constants ---------------------------------------------------------*/
NYX 0:85b3fd62ea1a 96 /* Private macros ------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 97 /** @defgroup PCD_Private_Macros PCD Private Macros
NYX 0:85b3fd62ea1a 98 * @{
NYX 0:85b3fd62ea1a 99 */
NYX 0:85b3fd62ea1a 100 #define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b))
NYX 0:85b3fd62ea1a 101 #define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b))
NYX 0:85b3fd62ea1a 102 /**
NYX 0:85b3fd62ea1a 103 * @}
NYX 0:85b3fd62ea1a 104 */
NYX 0:85b3fd62ea1a 105
NYX 0:85b3fd62ea1a 106 /* Private functions prototypes ----------------------------------------------*/
NYX 0:85b3fd62ea1a 107 /** @defgroup PCD_Private_Functions PCD Private Functions
NYX 0:85b3fd62ea1a 108 * @{
NYX 0:85b3fd62ea1a 109 */
NYX 0:85b3fd62ea1a 110 static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum);
NYX 0:85b3fd62ea1a 111 /**
NYX 0:85b3fd62ea1a 112 * @}
NYX 0:85b3fd62ea1a 113 */
NYX 0:85b3fd62ea1a 114
NYX 0:85b3fd62ea1a 115 /* Exported functions --------------------------------------------------------*/
NYX 0:85b3fd62ea1a 116 /** @defgroup PCD_Exported_Functions PCD Exported Functions
NYX 0:85b3fd62ea1a 117 * @{
NYX 0:85b3fd62ea1a 118 */
NYX 0:85b3fd62ea1a 119
NYX 0:85b3fd62ea1a 120 /** @defgroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions
NYX 0:85b3fd62ea1a 121 * @brief Initialization and Configuration functions
NYX 0:85b3fd62ea1a 122 *
NYX 0:85b3fd62ea1a 123 @verbatim
NYX 0:85b3fd62ea1a 124 ===============================================================================
NYX 0:85b3fd62ea1a 125 ##### Initialization and de-initialization functions #####
NYX 0:85b3fd62ea1a 126 ===============================================================================
NYX 0:85b3fd62ea1a 127 [..] This section provides functions allowing to:
NYX 0:85b3fd62ea1a 128
NYX 0:85b3fd62ea1a 129 @endverbatim
NYX 0:85b3fd62ea1a 130 * @{
NYX 0:85b3fd62ea1a 131 */
NYX 0:85b3fd62ea1a 132
NYX 0:85b3fd62ea1a 133 /**
NYX 0:85b3fd62ea1a 134 * @brief Initializes the PCD according to the specified
NYX 0:85b3fd62ea1a 135 * parameters in the PCD_InitTypeDef and initialize the associated handle.
NYX 0:85b3fd62ea1a 136 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 137 * @retval HAL status
NYX 0:85b3fd62ea1a 138 */
NYX 0:85b3fd62ea1a 139 HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 140 {
NYX 0:85b3fd62ea1a 141 uint32_t i = 0U;
NYX 0:85b3fd62ea1a 142
NYX 0:85b3fd62ea1a 143 /* Check the PCD handle allocation */
NYX 0:85b3fd62ea1a 144 if(hpcd == NULL)
NYX 0:85b3fd62ea1a 145 {
NYX 0:85b3fd62ea1a 146 return HAL_ERROR;
NYX 0:85b3fd62ea1a 147 }
NYX 0:85b3fd62ea1a 148
NYX 0:85b3fd62ea1a 149 /* Check the parameters */
NYX 0:85b3fd62ea1a 150 assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance));
NYX 0:85b3fd62ea1a 151 if(hpcd->State == HAL_PCD_STATE_RESET)
NYX 0:85b3fd62ea1a 152 {
NYX 0:85b3fd62ea1a 153 /* Allocate lock resource and initialize it */
NYX 0:85b3fd62ea1a 154 hpcd->Lock = HAL_UNLOCKED;
NYX 0:85b3fd62ea1a 155 for (i = 0; i < hpcd->Init.dev_endpoints ; i++)
NYX 0:85b3fd62ea1a 156 hpcd->EPLock[i].Lock = HAL_UNLOCKED;
NYX 0:85b3fd62ea1a 157 /* Init the low level hardware : GPIO, CLOCK, NVIC... */
NYX 0:85b3fd62ea1a 158 HAL_PCD_MspInit(hpcd);
NYX 0:85b3fd62ea1a 159 }
NYX 0:85b3fd62ea1a 160
NYX 0:85b3fd62ea1a 161 hpcd->State = HAL_PCD_STATE_BUSY;
NYX 0:85b3fd62ea1a 162
NYX 0:85b3fd62ea1a 163 /* Disable the Interrupts */
NYX 0:85b3fd62ea1a 164 __HAL_PCD_DISABLE(hpcd);
NYX 0:85b3fd62ea1a 165
NYX 0:85b3fd62ea1a 166 /*Init the Core (common init.) */
NYX 0:85b3fd62ea1a 167 USB_CoreInit(hpcd->Instance, hpcd->Init);
NYX 0:85b3fd62ea1a 168
NYX 0:85b3fd62ea1a 169 /* Force Device Mode*/
NYX 0:85b3fd62ea1a 170 USB_SetCurrentMode(hpcd->Instance , USB_OTG_DEVICE_MODE);
NYX 0:85b3fd62ea1a 171
NYX 0:85b3fd62ea1a 172 /* Init endpoints structures */
NYX 0:85b3fd62ea1a 173 for (i = 0U; i < 15U; i++)
NYX 0:85b3fd62ea1a 174 {
NYX 0:85b3fd62ea1a 175 /* Init ep structure */
NYX 0:85b3fd62ea1a 176 hpcd->IN_ep[i].is_in = 1U;
NYX 0:85b3fd62ea1a 177 hpcd->IN_ep[i].num = i;
NYX 0:85b3fd62ea1a 178 hpcd->IN_ep[i].tx_fifo_num = i;
NYX 0:85b3fd62ea1a 179 /* Control until ep is activated */
NYX 0:85b3fd62ea1a 180 hpcd->IN_ep[i].type = EP_TYPE_CTRL;
NYX 0:85b3fd62ea1a 181 hpcd->IN_ep[i].maxpacket = 0U;
NYX 0:85b3fd62ea1a 182 hpcd->IN_ep[i].xfer_buff = 0U;
NYX 0:85b3fd62ea1a 183 hpcd->IN_ep[i].xfer_len = 0U;
NYX 0:85b3fd62ea1a 184 }
NYX 0:85b3fd62ea1a 185
NYX 0:85b3fd62ea1a 186 for (i = 0U; i < 15U; i++)
NYX 0:85b3fd62ea1a 187 {
NYX 0:85b3fd62ea1a 188 hpcd->OUT_ep[i].is_in = 0U;
NYX 0:85b3fd62ea1a 189 hpcd->OUT_ep[i].num = i;
NYX 0:85b3fd62ea1a 190 hpcd->IN_ep[i].tx_fifo_num = i;
NYX 0:85b3fd62ea1a 191 /* Control until ep is activated */
NYX 0:85b3fd62ea1a 192 hpcd->OUT_ep[i].type = EP_TYPE_CTRL;
NYX 0:85b3fd62ea1a 193 hpcd->OUT_ep[i].maxpacket = 0U;
NYX 0:85b3fd62ea1a 194 hpcd->OUT_ep[i].xfer_buff = 0U;
NYX 0:85b3fd62ea1a 195 hpcd->OUT_ep[i].xfer_len = 0U;
NYX 0:85b3fd62ea1a 196
NYX 0:85b3fd62ea1a 197 hpcd->Instance->DIEPTXF[i] = 0U;
NYX 0:85b3fd62ea1a 198 }
NYX 0:85b3fd62ea1a 199 /* Init Device */
NYX 0:85b3fd62ea1a 200 USB_DevInit(hpcd->Instance, hpcd->Init);
NYX 0:85b3fd62ea1a 201
NYX 0:85b3fd62ea1a 202 hpcd->State= HAL_PCD_STATE_READY;
NYX 0:85b3fd62ea1a 203
NYX 0:85b3fd62ea1a 204 #ifdef USB_OTG_GLPMCFG_LPMEN
NYX 0:85b3fd62ea1a 205 /* Activate LPM */
NYX 0:85b3fd62ea1a 206 if (hpcd->Init.lpm_enable == 1U)
NYX 0:85b3fd62ea1a 207 {
NYX 0:85b3fd62ea1a 208 HAL_PCDEx_ActivateLPM(hpcd);
NYX 0:85b3fd62ea1a 209 }
NYX 0:85b3fd62ea1a 210 #endif /* USB_OTG_GLPMCFG_LPMEN */
NYX 0:85b3fd62ea1a 211
NYX 0:85b3fd62ea1a 212 #ifdef USB_OTG_GCCFG_BCDEN
NYX 0:85b3fd62ea1a 213 /* Activate Battery charging */
NYX 0:85b3fd62ea1a 214 if (hpcd->Init.battery_charging_enable == 1U)
NYX 0:85b3fd62ea1a 215 {
NYX 0:85b3fd62ea1a 216 HAL_PCDEx_ActivateBCD(hpcd);
NYX 0:85b3fd62ea1a 217 }
NYX 0:85b3fd62ea1a 218 #endif /* USB_OTG_GCCFG_BCDEN */
NYX 0:85b3fd62ea1a 219
NYX 0:85b3fd62ea1a 220 USB_DevDisconnect (hpcd->Instance);
NYX 0:85b3fd62ea1a 221 return HAL_OK;
NYX 0:85b3fd62ea1a 222 }
NYX 0:85b3fd62ea1a 223
NYX 0:85b3fd62ea1a 224 /**
NYX 0:85b3fd62ea1a 225 * @brief DeInitializes the PCD peripheral.
NYX 0:85b3fd62ea1a 226 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 227 * @retval HAL status
NYX 0:85b3fd62ea1a 228 */
NYX 0:85b3fd62ea1a 229 HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 230 {
NYX 0:85b3fd62ea1a 231 /* Check the PCD handle allocation */
NYX 0:85b3fd62ea1a 232 if(hpcd == NULL)
NYX 0:85b3fd62ea1a 233 {
NYX 0:85b3fd62ea1a 234 return HAL_ERROR;
NYX 0:85b3fd62ea1a 235 }
NYX 0:85b3fd62ea1a 236
NYX 0:85b3fd62ea1a 237 hpcd->State = HAL_PCD_STATE_BUSY;
NYX 0:85b3fd62ea1a 238
NYX 0:85b3fd62ea1a 239 /* Stop Device */
NYX 0:85b3fd62ea1a 240 HAL_PCD_Stop(hpcd);
NYX 0:85b3fd62ea1a 241
NYX 0:85b3fd62ea1a 242 /* DeInit the low level hardware */
NYX 0:85b3fd62ea1a 243 HAL_PCD_MspDeInit(hpcd);
NYX 0:85b3fd62ea1a 244
NYX 0:85b3fd62ea1a 245 hpcd->State = HAL_PCD_STATE_RESET;
NYX 0:85b3fd62ea1a 246
NYX 0:85b3fd62ea1a 247 return HAL_OK;
NYX 0:85b3fd62ea1a 248 }
NYX 0:85b3fd62ea1a 249
NYX 0:85b3fd62ea1a 250 /**
NYX 0:85b3fd62ea1a 251 * @brief Initializes the PCD MSP.
NYX 0:85b3fd62ea1a 252 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 253 * @retval None
NYX 0:85b3fd62ea1a 254 */
NYX 0:85b3fd62ea1a 255 __weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 256 {
NYX 0:85b3fd62ea1a 257 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 258 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 259 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 260 the HAL_PCD_MspInit could be implemented in the user file
NYX 0:85b3fd62ea1a 261 */
NYX 0:85b3fd62ea1a 262 }
NYX 0:85b3fd62ea1a 263
NYX 0:85b3fd62ea1a 264 /**
NYX 0:85b3fd62ea1a 265 * @brief DeInitializes PCD MSP.
NYX 0:85b3fd62ea1a 266 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 267 * @retval None
NYX 0:85b3fd62ea1a 268 */
NYX 0:85b3fd62ea1a 269 __weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 270 {
NYX 0:85b3fd62ea1a 271 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 272 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 273 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 274 the HAL_PCD_MspDeInit could be implemented in the user file
NYX 0:85b3fd62ea1a 275 */
NYX 0:85b3fd62ea1a 276 }
NYX 0:85b3fd62ea1a 277
NYX 0:85b3fd62ea1a 278 /**
NYX 0:85b3fd62ea1a 279 * @}
NYX 0:85b3fd62ea1a 280 */
NYX 0:85b3fd62ea1a 281
NYX 0:85b3fd62ea1a 282 /** @defgroup PCD_Exported_Functions_Group2 Input and Output operation functions
NYX 0:85b3fd62ea1a 283 * @brief Data transfers functions
NYX 0:85b3fd62ea1a 284 *
NYX 0:85b3fd62ea1a 285 @verbatim
NYX 0:85b3fd62ea1a 286 ===============================================================================
NYX 0:85b3fd62ea1a 287 ##### IO operation functions #####
NYX 0:85b3fd62ea1a 288 ===============================================================================
NYX 0:85b3fd62ea1a 289 [..]
NYX 0:85b3fd62ea1a 290 This subsection provides a set of functions allowing to manage the PCD data
NYX 0:85b3fd62ea1a 291 transfers.
NYX 0:85b3fd62ea1a 292
NYX 0:85b3fd62ea1a 293 @endverbatim
NYX 0:85b3fd62ea1a 294 * @{
NYX 0:85b3fd62ea1a 295 */
NYX 0:85b3fd62ea1a 296
NYX 0:85b3fd62ea1a 297 /**
NYX 0:85b3fd62ea1a 298 * @brief Start The USB OTG Device.
NYX 0:85b3fd62ea1a 299 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 300 * @retval HAL status
NYX 0:85b3fd62ea1a 301 */
NYX 0:85b3fd62ea1a 302 HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 303 {
NYX 0:85b3fd62ea1a 304 //__HAL_LOCK(hpcd);
NYX 0:85b3fd62ea1a 305 USB_DevConnect (hpcd->Instance);
NYX 0:85b3fd62ea1a 306 __HAL_PCD_ENABLE(hpcd);
NYX 0:85b3fd62ea1a 307 //__HAL_UNLOCK(hpcd);
NYX 0:85b3fd62ea1a 308 return HAL_OK;
NYX 0:85b3fd62ea1a 309 }
NYX 0:85b3fd62ea1a 310
NYX 0:85b3fd62ea1a 311 /**
NYX 0:85b3fd62ea1a 312 * @brief Stop The USB OTG Device.
NYX 0:85b3fd62ea1a 313 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 314 * @retval HAL status
NYX 0:85b3fd62ea1a 315 */
NYX 0:85b3fd62ea1a 316 HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 317 {
NYX 0:85b3fd62ea1a 318 //__HAL_LOCK(hpcd);
NYX 0:85b3fd62ea1a 319 __HAL_PCD_DISABLE(hpcd);
NYX 0:85b3fd62ea1a 320 USB_StopDevice(hpcd->Instance);
NYX 0:85b3fd62ea1a 321 USB_DevDisconnect(hpcd->Instance);
NYX 0:85b3fd62ea1a 322 //__HAL_UNLOCK(hpcd);
NYX 0:85b3fd62ea1a 323 return HAL_OK;
NYX 0:85b3fd62ea1a 324 }
NYX 0:85b3fd62ea1a 325
NYX 0:85b3fd62ea1a 326 /**
NYX 0:85b3fd62ea1a 327 * @brief Handles PCD interrupt request.
NYX 0:85b3fd62ea1a 328 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 329 * @retval HAL status
NYX 0:85b3fd62ea1a 330 */
NYX 0:85b3fd62ea1a 331 void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 332 {
NYX 0:85b3fd62ea1a 333 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
NYX 0:85b3fd62ea1a 334 uint32_t i = 0U, ep_intr = 0U, epint = 0U, epnum = 0U;
NYX 0:85b3fd62ea1a 335 uint32_t fifoemptymsk = 0U, temp = 0U;
NYX 0:85b3fd62ea1a 336 USB_OTG_EPTypeDef *ep;
NYX 0:85b3fd62ea1a 337 uint32_t hclk = 180000000U;
NYX 0:85b3fd62ea1a 338
NYX 0:85b3fd62ea1a 339 /* ensure that we are in device mode */
NYX 0:85b3fd62ea1a 340 if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE)
NYX 0:85b3fd62ea1a 341 {
NYX 0:85b3fd62ea1a 342 /* avoid spurious interrupt */
NYX 0:85b3fd62ea1a 343 if(__HAL_PCD_IS_INVALID_INTERRUPT(hpcd))
NYX 0:85b3fd62ea1a 344 {
NYX 0:85b3fd62ea1a 345 return;
NYX 0:85b3fd62ea1a 346 }
NYX 0:85b3fd62ea1a 347
NYX 0:85b3fd62ea1a 348 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS))
NYX 0:85b3fd62ea1a 349 {
NYX 0:85b3fd62ea1a 350 /* incorrect mode, acknowledge the interrupt */
NYX 0:85b3fd62ea1a 351 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS);
NYX 0:85b3fd62ea1a 352 }
NYX 0:85b3fd62ea1a 353
NYX 0:85b3fd62ea1a 354 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT))
NYX 0:85b3fd62ea1a 355 {
NYX 0:85b3fd62ea1a 356 epnum = 0U;
NYX 0:85b3fd62ea1a 357
NYX 0:85b3fd62ea1a 358 /* Read in the device interrupt bits */
NYX 0:85b3fd62ea1a 359 ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance);
NYX 0:85b3fd62ea1a 360
NYX 0:85b3fd62ea1a 361 while ( ep_intr )
NYX 0:85b3fd62ea1a 362 {
NYX 0:85b3fd62ea1a 363 if (ep_intr & 0x1U)
NYX 0:85b3fd62ea1a 364 {
NYX 0:85b3fd62ea1a 365 epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, epnum);
NYX 0:85b3fd62ea1a 366
NYX 0:85b3fd62ea1a 367 if(( epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC)
NYX 0:85b3fd62ea1a 368 {
NYX 0:85b3fd62ea1a 369 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC);
NYX 0:85b3fd62ea1a 370
NYX 0:85b3fd62ea1a 371 if(hpcd->Init.dma_enable == 1U)
NYX 0:85b3fd62ea1a 372 {
NYX 0:85b3fd62ea1a 373 hpcd->OUT_ep[epnum].xfer_count = hpcd->OUT_ep[epnum].maxpacket- (USBx_OUTEP(epnum)->DOEPTSIZ & USB_OTG_DOEPTSIZ_XFRSIZ);
NYX 0:85b3fd62ea1a 374 hpcd->OUT_ep[epnum].xfer_buff += hpcd->OUT_ep[epnum].maxpacket;
NYX 0:85b3fd62ea1a 375 }
NYX 0:85b3fd62ea1a 376
NYX 0:85b3fd62ea1a 377 HAL_PCD_DataOutStageCallback(hpcd, epnum);
NYX 0:85b3fd62ea1a 378 if(hpcd->Init.dma_enable == 1U)
NYX 0:85b3fd62ea1a 379 {
NYX 0:85b3fd62ea1a 380 if((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U))
NYX 0:85b3fd62ea1a 381 {
NYX 0:85b3fd62ea1a 382 /* this is ZLP, so prepare EP0 for next setup */
NYX 0:85b3fd62ea1a 383 USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
NYX 0:85b3fd62ea1a 384 }
NYX 0:85b3fd62ea1a 385 }
NYX 0:85b3fd62ea1a 386 }
NYX 0:85b3fd62ea1a 387
NYX 0:85b3fd62ea1a 388 if(( epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP)
NYX 0:85b3fd62ea1a 389 {
NYX 0:85b3fd62ea1a 390 /* Inform the upper layer that a setup packet is available */
NYX 0:85b3fd62ea1a 391 HAL_PCD_SetupStageCallback(hpcd);
NYX 0:85b3fd62ea1a 392 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP);
NYX 0:85b3fd62ea1a 393 }
NYX 0:85b3fd62ea1a 394
NYX 0:85b3fd62ea1a 395 if(( epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS)
NYX 0:85b3fd62ea1a 396 {
NYX 0:85b3fd62ea1a 397 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS);
NYX 0:85b3fd62ea1a 398 }
NYX 0:85b3fd62ea1a 399
NYX 0:85b3fd62ea1a 400 #ifdef USB_OTG_DOEPINT_OTEPSPR
NYX 0:85b3fd62ea1a 401 /* Clear Status Phase Received interrupt */
NYX 0:85b3fd62ea1a 402 if(( epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR)
NYX 0:85b3fd62ea1a 403 {
NYX 0:85b3fd62ea1a 404 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);
NYX 0:85b3fd62ea1a 405 }
NYX 0:85b3fd62ea1a 406 #endif /* USB_OTG_DOEPINT_OTEPSPR */
NYX 0:85b3fd62ea1a 407 }
NYX 0:85b3fd62ea1a 408 epnum++;
NYX 0:85b3fd62ea1a 409 ep_intr >>= 1U;
NYX 0:85b3fd62ea1a 410 }
NYX 0:85b3fd62ea1a 411 }
NYX 0:85b3fd62ea1a 412
NYX 0:85b3fd62ea1a 413 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT))
NYX 0:85b3fd62ea1a 414 {
NYX 0:85b3fd62ea1a 415 /* Read in the device interrupt bits */
NYX 0:85b3fd62ea1a 416 ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance);
NYX 0:85b3fd62ea1a 417
NYX 0:85b3fd62ea1a 418 epnum = 0U;
NYX 0:85b3fd62ea1a 419
NYX 0:85b3fd62ea1a 420 while ( ep_intr )
NYX 0:85b3fd62ea1a 421 {
NYX 0:85b3fd62ea1a 422 if (ep_intr & 0x1U) /* In ITR */
NYX 0:85b3fd62ea1a 423 {
NYX 0:85b3fd62ea1a 424 epint = USB_ReadDevInEPInterrupt(hpcd->Instance, epnum);
NYX 0:85b3fd62ea1a 425
NYX 0:85b3fd62ea1a 426 if(( epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC)
NYX 0:85b3fd62ea1a 427 {
NYX 0:85b3fd62ea1a 428 fifoemptymsk = 0x1U << epnum;
NYX 0:85b3fd62ea1a 429
NYX 0:85b3fd62ea1a 430 atomic_clr_u32(&USBx_DEVICE->DIEPEMPMSK,fifoemptymsk);
NYX 0:85b3fd62ea1a 431
NYX 0:85b3fd62ea1a 432 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC);
NYX 0:85b3fd62ea1a 433
NYX 0:85b3fd62ea1a 434 if (hpcd->Init.dma_enable == 1U)
NYX 0:85b3fd62ea1a 435 {
NYX 0:85b3fd62ea1a 436 hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket;
NYX 0:85b3fd62ea1a 437 }
NYX 0:85b3fd62ea1a 438
NYX 0:85b3fd62ea1a 439 HAL_PCD_DataInStageCallback(hpcd, epnum);
NYX 0:85b3fd62ea1a 440
NYX 0:85b3fd62ea1a 441 if (hpcd->Init.dma_enable == 1U)
NYX 0:85b3fd62ea1a 442 {
NYX 0:85b3fd62ea1a 443 /* this is ZLP, so prepare EP0 for next setup */
NYX 0:85b3fd62ea1a 444 if((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U))
NYX 0:85b3fd62ea1a 445 {
NYX 0:85b3fd62ea1a 446 /* prepare to rx more setup packets */
NYX 0:85b3fd62ea1a 447 USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup);
NYX 0:85b3fd62ea1a 448 }
NYX 0:85b3fd62ea1a 449 }
NYX 0:85b3fd62ea1a 450 }
NYX 0:85b3fd62ea1a 451 if(( epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC)
NYX 0:85b3fd62ea1a 452 {
NYX 0:85b3fd62ea1a 453 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC);
NYX 0:85b3fd62ea1a 454 }
NYX 0:85b3fd62ea1a 455 if(( epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE)
NYX 0:85b3fd62ea1a 456 {
NYX 0:85b3fd62ea1a 457 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE);
NYX 0:85b3fd62ea1a 458 }
NYX 0:85b3fd62ea1a 459 if(( epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE)
NYX 0:85b3fd62ea1a 460 {
NYX 0:85b3fd62ea1a 461 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE);
NYX 0:85b3fd62ea1a 462 }
NYX 0:85b3fd62ea1a 463 if(( epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD)
NYX 0:85b3fd62ea1a 464 {
NYX 0:85b3fd62ea1a 465 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD);
NYX 0:85b3fd62ea1a 466 }
NYX 0:85b3fd62ea1a 467 if(( epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE)
NYX 0:85b3fd62ea1a 468 {
NYX 0:85b3fd62ea1a 469 PCD_WriteEmptyTxFifo(hpcd , epnum);
NYX 0:85b3fd62ea1a 470 }
NYX 0:85b3fd62ea1a 471 }
NYX 0:85b3fd62ea1a 472 epnum++;
NYX 0:85b3fd62ea1a 473 ep_intr >>= 1U;
NYX 0:85b3fd62ea1a 474 }
NYX 0:85b3fd62ea1a 475 }
NYX 0:85b3fd62ea1a 476
NYX 0:85b3fd62ea1a 477 /* Handle Resume Interrupt */
NYX 0:85b3fd62ea1a 478 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT))
NYX 0:85b3fd62ea1a 479 {
NYX 0:85b3fd62ea1a 480 /* Clear the Remote Wake-up Signaling */
NYX 0:85b3fd62ea1a 481 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
NYX 0:85b3fd62ea1a 482
NYX 0:85b3fd62ea1a 483 #ifdef USB_OTG_GLPMCFG_LPMEN
NYX 0:85b3fd62ea1a 484 if(hpcd->LPM_State == LPM_L1)
NYX 0:85b3fd62ea1a 485 {
NYX 0:85b3fd62ea1a 486 hpcd->LPM_State = LPM_L0;
NYX 0:85b3fd62ea1a 487 HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L0_ACTIVE);
NYX 0:85b3fd62ea1a 488 }
NYX 0:85b3fd62ea1a 489 else
NYX 0:85b3fd62ea1a 490 #endif /* USB_OTG_GLPMCFG_LPMEN */
NYX 0:85b3fd62ea1a 491 {
NYX 0:85b3fd62ea1a 492 HAL_PCD_ResumeCallback(hpcd);
NYX 0:85b3fd62ea1a 493 }
NYX 0:85b3fd62ea1a 494
NYX 0:85b3fd62ea1a 495 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT);
NYX 0:85b3fd62ea1a 496 }
NYX 0:85b3fd62ea1a 497
NYX 0:85b3fd62ea1a 498 /* Handle Suspend Interrupt */
NYX 0:85b3fd62ea1a 499 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP))
NYX 0:85b3fd62ea1a 500 {
NYX 0:85b3fd62ea1a 501 if((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)
NYX 0:85b3fd62ea1a 502 {
NYX 0:85b3fd62ea1a 503
NYX 0:85b3fd62ea1a 504 HAL_PCD_SuspendCallback(hpcd);
NYX 0:85b3fd62ea1a 505 }
NYX 0:85b3fd62ea1a 506 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP);
NYX 0:85b3fd62ea1a 507 }
NYX 0:85b3fd62ea1a 508
NYX 0:85b3fd62ea1a 509 #ifdef USB_OTG_GLPMCFG_LPMEN
NYX 0:85b3fd62ea1a 510 /* Handle LPM Interrupt */
NYX 0:85b3fd62ea1a 511 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT))
NYX 0:85b3fd62ea1a 512 {
NYX 0:85b3fd62ea1a 513 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT);
NYX 0:85b3fd62ea1a 514 if( hpcd->LPM_State == LPM_L0)
NYX 0:85b3fd62ea1a 515 {
NYX 0:85b3fd62ea1a 516 hpcd->LPM_State = LPM_L1;
NYX 0:85b3fd62ea1a 517 hpcd->BESL = (hpcd->Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >> 2U;
NYX 0:85b3fd62ea1a 518 HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE);
NYX 0:85b3fd62ea1a 519 }
NYX 0:85b3fd62ea1a 520 else
NYX 0:85b3fd62ea1a 521 {
NYX 0:85b3fd62ea1a 522 HAL_PCD_SuspendCallback(hpcd);
NYX 0:85b3fd62ea1a 523 }
NYX 0:85b3fd62ea1a 524 }
NYX 0:85b3fd62ea1a 525 #endif /* USB_OTG_GLPMCFG_LPMEN */
NYX 0:85b3fd62ea1a 526
NYX 0:85b3fd62ea1a 527 /* Handle Reset Interrupt */
NYX 0:85b3fd62ea1a 528 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST))
NYX 0:85b3fd62ea1a 529 {
NYX 0:85b3fd62ea1a 530 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
NYX 0:85b3fd62ea1a 531 USB_FlushTxFifo(hpcd->Instance , 0x10U);
NYX 0:85b3fd62ea1a 532
NYX 0:85b3fd62ea1a 533 for (i = 0U; i < hpcd->Init.dev_endpoints; i++)
NYX 0:85b3fd62ea1a 534 {
NYX 0:85b3fd62ea1a 535 USBx_INEP(i)->DIEPINT = 0xFFU;
NYX 0:85b3fd62ea1a 536 USBx_OUTEP(i)->DOEPINT = 0xFFU;
NYX 0:85b3fd62ea1a 537 }
NYX 0:85b3fd62ea1a 538 USBx_DEVICE->DAINT = 0xFFFFFFFFU;
NYX 0:85b3fd62ea1a 539 USBx_DEVICE->DAINTMSK |= 0x10001U;
NYX 0:85b3fd62ea1a 540
NYX 0:85b3fd62ea1a 541 if(hpcd->Init.use_dedicated_ep1)
NYX 0:85b3fd62ea1a 542 {
NYX 0:85b3fd62ea1a 543 USBx_DEVICE->DOUTEP1MSK |= (USB_OTG_DOEPMSK_STUPM | USB_OTG_DOEPMSK_XFRCM | USB_OTG_DOEPMSK_EPDM);
NYX 0:85b3fd62ea1a 544 USBx_DEVICE->DINEP1MSK |= (USB_OTG_DIEPMSK_TOM | USB_OTG_DIEPMSK_XFRCM | USB_OTG_DIEPMSK_EPDM);
NYX 0:85b3fd62ea1a 545 }
NYX 0:85b3fd62ea1a 546 else
NYX 0:85b3fd62ea1a 547 {
NYX 0:85b3fd62ea1a 548 #ifdef USB_OTG_DOEPINT_OTEPSPR
NYX 0:85b3fd62ea1a 549 USBx_DEVICE->DOEPMSK |= (USB_OTG_DOEPMSK_STUPM | USB_OTG_DOEPMSK_XFRCM | USB_OTG_DOEPMSK_EPDM | USB_OTG_DOEPMSK_OTEPSPRM);
NYX 0:85b3fd62ea1a 550 #else
NYX 0:85b3fd62ea1a 551 USBx_DEVICE->DOEPMSK |= (USB_OTG_DOEPMSK_STUPM | USB_OTG_DOEPMSK_XFRCM | USB_OTG_DOEPMSK_EPDM);
NYX 0:85b3fd62ea1a 552 #endif /* USB_OTG_DOEPINT_OTEPSPR */
NYX 0:85b3fd62ea1a 553 USBx_DEVICE->DIEPMSK |= (USB_OTG_DIEPMSK_TOM | USB_OTG_DIEPMSK_XFRCM | USB_OTG_DIEPMSK_EPDM);
NYX 0:85b3fd62ea1a 554 }
NYX 0:85b3fd62ea1a 555
NYX 0:85b3fd62ea1a 556 /* Set Default Address to 0 */
NYX 0:85b3fd62ea1a 557 USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD;
NYX 0:85b3fd62ea1a 558
NYX 0:85b3fd62ea1a 559 /* setup EP0 to receive SETUP packets */
NYX 0:85b3fd62ea1a 560 USB_EP0_OutStart(hpcd->Instance, hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup);
NYX 0:85b3fd62ea1a 561
NYX 0:85b3fd62ea1a 562 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST);
NYX 0:85b3fd62ea1a 563 }
NYX 0:85b3fd62ea1a 564
NYX 0:85b3fd62ea1a 565 /* Handle Enumeration done Interrupt */
NYX 0:85b3fd62ea1a 566 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE))
NYX 0:85b3fd62ea1a 567 {
NYX 0:85b3fd62ea1a 568 USB_ActivateSetup(hpcd->Instance);
NYX 0:85b3fd62ea1a 569 hpcd->Instance->GUSBCFG &= ~USB_OTG_GUSBCFG_TRDT;
NYX 0:85b3fd62ea1a 570
NYX 0:85b3fd62ea1a 571 if ( USB_GetDevSpeed(hpcd->Instance) == USB_OTG_SPEED_HIGH)
NYX 0:85b3fd62ea1a 572 {
NYX 0:85b3fd62ea1a 573 hpcd->Init.speed = USB_OTG_SPEED_HIGH;
NYX 0:85b3fd62ea1a 574 hpcd->Init.ep0_mps = USB_OTG_HS_MAX_PACKET_SIZE ;
NYX 0:85b3fd62ea1a 575 hpcd->Instance->GUSBCFG |= (uint32_t)((USBD_HS_TRDT_VALUE << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 576 }
NYX 0:85b3fd62ea1a 577 else
NYX 0:85b3fd62ea1a 578 {
NYX 0:85b3fd62ea1a 579 hpcd->Init.speed = USB_OTG_SPEED_FULL;
NYX 0:85b3fd62ea1a 580 hpcd->Init.ep0_mps = USB_OTG_FS_MAX_PACKET_SIZE ;
NYX 0:85b3fd62ea1a 581
NYX 0:85b3fd62ea1a 582 /* The USBTRD is configured according to the tables below, depending on AHB frequency
NYX 0:85b3fd62ea1a 583 used by application. In the low AHB frequency range it is used to stretch enough the USB response
NYX 0:85b3fd62ea1a 584 time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access
NYX 0:85b3fd62ea1a 585 latency to the Data FIFO */
NYX 0:85b3fd62ea1a 586
NYX 0:85b3fd62ea1a 587 /* Get hclk frequency value */
NYX 0:85b3fd62ea1a 588 hclk = HAL_RCC_GetHCLKFreq();
NYX 0:85b3fd62ea1a 589
NYX 0:85b3fd62ea1a 590 if((hclk >= 14200000U)&&(hclk < 15000000U))
NYX 0:85b3fd62ea1a 591 {
NYX 0:85b3fd62ea1a 592 /* hclk Clock Range between 14.2-15 MHz */
NYX 0:85b3fd62ea1a 593 hpcd->Instance->GUSBCFG |= (uint32_t)((0xFU << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 594 }
NYX 0:85b3fd62ea1a 595
NYX 0:85b3fd62ea1a 596 else if((hclk >= 15000000U)&&(hclk < 16000000U))
NYX 0:85b3fd62ea1a 597 {
NYX 0:85b3fd62ea1a 598 /* hclk Clock Range between 15-16 MHz */
NYX 0:85b3fd62ea1a 599 hpcd->Instance->GUSBCFG |= (uint32_t)((0xEU << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 600 }
NYX 0:85b3fd62ea1a 601
NYX 0:85b3fd62ea1a 602 else if((hclk >= 16000000U)&&(hclk < 17200000U))
NYX 0:85b3fd62ea1a 603 {
NYX 0:85b3fd62ea1a 604 /* hclk Clock Range between 16-17.2 MHz */
NYX 0:85b3fd62ea1a 605 hpcd->Instance->GUSBCFG |= (uint32_t)((0xDU << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 606 }
NYX 0:85b3fd62ea1a 607
NYX 0:85b3fd62ea1a 608 else if((hclk >= 17200000U)&&(hclk < 18500000U))
NYX 0:85b3fd62ea1a 609 {
NYX 0:85b3fd62ea1a 610 /* hclk Clock Range between 17.2-18.5 MHz */
NYX 0:85b3fd62ea1a 611 hpcd->Instance->GUSBCFG |= (uint32_t)((0xCU << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 612 }
NYX 0:85b3fd62ea1a 613
NYX 0:85b3fd62ea1a 614 else if((hclk >= 18500000U)&&(hclk < 20000000U))
NYX 0:85b3fd62ea1a 615 {
NYX 0:85b3fd62ea1a 616 /* hclk Clock Range between 18.5-20 MHz */
NYX 0:85b3fd62ea1a 617 hpcd->Instance->GUSBCFG |= (uint32_t)((0xBU << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 618 }
NYX 0:85b3fd62ea1a 619
NYX 0:85b3fd62ea1a 620 else if((hclk >= 20000000U)&&(hclk < 21800000U))
NYX 0:85b3fd62ea1a 621 {
NYX 0:85b3fd62ea1a 622 /* hclk Clock Range between 20-21.8 MHz */
NYX 0:85b3fd62ea1a 623 hpcd->Instance->GUSBCFG |= (uint32_t)((0xAU << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 624 }
NYX 0:85b3fd62ea1a 625
NYX 0:85b3fd62ea1a 626 else if((hclk >= 21800000U)&&(hclk < 24000000U))
NYX 0:85b3fd62ea1a 627 {
NYX 0:85b3fd62ea1a 628 /* hclk Clock Range between 21.8-24 MHz */
NYX 0:85b3fd62ea1a 629 hpcd->Instance->GUSBCFG |= (uint32_t)((0x9U << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 630 }
NYX 0:85b3fd62ea1a 631
NYX 0:85b3fd62ea1a 632 else if((hclk >= 24000000U)&&(hclk < 27700000U))
NYX 0:85b3fd62ea1a 633 {
NYX 0:85b3fd62ea1a 634 /* hclk Clock Range between 24-27.7 MHz */
NYX 0:85b3fd62ea1a 635 hpcd->Instance->GUSBCFG |= (uint32_t)((0x8U << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 636 }
NYX 0:85b3fd62ea1a 637
NYX 0:85b3fd62ea1a 638 else if((hclk >= 27700000U)&&(hclk < 32000000U))
NYX 0:85b3fd62ea1a 639 {
NYX 0:85b3fd62ea1a 640 /* hclk Clock Range between 27.7-32 MHz */
NYX 0:85b3fd62ea1a 641 hpcd->Instance->GUSBCFG |= (uint32_t)((0x7U << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 642 }
NYX 0:85b3fd62ea1a 643
NYX 0:85b3fd62ea1a 644 else /* if(hclk >= 32000000) */
NYX 0:85b3fd62ea1a 645 {
NYX 0:85b3fd62ea1a 646 /* hclk Clock Range between 32-180 MHz */
NYX 0:85b3fd62ea1a 647 hpcd->Instance->GUSBCFG |= (uint32_t)((0x6U << 10U) & USB_OTG_GUSBCFG_TRDT);
NYX 0:85b3fd62ea1a 648 }
NYX 0:85b3fd62ea1a 649 }
NYX 0:85b3fd62ea1a 650
NYX 0:85b3fd62ea1a 651 HAL_PCD_ResetCallback(hpcd);
NYX 0:85b3fd62ea1a 652
NYX 0:85b3fd62ea1a 653 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE);
NYX 0:85b3fd62ea1a 654 }
NYX 0:85b3fd62ea1a 655
NYX 0:85b3fd62ea1a 656 /* Handle RxQLevel Interrupt */
NYX 0:85b3fd62ea1a 657 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL))
NYX 0:85b3fd62ea1a 658 {
NYX 0:85b3fd62ea1a 659 USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
NYX 0:85b3fd62ea1a 660
NYX 0:85b3fd62ea1a 661 temp = USBx->GRXSTSP;
NYX 0:85b3fd62ea1a 662
NYX 0:85b3fd62ea1a 663 ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM];
NYX 0:85b3fd62ea1a 664
NYX 0:85b3fd62ea1a 665 if(((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17U) == STS_DATA_UPDT)
NYX 0:85b3fd62ea1a 666 {
NYX 0:85b3fd62ea1a 667 if((temp & USB_OTG_GRXSTSP_BCNT) != 0U)
NYX 0:85b3fd62ea1a 668 {
NYX 0:85b3fd62ea1a 669 USB_ReadPacket(USBx, ep->xfer_buff, (temp & USB_OTG_GRXSTSP_BCNT) >> 4U);
NYX 0:85b3fd62ea1a 670 ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4U;
NYX 0:85b3fd62ea1a 671 ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4U;
NYX 0:85b3fd62ea1a 672 }
NYX 0:85b3fd62ea1a 673 }
NYX 0:85b3fd62ea1a 674 else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17U) == STS_SETUP_UPDT)
NYX 0:85b3fd62ea1a 675 {
NYX 0:85b3fd62ea1a 676 USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U);
NYX 0:85b3fd62ea1a 677 ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4U;
NYX 0:85b3fd62ea1a 678 }
NYX 0:85b3fd62ea1a 679 USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
NYX 0:85b3fd62ea1a 680 }
NYX 0:85b3fd62ea1a 681
NYX 0:85b3fd62ea1a 682 /* Handle SOF Interrupt */
NYX 0:85b3fd62ea1a 683 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF))
NYX 0:85b3fd62ea1a 684 {
NYX 0:85b3fd62ea1a 685 HAL_PCD_SOFCallback(hpcd);
NYX 0:85b3fd62ea1a 686 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF);
NYX 0:85b3fd62ea1a 687 }
NYX 0:85b3fd62ea1a 688
NYX 0:85b3fd62ea1a 689 /* Handle Incomplete ISO IN Interrupt */
NYX 0:85b3fd62ea1a 690 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR))
NYX 0:85b3fd62ea1a 691 {
NYX 0:85b3fd62ea1a 692 HAL_PCD_ISOINIncompleteCallback(hpcd, epnum);
NYX 0:85b3fd62ea1a 693 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR);
NYX 0:85b3fd62ea1a 694 }
NYX 0:85b3fd62ea1a 695
NYX 0:85b3fd62ea1a 696 /* Handle Incomplete ISO OUT Interrupt */
NYX 0:85b3fd62ea1a 697 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
NYX 0:85b3fd62ea1a 698 {
NYX 0:85b3fd62ea1a 699 HAL_PCD_ISOOUTIncompleteCallback(hpcd, epnum);
NYX 0:85b3fd62ea1a 700 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
NYX 0:85b3fd62ea1a 701 }
NYX 0:85b3fd62ea1a 702
NYX 0:85b3fd62ea1a 703 /* Handle Connection event Interrupt */
NYX 0:85b3fd62ea1a 704 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT))
NYX 0:85b3fd62ea1a 705 {
NYX 0:85b3fd62ea1a 706 HAL_PCD_ConnectCallback(hpcd);
NYX 0:85b3fd62ea1a 707 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT);
NYX 0:85b3fd62ea1a 708 }
NYX 0:85b3fd62ea1a 709
NYX 0:85b3fd62ea1a 710 /* Handle Disconnection event Interrupt */
NYX 0:85b3fd62ea1a 711 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT))
NYX 0:85b3fd62ea1a 712 {
NYX 0:85b3fd62ea1a 713 temp = hpcd->Instance->GOTGINT;
NYX 0:85b3fd62ea1a 714
NYX 0:85b3fd62ea1a 715 if((temp & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET)
NYX 0:85b3fd62ea1a 716 {
NYX 0:85b3fd62ea1a 717 HAL_PCD_DisconnectCallback(hpcd);
NYX 0:85b3fd62ea1a 718 }
NYX 0:85b3fd62ea1a 719 hpcd->Instance->GOTGINT |= temp;
NYX 0:85b3fd62ea1a 720 }
NYX 0:85b3fd62ea1a 721 }
NYX 0:85b3fd62ea1a 722 }
NYX 0:85b3fd62ea1a 723
NYX 0:85b3fd62ea1a 724 /**
NYX 0:85b3fd62ea1a 725 * @brief Data OUT stage callback.
NYX 0:85b3fd62ea1a 726 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 727 * @param epnum: endpoint number
NYX 0:85b3fd62ea1a 728 * @retval None
NYX 0:85b3fd62ea1a 729 */
NYX 0:85b3fd62ea1a 730 __weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
NYX 0:85b3fd62ea1a 731 {
NYX 0:85b3fd62ea1a 732 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 733 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 734 UNUSED(epnum);
NYX 0:85b3fd62ea1a 735 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 736 the HAL_PCD_DataOutStageCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 737 */
NYX 0:85b3fd62ea1a 738 }
NYX 0:85b3fd62ea1a 739
NYX 0:85b3fd62ea1a 740 /**
NYX 0:85b3fd62ea1a 741 * @brief Data IN stage callback.
NYX 0:85b3fd62ea1a 742 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 743 * @param epnum: endpoint number
NYX 0:85b3fd62ea1a 744 * @retval None
NYX 0:85b3fd62ea1a 745 */
NYX 0:85b3fd62ea1a 746 __weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
NYX 0:85b3fd62ea1a 747 {
NYX 0:85b3fd62ea1a 748 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 749 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 750 UNUSED(epnum);
NYX 0:85b3fd62ea1a 751 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 752 the HAL_PCD_DataInStageCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 753 */
NYX 0:85b3fd62ea1a 754 }
NYX 0:85b3fd62ea1a 755 /**
NYX 0:85b3fd62ea1a 756 * @brief Setup stage callback.
NYX 0:85b3fd62ea1a 757 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 758 * @retval None
NYX 0:85b3fd62ea1a 759 */
NYX 0:85b3fd62ea1a 760 __weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 761 {
NYX 0:85b3fd62ea1a 762 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 763 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 764 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 765 the HAL_PCD_SetupStageCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 766 */
NYX 0:85b3fd62ea1a 767 }
NYX 0:85b3fd62ea1a 768
NYX 0:85b3fd62ea1a 769 /**
NYX 0:85b3fd62ea1a 770 * @brief USB Start Of Frame callback.
NYX 0:85b3fd62ea1a 771 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 772 * @retval None
NYX 0:85b3fd62ea1a 773 */
NYX 0:85b3fd62ea1a 774 __weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 775 {
NYX 0:85b3fd62ea1a 776 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 777 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 778 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 779 the HAL_PCD_SOFCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 780 */
NYX 0:85b3fd62ea1a 781 }
NYX 0:85b3fd62ea1a 782
NYX 0:85b3fd62ea1a 783 /**
NYX 0:85b3fd62ea1a 784 * @brief USB Reset callback.
NYX 0:85b3fd62ea1a 785 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 786 * @retval None
NYX 0:85b3fd62ea1a 787 */
NYX 0:85b3fd62ea1a 788 __weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 789 {
NYX 0:85b3fd62ea1a 790 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 791 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 792 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 793 the HAL_PCD_ResetCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 794 */
NYX 0:85b3fd62ea1a 795 }
NYX 0:85b3fd62ea1a 796
NYX 0:85b3fd62ea1a 797 /**
NYX 0:85b3fd62ea1a 798 * @brief Suspend event callback.
NYX 0:85b3fd62ea1a 799 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 800 * @retval None
NYX 0:85b3fd62ea1a 801 */
NYX 0:85b3fd62ea1a 802 __weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 803 {
NYX 0:85b3fd62ea1a 804 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 805 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 806 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 807 the HAL_PCD_SuspendCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 808 */
NYX 0:85b3fd62ea1a 809 }
NYX 0:85b3fd62ea1a 810
NYX 0:85b3fd62ea1a 811 /**
NYX 0:85b3fd62ea1a 812 * @brief Resume event callback.
NYX 0:85b3fd62ea1a 813 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 814 * @retval None
NYX 0:85b3fd62ea1a 815 */
NYX 0:85b3fd62ea1a 816 __weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 817 {
NYX 0:85b3fd62ea1a 818 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 819 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 820 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 821 the HAL_PCD_ResumeCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 822 */
NYX 0:85b3fd62ea1a 823 }
NYX 0:85b3fd62ea1a 824
NYX 0:85b3fd62ea1a 825 /**
NYX 0:85b3fd62ea1a 826 * @brief Incomplete ISO OUT callback.
NYX 0:85b3fd62ea1a 827 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 828 * @param epnum: endpoint number
NYX 0:85b3fd62ea1a 829 * @retval None
NYX 0:85b3fd62ea1a 830 */
NYX 0:85b3fd62ea1a 831 __weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
NYX 0:85b3fd62ea1a 832 {
NYX 0:85b3fd62ea1a 833 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 834 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 835 UNUSED(epnum);
NYX 0:85b3fd62ea1a 836 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 837 the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 838 */
NYX 0:85b3fd62ea1a 839 }
NYX 0:85b3fd62ea1a 840
NYX 0:85b3fd62ea1a 841 /**
NYX 0:85b3fd62ea1a 842 * @brief Incomplete ISO IN callback.
NYX 0:85b3fd62ea1a 843 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 844 * @param epnum: endpoint number
NYX 0:85b3fd62ea1a 845 * @retval None
NYX 0:85b3fd62ea1a 846 */
NYX 0:85b3fd62ea1a 847 __weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
NYX 0:85b3fd62ea1a 848 {
NYX 0:85b3fd62ea1a 849 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 850 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 851 UNUSED(epnum);
NYX 0:85b3fd62ea1a 852 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 853 the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 854 */
NYX 0:85b3fd62ea1a 855 }
NYX 0:85b3fd62ea1a 856
NYX 0:85b3fd62ea1a 857 /**
NYX 0:85b3fd62ea1a 858 * @brief Connection event callback.
NYX 0:85b3fd62ea1a 859 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 860 * @retval None
NYX 0:85b3fd62ea1a 861 */
NYX 0:85b3fd62ea1a 862 __weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 863 {
NYX 0:85b3fd62ea1a 864 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 865 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 866 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 867 the HAL_PCD_ConnectCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 868 */
NYX 0:85b3fd62ea1a 869 }
NYX 0:85b3fd62ea1a 870
NYX 0:85b3fd62ea1a 871 /**
NYX 0:85b3fd62ea1a 872 * @brief Disconnection event callback.
NYX 0:85b3fd62ea1a 873 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 874 * @retval None
NYX 0:85b3fd62ea1a 875 */
NYX 0:85b3fd62ea1a 876 __weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 877 {
NYX 0:85b3fd62ea1a 878 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 879 UNUSED(hpcd);
NYX 0:85b3fd62ea1a 880 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 881 the HAL_PCD_DisconnectCallback could be implemented in the user file
NYX 0:85b3fd62ea1a 882 */
NYX 0:85b3fd62ea1a 883 }
NYX 0:85b3fd62ea1a 884
NYX 0:85b3fd62ea1a 885 /**
NYX 0:85b3fd62ea1a 886 * @}
NYX 0:85b3fd62ea1a 887 */
NYX 0:85b3fd62ea1a 888
NYX 0:85b3fd62ea1a 889 /** @defgroup PCD_Exported_Functions_Group3 Peripheral Control functions
NYX 0:85b3fd62ea1a 890 * @brief management functions
NYX 0:85b3fd62ea1a 891 *
NYX 0:85b3fd62ea1a 892 @verbatim
NYX 0:85b3fd62ea1a 893 ===============================================================================
NYX 0:85b3fd62ea1a 894 ##### Peripheral Control functions #####
NYX 0:85b3fd62ea1a 895 ===============================================================================
NYX 0:85b3fd62ea1a 896 [..]
NYX 0:85b3fd62ea1a 897 This subsection provides a set of functions allowing to control the PCD data
NYX 0:85b3fd62ea1a 898 transfers.
NYX 0:85b3fd62ea1a 899
NYX 0:85b3fd62ea1a 900 @endverbatim
NYX 0:85b3fd62ea1a 901 * @{
NYX 0:85b3fd62ea1a 902 */
NYX 0:85b3fd62ea1a 903
NYX 0:85b3fd62ea1a 904 /**
NYX 0:85b3fd62ea1a 905 * @brief Connect the USB device.
NYX 0:85b3fd62ea1a 906 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 907 * @retval HAL status
NYX 0:85b3fd62ea1a 908 */
NYX 0:85b3fd62ea1a 909 HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 910 {
NYX 0:85b3fd62ea1a 911 __HAL_LOCK(hpcd);
NYX 0:85b3fd62ea1a 912 USB_DevConnect(hpcd->Instance);
NYX 0:85b3fd62ea1a 913 __HAL_UNLOCK(hpcd);
NYX 0:85b3fd62ea1a 914 return HAL_OK;
NYX 0:85b3fd62ea1a 915 }
NYX 0:85b3fd62ea1a 916
NYX 0:85b3fd62ea1a 917 /**
NYX 0:85b3fd62ea1a 918 * @brief Disconnect the USB device.
NYX 0:85b3fd62ea1a 919 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 920 * @retval HAL status
NYX 0:85b3fd62ea1a 921 */
NYX 0:85b3fd62ea1a 922 HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 923 {
NYX 0:85b3fd62ea1a 924 __HAL_LOCK(hpcd);
NYX 0:85b3fd62ea1a 925 USB_DevDisconnect(hpcd->Instance);
NYX 0:85b3fd62ea1a 926 __HAL_UNLOCK(hpcd);
NYX 0:85b3fd62ea1a 927 return HAL_OK;
NYX 0:85b3fd62ea1a 928 }
NYX 0:85b3fd62ea1a 929
NYX 0:85b3fd62ea1a 930 /**
NYX 0:85b3fd62ea1a 931 * @brief Set the USB Device address.
NYX 0:85b3fd62ea1a 932 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 933 * @param address: new device address
NYX 0:85b3fd62ea1a 934 * @retval HAL status
NYX 0:85b3fd62ea1a 935 */
NYX 0:85b3fd62ea1a 936 HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address)
NYX 0:85b3fd62ea1a 937 {
NYX 0:85b3fd62ea1a 938 __HAL_LOCK(hpcd);
NYX 0:85b3fd62ea1a 939 USB_SetDevAddress(hpcd->Instance, address);
NYX 0:85b3fd62ea1a 940 __HAL_UNLOCK(hpcd);
NYX 0:85b3fd62ea1a 941 return HAL_OK;
NYX 0:85b3fd62ea1a 942 }
NYX 0:85b3fd62ea1a 943 /**
NYX 0:85b3fd62ea1a 944 * @brief Open and configure an endpoint.
NYX 0:85b3fd62ea1a 945 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 946 * @param ep_addr: endpoint address
NYX 0:85b3fd62ea1a 947 * @param ep_mps: endpoint max packet size
NYX 0:85b3fd62ea1a 948 * @param ep_type: endpoint type
NYX 0:85b3fd62ea1a 949 * @retval HAL status
NYX 0:85b3fd62ea1a 950 */
NYX 0:85b3fd62ea1a 951 HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type)
NYX 0:85b3fd62ea1a 952 {
NYX 0:85b3fd62ea1a 953 HAL_StatusTypeDef ret = HAL_OK;
NYX 0:85b3fd62ea1a 954 USB_OTG_EPTypeDef *ep;
NYX 0:85b3fd62ea1a 955
NYX 0:85b3fd62ea1a 956 if ((ep_addr & 0x80U) == 0x80U)
NYX 0:85b3fd62ea1a 957 {
NYX 0:85b3fd62ea1a 958 ep = &hpcd->IN_ep[ep_addr & 0x7FU];
NYX 0:85b3fd62ea1a 959 }
NYX 0:85b3fd62ea1a 960 else
NYX 0:85b3fd62ea1a 961 {
NYX 0:85b3fd62ea1a 962 ep = &hpcd->OUT_ep[ep_addr & 0x7FU];
NYX 0:85b3fd62ea1a 963 }
NYX 0:85b3fd62ea1a 964 ep->num = ep_addr & 0x7FU;
NYX 0:85b3fd62ea1a 965
NYX 0:85b3fd62ea1a 966 ep->is_in = (0x80U & ep_addr) != 0U;
NYX 0:85b3fd62ea1a 967 ep->maxpacket = ep_mps;
NYX 0:85b3fd62ea1a 968 ep->type = ep_type;
NYX 0:85b3fd62ea1a 969 if (ep->is_in)
NYX 0:85b3fd62ea1a 970 {
NYX 0:85b3fd62ea1a 971 /* Assign a Tx FIFO */
NYX 0:85b3fd62ea1a 972 ep->tx_fifo_num = ep->num;
NYX 0:85b3fd62ea1a 973 }
NYX 0:85b3fd62ea1a 974 /* Set initial data PID. */
NYX 0:85b3fd62ea1a 975 if (ep_type == EP_TYPE_BULK )
NYX 0:85b3fd62ea1a 976 {
NYX 0:85b3fd62ea1a 977 ep->data_pid_start = 0U;
NYX 0:85b3fd62ea1a 978 }
NYX 0:85b3fd62ea1a 979
NYX 0:85b3fd62ea1a 980 __HAL_LOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 981 USB_ActivateEndpoint(hpcd->Instance , ep);
NYX 0:85b3fd62ea1a 982 __HAL_UNLOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 983 return ret;
NYX 0:85b3fd62ea1a 984 }
NYX 0:85b3fd62ea1a 985
NYX 0:85b3fd62ea1a 986
NYX 0:85b3fd62ea1a 987 /**
NYX 0:85b3fd62ea1a 988 * @brief Deactivate an endpoint.
NYX 0:85b3fd62ea1a 989 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 990 * @param ep_addr: endpoint address
NYX 0:85b3fd62ea1a 991 * @retval HAL status
NYX 0:85b3fd62ea1a 992 */
NYX 0:85b3fd62ea1a 993 HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
NYX 0:85b3fd62ea1a 994 {
NYX 0:85b3fd62ea1a 995 USB_OTG_EPTypeDef *ep;
NYX 0:85b3fd62ea1a 996
NYX 0:85b3fd62ea1a 997 if ((ep_addr & 0x80U) == 0x80U)
NYX 0:85b3fd62ea1a 998 {
NYX 0:85b3fd62ea1a 999 ep = &hpcd->IN_ep[ep_addr & 0x7FU];
NYX 0:85b3fd62ea1a 1000 }
NYX 0:85b3fd62ea1a 1001 else
NYX 0:85b3fd62ea1a 1002 {
NYX 0:85b3fd62ea1a 1003 ep = &hpcd->OUT_ep[ep_addr & 0x7FU];
NYX 0:85b3fd62ea1a 1004 }
NYX 0:85b3fd62ea1a 1005 ep->num = ep_addr & 0x7FU;
NYX 0:85b3fd62ea1a 1006
NYX 0:85b3fd62ea1a 1007 ep->is_in = (0x80U & ep_addr) != 0U;
NYX 0:85b3fd62ea1a 1008
NYX 0:85b3fd62ea1a 1009 __HAL_LOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1010 USB_DeactivateEndpoint(hpcd->Instance , ep);
NYX 0:85b3fd62ea1a 1011 __HAL_UNLOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1012 return HAL_OK;
NYX 0:85b3fd62ea1a 1013 }
NYX 0:85b3fd62ea1a 1014
NYX 0:85b3fd62ea1a 1015
NYX 0:85b3fd62ea1a 1016 /**
NYX 0:85b3fd62ea1a 1017 * @brief Receive an amount of data.
NYX 0:85b3fd62ea1a 1018 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1019 * @param ep_addr: endpoint address
NYX 0:85b3fd62ea1a 1020 * @param pBuf: pointer to the reception buffer
NYX 0:85b3fd62ea1a 1021 * @param len: amount of data to be received
NYX 0:85b3fd62ea1a 1022 * @retval HAL status
NYX 0:85b3fd62ea1a 1023 */
NYX 0:85b3fd62ea1a 1024 HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
NYX 0:85b3fd62ea1a 1025 {
NYX 0:85b3fd62ea1a 1026 USB_OTG_EPTypeDef *ep;
NYX 0:85b3fd62ea1a 1027
NYX 0:85b3fd62ea1a 1028 ep = &hpcd->OUT_ep[ep_addr & 0x7FU];
NYX 0:85b3fd62ea1a 1029
NYX 0:85b3fd62ea1a 1030 /*setup and start the Xfer */
NYX 0:85b3fd62ea1a 1031 ep->xfer_buff = pBuf;
NYX 0:85b3fd62ea1a 1032 ep->xfer_len = len;
NYX 0:85b3fd62ea1a 1033 ep->xfer_count = 0U;
NYX 0:85b3fd62ea1a 1034 ep->is_in = 0U;
NYX 0:85b3fd62ea1a 1035 ep->num = ep_addr & 0x7FU;
NYX 0:85b3fd62ea1a 1036
NYX 0:85b3fd62ea1a 1037 if (hpcd->Init.dma_enable == 1U)
NYX 0:85b3fd62ea1a 1038 {
NYX 0:85b3fd62ea1a 1039 ep->dma_addr = (uint32_t)pBuf;
NYX 0:85b3fd62ea1a 1040 }
NYX 0:85b3fd62ea1a 1041
NYX 0:85b3fd62ea1a 1042 __HAL_LOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1043
NYX 0:85b3fd62ea1a 1044 if ((ep_addr & 0x7FU) == 0U)
NYX 0:85b3fd62ea1a 1045 {
NYX 0:85b3fd62ea1a 1046 USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
NYX 0:85b3fd62ea1a 1047 }
NYX 0:85b3fd62ea1a 1048 else
NYX 0:85b3fd62ea1a 1049 {
NYX 0:85b3fd62ea1a 1050 USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
NYX 0:85b3fd62ea1a 1051 }
NYX 0:85b3fd62ea1a 1052 __HAL_UNLOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1053
NYX 0:85b3fd62ea1a 1054 return HAL_OK;
NYX 0:85b3fd62ea1a 1055 }
NYX 0:85b3fd62ea1a 1056
NYX 0:85b3fd62ea1a 1057 /**
NYX 0:85b3fd62ea1a 1058 * @brief Get Received Data Size.
NYX 0:85b3fd62ea1a 1059 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1060 * @param ep_addr: endpoint address
NYX 0:85b3fd62ea1a 1061 * @retval Data Size
NYX 0:85b3fd62ea1a 1062 */
NYX 0:85b3fd62ea1a 1063 uint16_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
NYX 0:85b3fd62ea1a 1064 {
NYX 0:85b3fd62ea1a 1065 return hpcd->OUT_ep[ep_addr & 0x7FU].xfer_count;
NYX 0:85b3fd62ea1a 1066 }
NYX 0:85b3fd62ea1a 1067 /**
NYX 0:85b3fd62ea1a 1068 * @brief Send an amount of data.
NYX 0:85b3fd62ea1a 1069 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1070 * @param ep_addr: endpoint address
NYX 0:85b3fd62ea1a 1071 * @param pBuf: pointer to the transmission buffer
NYX 0:85b3fd62ea1a 1072 * @param len: amount of data to be sent
NYX 0:85b3fd62ea1a 1073 * @retval HAL status
NYX 0:85b3fd62ea1a 1074 */
NYX 0:85b3fd62ea1a 1075 HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
NYX 0:85b3fd62ea1a 1076 {
NYX 0:85b3fd62ea1a 1077 USB_OTG_EPTypeDef *ep;
NYX 0:85b3fd62ea1a 1078
NYX 0:85b3fd62ea1a 1079 ep = &hpcd->IN_ep[ep_addr & 0x7FU];
NYX 0:85b3fd62ea1a 1080
NYX 0:85b3fd62ea1a 1081 /*setup and start the Xfer */
NYX 0:85b3fd62ea1a 1082 ep->xfer_buff = pBuf;
NYX 0:85b3fd62ea1a 1083 ep->xfer_len = len;
NYX 0:85b3fd62ea1a 1084 ep->xfer_count = 0U;
NYX 0:85b3fd62ea1a 1085 ep->is_in = 1U;
NYX 0:85b3fd62ea1a 1086 ep->num = ep_addr & 0x7FU;
NYX 0:85b3fd62ea1a 1087
NYX 0:85b3fd62ea1a 1088 if (hpcd->Init.dma_enable == 1U)
NYX 0:85b3fd62ea1a 1089 {
NYX 0:85b3fd62ea1a 1090 ep->dma_addr = (uint32_t)pBuf;
NYX 0:85b3fd62ea1a 1091 }
NYX 0:85b3fd62ea1a 1092
NYX 0:85b3fd62ea1a 1093 __HAL_LOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1094
NYX 0:85b3fd62ea1a 1095 if ((ep_addr & 0x7FU) == 0U)
NYX 0:85b3fd62ea1a 1096 {
NYX 0:85b3fd62ea1a 1097 USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
NYX 0:85b3fd62ea1a 1098 }
NYX 0:85b3fd62ea1a 1099 else
NYX 0:85b3fd62ea1a 1100 {
NYX 0:85b3fd62ea1a 1101 USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
NYX 0:85b3fd62ea1a 1102 }
NYX 0:85b3fd62ea1a 1103
NYX 0:85b3fd62ea1a 1104 __HAL_UNLOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1105
NYX 0:85b3fd62ea1a 1106 return HAL_OK;
NYX 0:85b3fd62ea1a 1107 }
NYX 0:85b3fd62ea1a 1108
NYX 0:85b3fd62ea1a 1109 /**
NYX 0:85b3fd62ea1a 1110 * @brief Set a STALL condition over an endpoint.
NYX 0:85b3fd62ea1a 1111 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1112 * @param ep_addr: endpoint address
NYX 0:85b3fd62ea1a 1113 * @retval HAL status
NYX 0:85b3fd62ea1a 1114 */
NYX 0:85b3fd62ea1a 1115 HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
NYX 0:85b3fd62ea1a 1116 {
NYX 0:85b3fd62ea1a 1117 USB_OTG_EPTypeDef *ep;
NYX 0:85b3fd62ea1a 1118
NYX 0:85b3fd62ea1a 1119 if ((0x80U & ep_addr) == 0x80U)
NYX 0:85b3fd62ea1a 1120 {
NYX 0:85b3fd62ea1a 1121 ep = &hpcd->IN_ep[ep_addr & 0x7FU];
NYX 0:85b3fd62ea1a 1122 }
NYX 0:85b3fd62ea1a 1123 else
NYX 0:85b3fd62ea1a 1124 {
NYX 0:85b3fd62ea1a 1125 ep = &hpcd->OUT_ep[ep_addr];
NYX 0:85b3fd62ea1a 1126 }
NYX 0:85b3fd62ea1a 1127
NYX 0:85b3fd62ea1a 1128 ep->is_stall = 1U;
NYX 0:85b3fd62ea1a 1129 ep->num = ep_addr & 0x7FU;
NYX 0:85b3fd62ea1a 1130 ep->is_in = ((ep_addr & 0x80U) == 0x80U);
NYX 0:85b3fd62ea1a 1131
NYX 0:85b3fd62ea1a 1132
NYX 0:85b3fd62ea1a 1133 __HAL_LOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1134 USB_EPSetStall(hpcd->Instance , ep);
NYX 0:85b3fd62ea1a 1135 if((ep_addr & 0x7FU) == 0U)
NYX 0:85b3fd62ea1a 1136 {
NYX 0:85b3fd62ea1a 1137 USB_EP0_OutStart(hpcd->Instance, hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup);
NYX 0:85b3fd62ea1a 1138 }
NYX 0:85b3fd62ea1a 1139 __HAL_UNLOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1140
NYX 0:85b3fd62ea1a 1141 return HAL_OK;
NYX 0:85b3fd62ea1a 1142 }
NYX 0:85b3fd62ea1a 1143
NYX 0:85b3fd62ea1a 1144 /**
NYX 0:85b3fd62ea1a 1145 * @brief Clear a STALL condition over in an endpoint.
NYX 0:85b3fd62ea1a 1146 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1147 * @param ep_addr: endpoint address
NYX 0:85b3fd62ea1a 1148 * @retval HAL status
NYX 0:85b3fd62ea1a 1149 */
NYX 0:85b3fd62ea1a 1150 HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
NYX 0:85b3fd62ea1a 1151 {
NYX 0:85b3fd62ea1a 1152 USB_OTG_EPTypeDef *ep;
NYX 0:85b3fd62ea1a 1153
NYX 0:85b3fd62ea1a 1154 if ((0x80U & ep_addr) == 0x80U)
NYX 0:85b3fd62ea1a 1155 {
NYX 0:85b3fd62ea1a 1156 ep = &hpcd->IN_ep[ep_addr & 0x7FU];
NYX 0:85b3fd62ea1a 1157 }
NYX 0:85b3fd62ea1a 1158 else
NYX 0:85b3fd62ea1a 1159 {
NYX 0:85b3fd62ea1a 1160 ep = &hpcd->OUT_ep[ep_addr];
NYX 0:85b3fd62ea1a 1161 }
NYX 0:85b3fd62ea1a 1162
NYX 0:85b3fd62ea1a 1163 ep->is_stall = 0U;
NYX 0:85b3fd62ea1a 1164 ep->num = ep_addr & 0x7FU;
NYX 0:85b3fd62ea1a 1165 ep->is_in = ((ep_addr & 0x80U) == 0x80U);
NYX 0:85b3fd62ea1a 1166
NYX 0:85b3fd62ea1a 1167 __HAL_LOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1168 USB_EPClearStall(hpcd->Instance , ep);
NYX 0:85b3fd62ea1a 1169 __HAL_UNLOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1170
NYX 0:85b3fd62ea1a 1171 return HAL_OK;
NYX 0:85b3fd62ea1a 1172 }
NYX 0:85b3fd62ea1a 1173
NYX 0:85b3fd62ea1a 1174 /**
NYX 0:85b3fd62ea1a 1175 * @brief Flush an endpoint.
NYX 0:85b3fd62ea1a 1176 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1177 * @param ep_addr: endpoint address
NYX 0:85b3fd62ea1a 1178 * @retval HAL status
NYX 0:85b3fd62ea1a 1179 */
NYX 0:85b3fd62ea1a 1180 HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
NYX 0:85b3fd62ea1a 1181 {
NYX 0:85b3fd62ea1a 1182 __HAL_LOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1183 if ((ep_addr & 0x80U) == 0x80U)
NYX 0:85b3fd62ea1a 1184 {
NYX 0:85b3fd62ea1a 1185 USB_FlushTxFifo(hpcd->Instance, ep_addr & 0x7FU);
NYX 0:85b3fd62ea1a 1186 }
NYX 0:85b3fd62ea1a 1187 else
NYX 0:85b3fd62ea1a 1188 {
NYX 0:85b3fd62ea1a 1189 USB_FlushRxFifo(hpcd->Instance);
NYX 0:85b3fd62ea1a 1190 }
NYX 0:85b3fd62ea1a 1191
NYX 0:85b3fd62ea1a 1192 __HAL_UNLOCK(&hpcd->EPLock[ep_addr & 0x7FU]);
NYX 0:85b3fd62ea1a 1193
NYX 0:85b3fd62ea1a 1194 return HAL_OK;
NYX 0:85b3fd62ea1a 1195 }
NYX 0:85b3fd62ea1a 1196
NYX 0:85b3fd62ea1a 1197 /**
NYX 0:85b3fd62ea1a 1198 * @brief Activate remote wakeup signalling.
NYX 0:85b3fd62ea1a 1199 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1200 * @retval HAL status
NYX 0:85b3fd62ea1a 1201 */
NYX 0:85b3fd62ea1a 1202 HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 1203 {
NYX 0:85b3fd62ea1a 1204 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
NYX 0:85b3fd62ea1a 1205
NYX 0:85b3fd62ea1a 1206 if((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)
NYX 0:85b3fd62ea1a 1207 {
NYX 0:85b3fd62ea1a 1208 /* Activate Remote wakeup signaling */
NYX 0:85b3fd62ea1a 1209 USBx_DEVICE->DCTL |= USB_OTG_DCTL_RWUSIG;
NYX 0:85b3fd62ea1a 1210 }
NYX 0:85b3fd62ea1a 1211 return HAL_OK;
NYX 0:85b3fd62ea1a 1212 }
NYX 0:85b3fd62ea1a 1213
NYX 0:85b3fd62ea1a 1214 /**
NYX 0:85b3fd62ea1a 1215 * @brief De-activate remote wakeup signalling.
NYX 0:85b3fd62ea1a 1216 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1217 * @retval HAL status
NYX 0:85b3fd62ea1a 1218 */
NYX 0:85b3fd62ea1a 1219 HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 1220 {
NYX 0:85b3fd62ea1a 1221 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
NYX 0:85b3fd62ea1a 1222
NYX 0:85b3fd62ea1a 1223 /* De-activate Remote wakeup signaling */
NYX 0:85b3fd62ea1a 1224 USBx_DEVICE->DCTL &= ~(USB_OTG_DCTL_RWUSIG);
NYX 0:85b3fd62ea1a 1225 return HAL_OK;
NYX 0:85b3fd62ea1a 1226 }
NYX 0:85b3fd62ea1a 1227 /**
NYX 0:85b3fd62ea1a 1228 * @}
NYX 0:85b3fd62ea1a 1229 */
NYX 0:85b3fd62ea1a 1230
NYX 0:85b3fd62ea1a 1231 /** @defgroup PCD_Exported_Functions_Group4 Peripheral State functions
NYX 0:85b3fd62ea1a 1232 * @brief Peripheral State functions
NYX 0:85b3fd62ea1a 1233 *
NYX 0:85b3fd62ea1a 1234 @verbatim
NYX 0:85b3fd62ea1a 1235 ===============================================================================
NYX 0:85b3fd62ea1a 1236 ##### Peripheral State functions #####
NYX 0:85b3fd62ea1a 1237 ===============================================================================
NYX 0:85b3fd62ea1a 1238 [..]
NYX 0:85b3fd62ea1a 1239 This subsection permits to get in run-time the status of the peripheral
NYX 0:85b3fd62ea1a 1240 and the data flow.
NYX 0:85b3fd62ea1a 1241
NYX 0:85b3fd62ea1a 1242 @endverbatim
NYX 0:85b3fd62ea1a 1243 * @{
NYX 0:85b3fd62ea1a 1244 */
NYX 0:85b3fd62ea1a 1245
NYX 0:85b3fd62ea1a 1246 /**
NYX 0:85b3fd62ea1a 1247 * @brief Return the PCD handle state.
NYX 0:85b3fd62ea1a 1248 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1249 * @retval HAL state
NYX 0:85b3fd62ea1a 1250 */
NYX 0:85b3fd62ea1a 1251 PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd)
NYX 0:85b3fd62ea1a 1252 {
NYX 0:85b3fd62ea1a 1253 return hpcd->State;
NYX 0:85b3fd62ea1a 1254 }
NYX 0:85b3fd62ea1a 1255 /**
NYX 0:85b3fd62ea1a 1256 * @}
NYX 0:85b3fd62ea1a 1257 */
NYX 0:85b3fd62ea1a 1258
NYX 0:85b3fd62ea1a 1259 /**
NYX 0:85b3fd62ea1a 1260 * @}
NYX 0:85b3fd62ea1a 1261 */
NYX 0:85b3fd62ea1a 1262
NYX 0:85b3fd62ea1a 1263 /* Private functions ---------------------------------------------------------*/
NYX 0:85b3fd62ea1a 1264 /** @addtogroup PCD_Private_Functions
NYX 0:85b3fd62ea1a 1265 * @{
NYX 0:85b3fd62ea1a 1266 */
NYX 0:85b3fd62ea1a 1267
NYX 0:85b3fd62ea1a 1268 /**
NYX 0:85b3fd62ea1a 1269 * @brief Check FIFO for the next packet to be loaded.
NYX 0:85b3fd62ea1a 1270 * @param hpcd: PCD handle
NYX 0:85b3fd62ea1a 1271 * @param epnum : endpoint number
NYX 0:85b3fd62ea1a 1272 * @retval HAL status
NYX 0:85b3fd62ea1a 1273 */
NYX 0:85b3fd62ea1a 1274 static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
NYX 0:85b3fd62ea1a 1275 {
NYX 0:85b3fd62ea1a 1276 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
NYX 0:85b3fd62ea1a 1277 USB_OTG_EPTypeDef *ep;
NYX 0:85b3fd62ea1a 1278 int32_t len = 0U;
NYX 0:85b3fd62ea1a 1279 uint32_t len32b;
NYX 0:85b3fd62ea1a 1280 uint32_t fifoemptymsk = 0U;
NYX 0:85b3fd62ea1a 1281
NYX 0:85b3fd62ea1a 1282 ep = &hpcd->IN_ep[epnum];
NYX 0:85b3fd62ea1a 1283 len = ep->xfer_len - ep->xfer_count;
NYX 0:85b3fd62ea1a 1284
NYX 0:85b3fd62ea1a 1285 if (len > ep->maxpacket)
NYX 0:85b3fd62ea1a 1286 {
NYX 0:85b3fd62ea1a 1287 len = ep->maxpacket;
NYX 0:85b3fd62ea1a 1288 }
NYX 0:85b3fd62ea1a 1289
NYX 0:85b3fd62ea1a 1290
NYX 0:85b3fd62ea1a 1291 len32b = (len + 3U) / 4U;
NYX 0:85b3fd62ea1a 1292
NYX 0:85b3fd62ea1a 1293 while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b) &&
NYX 0:85b3fd62ea1a 1294 (ep->xfer_count < ep->xfer_len) &&
NYX 0:85b3fd62ea1a 1295 (ep->xfer_len != 0U))
NYX 0:85b3fd62ea1a 1296 {
NYX 0:85b3fd62ea1a 1297 /* Write the FIFO */
NYX 0:85b3fd62ea1a 1298 len = ep->xfer_len - ep->xfer_count;
NYX 0:85b3fd62ea1a 1299
NYX 0:85b3fd62ea1a 1300 if (len > ep->maxpacket)
NYX 0:85b3fd62ea1a 1301 {
NYX 0:85b3fd62ea1a 1302 len = ep->maxpacket;
NYX 0:85b3fd62ea1a 1303 }
NYX 0:85b3fd62ea1a 1304 len32b = (len + 3U) / 4U;
NYX 0:85b3fd62ea1a 1305
NYX 0:85b3fd62ea1a 1306 USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable);
NYX 0:85b3fd62ea1a 1307
NYX 0:85b3fd62ea1a 1308 ep->xfer_buff += len;
NYX 0:85b3fd62ea1a 1309 ep->xfer_count += len;
NYX 0:85b3fd62ea1a 1310 }
NYX 0:85b3fd62ea1a 1311
NYX 0:85b3fd62ea1a 1312 if(len <= 0U)
NYX 0:85b3fd62ea1a 1313 {
NYX 0:85b3fd62ea1a 1314 fifoemptymsk = 0x1U << epnum;
NYX 0:85b3fd62ea1a 1315 atomic_clr_u32(&USBx_DEVICE->DIEPEMPMSK, fifoemptymsk);
NYX 0:85b3fd62ea1a 1316 }
NYX 0:85b3fd62ea1a 1317
NYX 0:85b3fd62ea1a 1318 return HAL_OK;
NYX 0:85b3fd62ea1a 1319 }
NYX 0:85b3fd62ea1a 1320
NYX 0:85b3fd62ea1a 1321 /**
NYX 0:85b3fd62ea1a 1322 * @}
NYX 0:85b3fd62ea1a 1323 */
NYX 0:85b3fd62ea1a 1324 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx ||
NYX 0:85b3fd62ea1a 1325 STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Rx ||
NYX 0:85b3fd62ea1a 1326 STM32F412Vx || STM32F412Cx || STM32F413xx || STM32F423xx */
NYX 0:85b3fd62ea1a 1327 #endif /* HAL_PCD_MODULE_ENABLED */
NYX 0:85b3fd62ea1a 1328 /**
NYX 0:85b3fd62ea1a 1329 * @}
NYX 0:85b3fd62ea1a 1330 */
NYX 0:85b3fd62ea1a 1331
NYX 0:85b3fd62ea1a 1332 /**
NYX 0:85b3fd62ea1a 1333 * @}
NYX 0:85b3fd62ea1a 1334 */
NYX 0:85b3fd62ea1a 1335
NYX 0:85b3fd62ea1a 1336 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/