001

Committer:
ganlikun
Date:
Sun Jun 12 14:02:44 2022 +0000
Revision:
0:13413ea9a877
00

Who changed what in which revision?

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