added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

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