Aditya Mehrotra / mbed-dev

Dependents:   CAN_TEST SPIne_Plus_DYNO_SENSORS SPIne_Plus_v2 SPIne_Plus_Dyno_v2

Committer:
saloutos
Date:
Thu Nov 26 04:08:56 2020 +0000
Revision:
0:083111ae2a11
first commit of leaned mbed dev lib

Who changed what in which revision?

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