TUKS MCU Introductory course / TUKS-COURSE-TIMER
Committer:
elmot
Date:
Fri Feb 24 21:13:56 2017 +0000
Revision:
1:d0dfbce63a89
Ready-to-copy

Who changed what in which revision?

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