inport from local

Dependents:   Hobbyking_Cheetah_0511

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NYX 0:85b3fd62ea1a 1 /**
NYX 0:85b3fd62ea1a 2 ******************************************************************************
NYX 0:85b3fd62ea1a 3 * @file stm32f4xx_hal_hcd.c
NYX 0:85b3fd62ea1a 4 * @author MCD Application Team
NYX 0:85b3fd62ea1a 5 * @version V1.7.1
NYX 0:85b3fd62ea1a 6 * @date 14-April-2017
NYX 0:85b3fd62ea1a 7 * @brief HCD HAL module driver.
NYX 0:85b3fd62ea1a 8 * This file provides firmware functions to manage the following
NYX 0:85b3fd62ea1a 9 * functionalities of the USB Peripheral Controller:
NYX 0:85b3fd62ea1a 10 * + Initialization and de-initialization functions
NYX 0:85b3fd62ea1a 11 * + IO operation functions
NYX 0:85b3fd62ea1a 12 * + Peripheral Control functions
NYX 0:85b3fd62ea1a 13 * + Peripheral State functions
NYX 0:85b3fd62ea1a 14 *
NYX 0:85b3fd62ea1a 15 @verbatim
NYX 0:85b3fd62ea1a 16 ==============================================================================
NYX 0:85b3fd62ea1a 17 ##### How to use this driver #####
NYX 0:85b3fd62ea1a 18 ==============================================================================
NYX 0:85b3fd62ea1a 19 [..]
NYX 0:85b3fd62ea1a 20 (#)Declare a HCD_HandleTypeDef handle structure, for example:
NYX 0:85b3fd62ea1a 21 HCD_HandleTypeDef hhcd;
NYX 0:85b3fd62ea1a 22
NYX 0:85b3fd62ea1a 23 (#)Fill parameters of Init structure in HCD handle
NYX 0:85b3fd62ea1a 24
NYX 0:85b3fd62ea1a 25 (#)Call HAL_HCD_Init() API to initialize the HCD peripheral (Core, Host core, ...)
NYX 0:85b3fd62ea1a 26
NYX 0:85b3fd62ea1a 27 (#)Initialize the HCD low level resources through the HAL_HCD_MspInit() API:
NYX 0:85b3fd62ea1a 28 (##) Enable the HCD/USB Low Level interface clock using the following macros
NYX 0:85b3fd62ea1a 29 (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
NYX 0:85b3fd62ea1a 30 (+++) __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); (For High Speed Mode)
NYX 0:85b3fd62ea1a 31 (+++) __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE(); (For High Speed Mode)
NYX 0:85b3fd62ea1a 32
NYX 0:85b3fd62ea1a 33 (##) Initialize the related GPIO clocks
NYX 0:85b3fd62ea1a 34 (##) Configure HCD pin-out
NYX 0:85b3fd62ea1a 35 (##) Configure HCD NVIC interrupt
NYX 0:85b3fd62ea1a 36
NYX 0:85b3fd62ea1a 37 (#)Associate the Upper USB Host stack to the HAL HCD Driver:
NYX 0:85b3fd62ea1a 38 (##) hhcd.pData = phost;
NYX 0:85b3fd62ea1a 39
NYX 0:85b3fd62ea1a 40 (#)Enable HCD transmission and reception:
NYX 0:85b3fd62ea1a 41 (##) HAL_HCD_Start();
NYX 0:85b3fd62ea1a 42
NYX 0:85b3fd62ea1a 43 @endverbatim
NYX 0:85b3fd62ea1a 44 ******************************************************************************
NYX 0:85b3fd62ea1a 45 * @attention
NYX 0:85b3fd62ea1a 46 *
NYX 0:85b3fd62ea1a 47 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
NYX 0:85b3fd62ea1a 48 *
NYX 0:85b3fd62ea1a 49 * Redistribution and use in source and binary forms, with or without modification,
NYX 0:85b3fd62ea1a 50 * are permitted provided that the following conditions are met:
NYX 0:85b3fd62ea1a 51 * 1. Redistributions of source code must retain the above copyright notice,
NYX 0:85b3fd62ea1a 52 * this list of conditions and the following disclaimer.
NYX 0:85b3fd62ea1a 53 * 2. Redistributions in binary form must reproduce the above copyright notice,
NYX 0:85b3fd62ea1a 54 * this list of conditions and the following disclaimer in the documentation
NYX 0:85b3fd62ea1a 55 * and/or other materials provided with the distribution.
NYX 0:85b3fd62ea1a 56 * 3. Neither the name of STMicroelectronics nor the names of its contributors
NYX 0:85b3fd62ea1a 57 * may be used to endorse or promote products derived from this software
NYX 0:85b3fd62ea1a 58 * without specific prior written permission.
NYX 0:85b3fd62ea1a 59 *
NYX 0:85b3fd62ea1a 60 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
NYX 0:85b3fd62ea1a 61 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
NYX 0:85b3fd62ea1a 62 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
NYX 0:85b3fd62ea1a 63 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
NYX 0:85b3fd62ea1a 64 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
NYX 0:85b3fd62ea1a 65 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
NYX 0:85b3fd62ea1a 66 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
NYX 0:85b3fd62ea1a 67 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
NYX 0:85b3fd62ea1a 68 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
NYX 0:85b3fd62ea1a 69 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NYX 0:85b3fd62ea1a 70 *
NYX 0:85b3fd62ea1a 71 ******************************************************************************
NYX 0:85b3fd62ea1a 72 */
NYX 0:85b3fd62ea1a 73
NYX 0:85b3fd62ea1a 74 /* Includes ------------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 75 #include "stm32f4xx_hal.h"
NYX 0:85b3fd62ea1a 76
NYX 0:85b3fd62ea1a 77 /** @addtogroup STM32F4xx_HAL_Driver
NYX 0:85b3fd62ea1a 78 * @{
NYX 0:85b3fd62ea1a 79 */
NYX 0:85b3fd62ea1a 80
NYX 0:85b3fd62ea1a 81 /** @defgroup HCD HCD
NYX 0:85b3fd62ea1a 82 * @brief HCD HAL module driver
NYX 0:85b3fd62ea1a 83 * @{
NYX 0:85b3fd62ea1a 84 */
NYX 0:85b3fd62ea1a 85
NYX 0:85b3fd62ea1a 86 #ifdef HAL_HCD_MODULE_ENABLED
NYX 0:85b3fd62ea1a 87 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \
NYX 0:85b3fd62ea1a 88 defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
NYX 0:85b3fd62ea1a 89 defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \
NYX 0:85b3fd62ea1a 90 defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \
NYX 0:85b3fd62ea1a 91 defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx)
NYX 0:85b3fd62ea1a 92 /* Private typedef -----------------------------------------------------------*/
NYX 0:85b3fd62ea1a 93 /* Private define ------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 94 /* Private macro -------------------------------------------------------------*/
NYX 0:85b3fd62ea1a 95 /* Private variables ---------------------------------------------------------*/
NYX 0:85b3fd62ea1a 96 /* Private function prototypes -----------------------------------------------*/
NYX 0:85b3fd62ea1a 97 /** @defgroup HCD_Private_Functions HCD Private Functions
NYX 0:85b3fd62ea1a 98 * @{
NYX 0:85b3fd62ea1a 99 */
NYX 0:85b3fd62ea1a 100 static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
NYX 0:85b3fd62ea1a 101 static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum);
NYX 0:85b3fd62ea1a 102 static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd);
NYX 0:85b3fd62ea1a 103 static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd);
NYX 0:85b3fd62ea1a 104 /**
NYX 0:85b3fd62ea1a 105 * @}
NYX 0:85b3fd62ea1a 106 */
NYX 0:85b3fd62ea1a 107
NYX 0:85b3fd62ea1a 108 /* Exported functions --------------------------------------------------------*/
NYX 0:85b3fd62ea1a 109 /** @defgroup HCD_Exported_Functions HCD Exported Functions
NYX 0:85b3fd62ea1a 110 * @{
NYX 0:85b3fd62ea1a 111 */
NYX 0:85b3fd62ea1a 112
NYX 0:85b3fd62ea1a 113 /** @defgroup HCD_Exported_Functions_Group1 Initialization and de-initialization functions
NYX 0:85b3fd62ea1a 114 * @brief Initialization and Configuration functions
NYX 0:85b3fd62ea1a 115 *
NYX 0:85b3fd62ea1a 116 @verbatim
NYX 0:85b3fd62ea1a 117 ===============================================================================
NYX 0:85b3fd62ea1a 118 ##### Initialization and de-initialization functions #####
NYX 0:85b3fd62ea1a 119 ===============================================================================
NYX 0:85b3fd62ea1a 120 [..] This section provides functions allowing to:
NYX 0:85b3fd62ea1a 121
NYX 0:85b3fd62ea1a 122 @endverbatim
NYX 0:85b3fd62ea1a 123 * @{
NYX 0:85b3fd62ea1a 124 */
NYX 0:85b3fd62ea1a 125
NYX 0:85b3fd62ea1a 126 /**
NYX 0:85b3fd62ea1a 127 * @brief Initialize the host driver.
NYX 0:85b3fd62ea1a 128 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 129 * @retval HAL status
NYX 0:85b3fd62ea1a 130 */
NYX 0:85b3fd62ea1a 131 HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 132 {
NYX 0:85b3fd62ea1a 133 /* Check the HCD handle allocation */
NYX 0:85b3fd62ea1a 134 if(hhcd == NULL)
NYX 0:85b3fd62ea1a 135 {
NYX 0:85b3fd62ea1a 136 return HAL_ERROR;
NYX 0:85b3fd62ea1a 137 }
NYX 0:85b3fd62ea1a 138
NYX 0:85b3fd62ea1a 139 /* Check the parameters */
NYX 0:85b3fd62ea1a 140 assert_param(IS_HCD_ALL_INSTANCE(hhcd->Instance));
NYX 0:85b3fd62ea1a 141
NYX 0:85b3fd62ea1a 142 hhcd->State = HAL_HCD_STATE_BUSY;
NYX 0:85b3fd62ea1a 143
NYX 0:85b3fd62ea1a 144 /* Init the low level hardware : GPIO, CLOCK, NVIC... */
NYX 0:85b3fd62ea1a 145 HAL_HCD_MspInit(hhcd);
NYX 0:85b3fd62ea1a 146
NYX 0:85b3fd62ea1a 147 /* Disable the Interrupts */
NYX 0:85b3fd62ea1a 148 __HAL_HCD_DISABLE(hhcd);
NYX 0:85b3fd62ea1a 149
NYX 0:85b3fd62ea1a 150 /* Init the Core (common init.) */
NYX 0:85b3fd62ea1a 151 USB_CoreInit(hhcd->Instance, hhcd->Init);
NYX 0:85b3fd62ea1a 152
NYX 0:85b3fd62ea1a 153 /* Force Host Mode*/
NYX 0:85b3fd62ea1a 154 USB_SetCurrentMode(hhcd->Instance , USB_OTG_HOST_MODE);
NYX 0:85b3fd62ea1a 155
NYX 0:85b3fd62ea1a 156 /* Init Host */
NYX 0:85b3fd62ea1a 157 USB_HostInit(hhcd->Instance, hhcd->Init);
NYX 0:85b3fd62ea1a 158
NYX 0:85b3fd62ea1a 159 hhcd->State= HAL_HCD_STATE_READY;
NYX 0:85b3fd62ea1a 160
NYX 0:85b3fd62ea1a 161 return HAL_OK;
NYX 0:85b3fd62ea1a 162 }
NYX 0:85b3fd62ea1a 163
NYX 0:85b3fd62ea1a 164 /**
NYX 0:85b3fd62ea1a 165 * @brief Initialize a host channel.
NYX 0:85b3fd62ea1a 166 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 167 * @param ch_num: Channel number.
NYX 0:85b3fd62ea1a 168 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 169 * @param epnum: Endpoint number.
NYX 0:85b3fd62ea1a 170 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 171 * @param dev_address : Current device address
NYX 0:85b3fd62ea1a 172 * This parameter can be a value from 0 to 255
NYX 0:85b3fd62ea1a 173 * @param speed: Current device speed.
NYX 0:85b3fd62ea1a 174 * This parameter can be one of these values:
NYX 0:85b3fd62ea1a 175 * HCD_SPEED_HIGH: High speed mode,
NYX 0:85b3fd62ea1a 176 * HCD_SPEED_FULL: Full speed mode,
NYX 0:85b3fd62ea1a 177 * HCD_SPEED_LOW: Low speed mode
NYX 0:85b3fd62ea1a 178 * @param ep_type: Endpoint Type.
NYX 0:85b3fd62ea1a 179 * This parameter can be one of these values:
NYX 0:85b3fd62ea1a 180 * EP_TYPE_CTRL: Control type,
NYX 0:85b3fd62ea1a 181 * EP_TYPE_ISOC: Isochronous type,
NYX 0:85b3fd62ea1a 182 * EP_TYPE_BULK: Bulk type,
NYX 0:85b3fd62ea1a 183 * EP_TYPE_INTR: Interrupt type
NYX 0:85b3fd62ea1a 184 * @param mps: Max Packet Size.
NYX 0:85b3fd62ea1a 185 * This parameter can be a value from 0 to32K
NYX 0:85b3fd62ea1a 186 * @retval HAL status
NYX 0:85b3fd62ea1a 187 */
NYX 0:85b3fd62ea1a 188 HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd,
NYX 0:85b3fd62ea1a 189 uint8_t ch_num,
NYX 0:85b3fd62ea1a 190 uint8_t epnum,
NYX 0:85b3fd62ea1a 191 uint8_t dev_address,
NYX 0:85b3fd62ea1a 192 uint8_t speed,
NYX 0:85b3fd62ea1a 193 uint8_t ep_type,
NYX 0:85b3fd62ea1a 194 uint16_t mps)
NYX 0:85b3fd62ea1a 195 {
NYX 0:85b3fd62ea1a 196 HAL_StatusTypeDef status = HAL_OK;
NYX 0:85b3fd62ea1a 197
NYX 0:85b3fd62ea1a 198 __HAL_LOCK(hhcd);
NYX 0:85b3fd62ea1a 199
NYX 0:85b3fd62ea1a 200 hhcd->hc[ch_num].dev_addr = dev_address;
NYX 0:85b3fd62ea1a 201 hhcd->hc[ch_num].max_packet = mps;
NYX 0:85b3fd62ea1a 202 hhcd->hc[ch_num].ch_num = ch_num;
NYX 0:85b3fd62ea1a 203 hhcd->hc[ch_num].ep_type = ep_type;
NYX 0:85b3fd62ea1a 204 hhcd->hc[ch_num].ep_num = epnum & 0x7FU;
NYX 0:85b3fd62ea1a 205 hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80U) == 0x80U);
NYX 0:85b3fd62ea1a 206 hhcd->hc[ch_num].speed = speed;
NYX 0:85b3fd62ea1a 207 /* reset to 0 */
NYX 0:85b3fd62ea1a 208 hhcd->hc[ch_num].toggle_out = 0;
NYX 0:85b3fd62ea1a 209 hhcd->hc[ch_num].toggle_in = 0;
NYX 0:85b3fd62ea1a 210
NYX 0:85b3fd62ea1a 211 status = USB_HC_Init(hhcd->Instance,
NYX 0:85b3fd62ea1a 212 ch_num,
NYX 0:85b3fd62ea1a 213 epnum,
NYX 0:85b3fd62ea1a 214 dev_address,
NYX 0:85b3fd62ea1a 215 speed,
NYX 0:85b3fd62ea1a 216 ep_type,
NYX 0:85b3fd62ea1a 217 mps);
NYX 0:85b3fd62ea1a 218 __HAL_UNLOCK(hhcd);
NYX 0:85b3fd62ea1a 219
NYX 0:85b3fd62ea1a 220 return status;
NYX 0:85b3fd62ea1a 221 }
NYX 0:85b3fd62ea1a 222
NYX 0:85b3fd62ea1a 223 /**
NYX 0:85b3fd62ea1a 224 * @brief Halt a host channel.
NYX 0:85b3fd62ea1a 225 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 226 * @param ch_num: Channel number.
NYX 0:85b3fd62ea1a 227 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 228 * @retval HAL status
NYX 0:85b3fd62ea1a 229 */
NYX 0:85b3fd62ea1a 230 HAL_StatusTypeDef HAL_HCD_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num)
NYX 0:85b3fd62ea1a 231 {
NYX 0:85b3fd62ea1a 232 HAL_StatusTypeDef status = HAL_OK;
NYX 0:85b3fd62ea1a 233
NYX 0:85b3fd62ea1a 234 __HAL_LOCK(hhcd);
NYX 0:85b3fd62ea1a 235 USB_HC_Halt(hhcd->Instance, ch_num);
NYX 0:85b3fd62ea1a 236 __HAL_UNLOCK(hhcd);
NYX 0:85b3fd62ea1a 237
NYX 0:85b3fd62ea1a 238 return status;
NYX 0:85b3fd62ea1a 239 }
NYX 0:85b3fd62ea1a 240
NYX 0:85b3fd62ea1a 241 /**
NYX 0:85b3fd62ea1a 242 * @brief DeInitialize the host driver.
NYX 0:85b3fd62ea1a 243 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 244 * @retval HAL status
NYX 0:85b3fd62ea1a 245 */
NYX 0:85b3fd62ea1a 246 HAL_StatusTypeDef HAL_HCD_DeInit(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 247 {
NYX 0:85b3fd62ea1a 248 /* Check the HCD handle allocation */
NYX 0:85b3fd62ea1a 249 if(hhcd == NULL)
NYX 0:85b3fd62ea1a 250 {
NYX 0:85b3fd62ea1a 251 return HAL_ERROR;
NYX 0:85b3fd62ea1a 252 }
NYX 0:85b3fd62ea1a 253
NYX 0:85b3fd62ea1a 254 hhcd->State = HAL_HCD_STATE_BUSY;
NYX 0:85b3fd62ea1a 255
NYX 0:85b3fd62ea1a 256 /* DeInit the low level hardware */
NYX 0:85b3fd62ea1a 257 HAL_HCD_MspDeInit(hhcd);
NYX 0:85b3fd62ea1a 258
NYX 0:85b3fd62ea1a 259 __HAL_HCD_DISABLE(hhcd);
NYX 0:85b3fd62ea1a 260
NYX 0:85b3fd62ea1a 261 hhcd->State = HAL_HCD_STATE_RESET;
NYX 0:85b3fd62ea1a 262
NYX 0:85b3fd62ea1a 263 return HAL_OK;
NYX 0:85b3fd62ea1a 264 }
NYX 0:85b3fd62ea1a 265
NYX 0:85b3fd62ea1a 266 /**
NYX 0:85b3fd62ea1a 267 * @brief Initialize the HCD MSP.
NYX 0:85b3fd62ea1a 268 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 269 * @retval None
NYX 0:85b3fd62ea1a 270 */
NYX 0:85b3fd62ea1a 271 __weak void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 272 {
NYX 0:85b3fd62ea1a 273 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 274 UNUSED(hhcd);
NYX 0:85b3fd62ea1a 275 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 276 the HAL_PCD_MspInit could be implemented in the user file
NYX 0:85b3fd62ea1a 277 */
NYX 0:85b3fd62ea1a 278 }
NYX 0:85b3fd62ea1a 279
NYX 0:85b3fd62ea1a 280 /**
NYX 0:85b3fd62ea1a 281 * @brief DeInitialize the HCD MSP.
NYX 0:85b3fd62ea1a 282 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 283 * @retval None
NYX 0:85b3fd62ea1a 284 */
NYX 0:85b3fd62ea1a 285 __weak void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 286 {
NYX 0:85b3fd62ea1a 287 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 288 UNUSED(hhcd);
NYX 0:85b3fd62ea1a 289 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 290 the HAL_PCD_MspDeInit could be implemented in the user file
NYX 0:85b3fd62ea1a 291 */
NYX 0:85b3fd62ea1a 292 }
NYX 0:85b3fd62ea1a 293
NYX 0:85b3fd62ea1a 294 /**
NYX 0:85b3fd62ea1a 295 * @}
NYX 0:85b3fd62ea1a 296 */
NYX 0:85b3fd62ea1a 297
NYX 0:85b3fd62ea1a 298 /** @defgroup HCD_Exported_Functions_Group2 Input and Output operation functions
NYX 0:85b3fd62ea1a 299 * @brief HCD IO operation functions
NYX 0:85b3fd62ea1a 300 *
NYX 0:85b3fd62ea1a 301 @verbatim
NYX 0:85b3fd62ea1a 302 ===============================================================================
NYX 0:85b3fd62ea1a 303 ##### IO operation functions #####
NYX 0:85b3fd62ea1a 304 ===============================================================================
NYX 0:85b3fd62ea1a 305 [..] This subsection provides a set of functions allowing to manage the USB Host Data
NYX 0:85b3fd62ea1a 306 Transfer
NYX 0:85b3fd62ea1a 307
NYX 0:85b3fd62ea1a 308 @endverbatim
NYX 0:85b3fd62ea1a 309 * @{
NYX 0:85b3fd62ea1a 310 */
NYX 0:85b3fd62ea1a 311
NYX 0:85b3fd62ea1a 312 /**
NYX 0:85b3fd62ea1a 313 * @brief Submit a new URB for processing.
NYX 0:85b3fd62ea1a 314 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 315 * @param ch_num: Channel number.
NYX 0:85b3fd62ea1a 316 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 317 * @param direction: Channel number.
NYX 0:85b3fd62ea1a 318 * This parameter can be one of these values:
NYX 0:85b3fd62ea1a 319 * 0 : Output / 1 : Input
NYX 0:85b3fd62ea1a 320 * @param ep_type: Endpoint Type.
NYX 0:85b3fd62ea1a 321 * This parameter can be one of these values:
NYX 0:85b3fd62ea1a 322 * EP_TYPE_CTRL: Control type/
NYX 0:85b3fd62ea1a 323 * EP_TYPE_ISOC: Isochronous type/
NYX 0:85b3fd62ea1a 324 * EP_TYPE_BULK: Bulk type/
NYX 0:85b3fd62ea1a 325 * EP_TYPE_INTR: Interrupt type/
NYX 0:85b3fd62ea1a 326 * @param token: Endpoint Type.
NYX 0:85b3fd62ea1a 327 * This parameter can be one of these values:
NYX 0:85b3fd62ea1a 328 * 0: HC_PID_SETUP / 1: HC_PID_DATA1
NYX 0:85b3fd62ea1a 329 * @param pbuff: pointer to URB data
NYX 0:85b3fd62ea1a 330 * @param length: Length of URB data
NYX 0:85b3fd62ea1a 331 * @param do_ping: activate do ping protocol (for high speed only).
NYX 0:85b3fd62ea1a 332 * This parameter can be one of these values:
NYX 0:85b3fd62ea1a 333 * 0 : do ping inactive / 1 : do ping active
NYX 0:85b3fd62ea1a 334 * @retval HAL status
NYX 0:85b3fd62ea1a 335 */
NYX 0:85b3fd62ea1a 336 HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd,
NYX 0:85b3fd62ea1a 337 uint8_t ch_num,
NYX 0:85b3fd62ea1a 338 uint8_t direction,
NYX 0:85b3fd62ea1a 339 uint8_t ep_type,
NYX 0:85b3fd62ea1a 340 uint8_t token,
NYX 0:85b3fd62ea1a 341 uint8_t* pbuff,
NYX 0:85b3fd62ea1a 342 uint16_t length,
NYX 0:85b3fd62ea1a 343 uint8_t do_ping)
NYX 0:85b3fd62ea1a 344 {
NYX 0:85b3fd62ea1a 345 if ((hhcd->hc[ch_num].ep_is_in != direction)) {
NYX 0:85b3fd62ea1a 346 if ((hhcd->hc[ch_num].ep_type == EP_TYPE_CTRL)){
NYX 0:85b3fd62ea1a 347 /* reconfigure the endpoint !!! from tx -> rx, and rx ->tx */
NYX 0:85b3fd62ea1a 348 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
NYX 0:85b3fd62ea1a 349 if (direction)
NYX 0:85b3fd62ea1a 350 {
NYX 0:85b3fd62ea1a 351 USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;
NYX 0:85b3fd62ea1a 352 USBx_HC(ch_num)->HCCHAR |= 1 << 15;
NYX 0:85b3fd62ea1a 353 }
NYX 0:85b3fd62ea1a 354 else
NYX 0:85b3fd62ea1a 355 {
NYX 0:85b3fd62ea1a 356 USBx_HC(ch_num)->HCINTMSK &= ~USB_OTG_HCINTMSK_BBERRM;
NYX 0:85b3fd62ea1a 357 USBx_HC(ch_num)->HCCHAR &= ~(1 << 15);
NYX 0:85b3fd62ea1a 358 }
NYX 0:85b3fd62ea1a 359 hhcd->hc[ch_num].ep_is_in = direction;
NYX 0:85b3fd62ea1a 360 /* if reception put toggle_in to 1 */
NYX 0:85b3fd62ea1a 361 if (direction == 1) hhcd->hc[ch_num].toggle_in=1;
NYX 0:85b3fd62ea1a 362 }
NYX 0:85b3fd62ea1a 363 }
NYX 0:85b3fd62ea1a 364 hhcd->hc[ch_num].ep_type = ep_type;
NYX 0:85b3fd62ea1a 365
NYX 0:85b3fd62ea1a 366 if(token == 0U)
NYX 0:85b3fd62ea1a 367 {
NYX 0:85b3fd62ea1a 368 hhcd->hc[ch_num].data_pid = HC_PID_SETUP;
NYX 0:85b3fd62ea1a 369 }
NYX 0:85b3fd62ea1a 370 else
NYX 0:85b3fd62ea1a 371 {
NYX 0:85b3fd62ea1a 372 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
NYX 0:85b3fd62ea1a 373 }
NYX 0:85b3fd62ea1a 374
NYX 0:85b3fd62ea1a 375 /* Manage Data Toggle */
NYX 0:85b3fd62ea1a 376 switch(ep_type)
NYX 0:85b3fd62ea1a 377 {
NYX 0:85b3fd62ea1a 378 case EP_TYPE_CTRL:
NYX 0:85b3fd62ea1a 379 if((token == 1) && (direction == 0)) /*send data */
NYX 0:85b3fd62ea1a 380 {
NYX 0:85b3fd62ea1a 381 if (length == 0)
NYX 0:85b3fd62ea1a 382 { /* For Status OUT stage, Length==0, Status Out PID = 1 */
NYX 0:85b3fd62ea1a 383 hhcd->hc[ch_num].toggle_out = 1;
NYX 0:85b3fd62ea1a 384 }
NYX 0:85b3fd62ea1a 385
NYX 0:85b3fd62ea1a 386 /* Set the Data Toggle bit as per the Flag */
NYX 0:85b3fd62ea1a 387 if (hhcd->hc[ch_num].toggle_out == 0)
NYX 0:85b3fd62ea1a 388 { /* Put the PID 0 */
NYX 0:85b3fd62ea1a 389 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
NYX 0:85b3fd62ea1a 390 }
NYX 0:85b3fd62ea1a 391 else
NYX 0:85b3fd62ea1a 392 { /* Put the PID 1 */
NYX 0:85b3fd62ea1a 393 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
NYX 0:85b3fd62ea1a 394 }
NYX 0:85b3fd62ea1a 395 if(hhcd->hc[ch_num].urb_state != URB_NOTREADY)
NYX 0:85b3fd62ea1a 396 {
NYX 0:85b3fd62ea1a 397 hhcd->hc[ch_num].do_ping = do_ping;
NYX 0:85b3fd62ea1a 398 }
NYX 0:85b3fd62ea1a 399 }
NYX 0:85b3fd62ea1a 400 else if ((token == 1) && (direction == 1))
NYX 0:85b3fd62ea1a 401 {
NYX 0:85b3fd62ea1a 402 if( hhcd->hc[ch_num].toggle_in == 0)
NYX 0:85b3fd62ea1a 403 {
NYX 0:85b3fd62ea1a 404 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
NYX 0:85b3fd62ea1a 405 }
NYX 0:85b3fd62ea1a 406 else
NYX 0:85b3fd62ea1a 407 {
NYX 0:85b3fd62ea1a 408 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
NYX 0:85b3fd62ea1a 409 }
NYX 0:85b3fd62ea1a 410 }
NYX 0:85b3fd62ea1a 411 break;
NYX 0:85b3fd62ea1a 412
NYX 0:85b3fd62ea1a 413 case EP_TYPE_BULK:
NYX 0:85b3fd62ea1a 414 if(direction == 0)
NYX 0:85b3fd62ea1a 415 {
NYX 0:85b3fd62ea1a 416 /* Set the Data Toggle bit as per the Flag */
NYX 0:85b3fd62ea1a 417 if ( hhcd->hc[ch_num].toggle_out == 0)
NYX 0:85b3fd62ea1a 418 { /* Put the PID 0 */
NYX 0:85b3fd62ea1a 419 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
NYX 0:85b3fd62ea1a 420 }
NYX 0:85b3fd62ea1a 421 else
NYX 0:85b3fd62ea1a 422 { /* Put the PID 1 */
NYX 0:85b3fd62ea1a 423 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
NYX 0:85b3fd62ea1a 424 }
NYX 0:85b3fd62ea1a 425 if(hhcd->hc[ch_num].urb_state != URB_NOTREADY)
NYX 0:85b3fd62ea1a 426 {
NYX 0:85b3fd62ea1a 427 hhcd->hc[ch_num].do_ping = do_ping;
NYX 0:85b3fd62ea1a 428 }
NYX 0:85b3fd62ea1a 429 }
NYX 0:85b3fd62ea1a 430 else
NYX 0:85b3fd62ea1a 431 {
NYX 0:85b3fd62ea1a 432 if( hhcd->hc[ch_num].toggle_in == 0)
NYX 0:85b3fd62ea1a 433 {
NYX 0:85b3fd62ea1a 434 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
NYX 0:85b3fd62ea1a 435 }
NYX 0:85b3fd62ea1a 436 else
NYX 0:85b3fd62ea1a 437 {
NYX 0:85b3fd62ea1a 438 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
NYX 0:85b3fd62ea1a 439 }
NYX 0:85b3fd62ea1a 440 }
NYX 0:85b3fd62ea1a 441
NYX 0:85b3fd62ea1a 442 break;
NYX 0:85b3fd62ea1a 443 case EP_TYPE_INTR:
NYX 0:85b3fd62ea1a 444 if(direction == 0)
NYX 0:85b3fd62ea1a 445 {
NYX 0:85b3fd62ea1a 446 /* Set the Data Toggle bit as per the Flag */
NYX 0:85b3fd62ea1a 447 if ( hhcd->hc[ch_num].toggle_out == 0)
NYX 0:85b3fd62ea1a 448 { /* Put the PID 0 */
NYX 0:85b3fd62ea1a 449 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
NYX 0:85b3fd62ea1a 450 }
NYX 0:85b3fd62ea1a 451 else
NYX 0:85b3fd62ea1a 452 { /* Put the PID 1 */
NYX 0:85b3fd62ea1a 453 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
NYX 0:85b3fd62ea1a 454 }
NYX 0:85b3fd62ea1a 455 }
NYX 0:85b3fd62ea1a 456 else
NYX 0:85b3fd62ea1a 457 {
NYX 0:85b3fd62ea1a 458 if( hhcd->hc[ch_num].toggle_in == 0)
NYX 0:85b3fd62ea1a 459 {
NYX 0:85b3fd62ea1a 460 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
NYX 0:85b3fd62ea1a 461 }
NYX 0:85b3fd62ea1a 462 else
NYX 0:85b3fd62ea1a 463 {
NYX 0:85b3fd62ea1a 464 hhcd->hc[ch_num].data_pid = HC_PID_DATA1;
NYX 0:85b3fd62ea1a 465 }
NYX 0:85b3fd62ea1a 466 }
NYX 0:85b3fd62ea1a 467 break;
NYX 0:85b3fd62ea1a 468
NYX 0:85b3fd62ea1a 469 case EP_TYPE_ISOC:
NYX 0:85b3fd62ea1a 470 hhcd->hc[ch_num].data_pid = HC_PID_DATA0;
NYX 0:85b3fd62ea1a 471 break;
NYX 0:85b3fd62ea1a 472 }
NYX 0:85b3fd62ea1a 473
NYX 0:85b3fd62ea1a 474 hhcd->hc[ch_num].xfer_buff = pbuff;
NYX 0:85b3fd62ea1a 475 hhcd->hc[ch_num].xfer_len = length;
NYX 0:85b3fd62ea1a 476 hhcd->hc[ch_num].urb_state = URB_IDLE;
NYX 0:85b3fd62ea1a 477 hhcd->hc[ch_num].xfer_count = 0;
NYX 0:85b3fd62ea1a 478 hhcd->hc[ch_num].ch_num = ch_num;
NYX 0:85b3fd62ea1a 479 hhcd->hc[ch_num].state = HC_IDLE;
NYX 0:85b3fd62ea1a 480
NYX 0:85b3fd62ea1a 481 return USB_HC_StartXfer(hhcd->Instance, &(hhcd->hc[ch_num]), hhcd->Init.dma_enable);
NYX 0:85b3fd62ea1a 482 }
NYX 0:85b3fd62ea1a 483
NYX 0:85b3fd62ea1a 484 /**
NYX 0:85b3fd62ea1a 485 * @brief Handle HCD interrupt request.
NYX 0:85b3fd62ea1a 486 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 487 * @retval None
NYX 0:85b3fd62ea1a 488 */
NYX 0:85b3fd62ea1a 489 void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 490 {
NYX 0:85b3fd62ea1a 491 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
NYX 0:85b3fd62ea1a 492 uint32_t i = 0U , interrupt = 0U;
NYX 0:85b3fd62ea1a 493
NYX 0:85b3fd62ea1a 494 /* Ensure that we are in device mode */
NYX 0:85b3fd62ea1a 495 if (USB_GetMode(hhcd->Instance) == USB_OTG_MODE_HOST)
NYX 0:85b3fd62ea1a 496 {
NYX 0:85b3fd62ea1a 497 /* Avoid spurious interrupt */
NYX 0:85b3fd62ea1a 498 if(__HAL_HCD_IS_INVALID_INTERRUPT(hhcd))
NYX 0:85b3fd62ea1a 499 {
NYX 0:85b3fd62ea1a 500 return;
NYX 0:85b3fd62ea1a 501 }
NYX 0:85b3fd62ea1a 502
NYX 0:85b3fd62ea1a 503 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
NYX 0:85b3fd62ea1a 504 {
NYX 0:85b3fd62ea1a 505 /* Incorrect mode, acknowledge the interrupt */
NYX 0:85b3fd62ea1a 506 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
NYX 0:85b3fd62ea1a 507 }
NYX 0:85b3fd62ea1a 508
NYX 0:85b3fd62ea1a 509 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR))
NYX 0:85b3fd62ea1a 510 {
NYX 0:85b3fd62ea1a 511 /* Incorrect mode, acknowledge the interrupt */
NYX 0:85b3fd62ea1a 512 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR);
NYX 0:85b3fd62ea1a 513 }
NYX 0:85b3fd62ea1a 514
NYX 0:85b3fd62ea1a 515 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE))
NYX 0:85b3fd62ea1a 516 {
NYX 0:85b3fd62ea1a 517 /* Incorrect mode, acknowledge the interrupt */
NYX 0:85b3fd62ea1a 518 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE);
NYX 0:85b3fd62ea1a 519 }
NYX 0:85b3fd62ea1a 520
NYX 0:85b3fd62ea1a 521 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_MMIS))
NYX 0:85b3fd62ea1a 522 {
NYX 0:85b3fd62ea1a 523 /* Incorrect mode, acknowledge the interrupt */
NYX 0:85b3fd62ea1a 524 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_MMIS);
NYX 0:85b3fd62ea1a 525 }
NYX 0:85b3fd62ea1a 526
NYX 0:85b3fd62ea1a 527 /* Handle Host Disconnect Interrupts */
NYX 0:85b3fd62ea1a 528 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT))
NYX 0:85b3fd62ea1a 529 {
NYX 0:85b3fd62ea1a 530
NYX 0:85b3fd62ea1a 531 /* Cleanup HPRT */
NYX 0:85b3fd62ea1a 532 USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
NYX 0:85b3fd62ea1a 533 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
NYX 0:85b3fd62ea1a 534
NYX 0:85b3fd62ea1a 535 /* Handle Host Port Interrupts */
NYX 0:85b3fd62ea1a 536 HAL_HCD_Disconnect_Callback(hhcd);
NYX 0:85b3fd62ea1a 537 USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_48_MHZ );
NYX 0:85b3fd62ea1a 538 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT);
NYX 0:85b3fd62ea1a 539 }
NYX 0:85b3fd62ea1a 540
NYX 0:85b3fd62ea1a 541 /* Handle Host Port Interrupts */
NYX 0:85b3fd62ea1a 542 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HPRTINT))
NYX 0:85b3fd62ea1a 543 {
NYX 0:85b3fd62ea1a 544 HCD_Port_IRQHandler (hhcd);
NYX 0:85b3fd62ea1a 545 }
NYX 0:85b3fd62ea1a 546
NYX 0:85b3fd62ea1a 547 /* Handle Host SOF Interrupts */
NYX 0:85b3fd62ea1a 548 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_SOF))
NYX 0:85b3fd62ea1a 549 {
NYX 0:85b3fd62ea1a 550 HAL_HCD_SOF_Callback(hhcd);
NYX 0:85b3fd62ea1a 551 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SOF);
NYX 0:85b3fd62ea1a 552 }
NYX 0:85b3fd62ea1a 553
NYX 0:85b3fd62ea1a 554 /* Handle Host channel Interrupts */
NYX 0:85b3fd62ea1a 555 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HCINT))
NYX 0:85b3fd62ea1a 556 {
NYX 0:85b3fd62ea1a 557 interrupt = USB_HC_ReadInterrupt(hhcd->Instance);
NYX 0:85b3fd62ea1a 558 for (i = 0U; i < hhcd->Init.Host_channels; i++)
NYX 0:85b3fd62ea1a 559 {
NYX 0:85b3fd62ea1a 560 if (interrupt & (1U << i))
NYX 0:85b3fd62ea1a 561 {
NYX 0:85b3fd62ea1a 562 if ((USBx_HC(i)->HCCHAR) & USB_OTG_HCCHAR_EPDIR)
NYX 0:85b3fd62ea1a 563 {
NYX 0:85b3fd62ea1a 564 HCD_HC_IN_IRQHandler(hhcd, i);
NYX 0:85b3fd62ea1a 565 }
NYX 0:85b3fd62ea1a 566 else
NYX 0:85b3fd62ea1a 567 {
NYX 0:85b3fd62ea1a 568 HCD_HC_OUT_IRQHandler (hhcd, i);
NYX 0:85b3fd62ea1a 569 }
NYX 0:85b3fd62ea1a 570 }
NYX 0:85b3fd62ea1a 571 }
NYX 0:85b3fd62ea1a 572 __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_HCINT);
NYX 0:85b3fd62ea1a 573 }
NYX 0:85b3fd62ea1a 574
NYX 0:85b3fd62ea1a 575 /* Handle Rx Queue Level Interrupts */
NYX 0:85b3fd62ea1a 576 if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_RXFLVL))
NYX 0:85b3fd62ea1a 577 {
NYX 0:85b3fd62ea1a 578 USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
NYX 0:85b3fd62ea1a 579
NYX 0:85b3fd62ea1a 580 HCD_RXQLVL_IRQHandler (hhcd);
NYX 0:85b3fd62ea1a 581
NYX 0:85b3fd62ea1a 582 USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL);
NYX 0:85b3fd62ea1a 583 }
NYX 0:85b3fd62ea1a 584 }
NYX 0:85b3fd62ea1a 585 }
NYX 0:85b3fd62ea1a 586
NYX 0:85b3fd62ea1a 587 /**
NYX 0:85b3fd62ea1a 588 * @brief SOF callback.
NYX 0:85b3fd62ea1a 589 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 590 * @retval None
NYX 0:85b3fd62ea1a 591 */
NYX 0:85b3fd62ea1a 592 __weak void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 593 {
NYX 0:85b3fd62ea1a 594 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 595 UNUSED(hhcd);
NYX 0:85b3fd62ea1a 596 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 597 the HAL_HCD_SOF_Callback could be implemented in the user file
NYX 0:85b3fd62ea1a 598 */
NYX 0:85b3fd62ea1a 599 }
NYX 0:85b3fd62ea1a 600
NYX 0:85b3fd62ea1a 601 /**
NYX 0:85b3fd62ea1a 602 * @brief Connection Event callback.
NYX 0:85b3fd62ea1a 603 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 604 * @retval None
NYX 0:85b3fd62ea1a 605 */
NYX 0:85b3fd62ea1a 606 __weak void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 607 {
NYX 0:85b3fd62ea1a 608 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 609 UNUSED(hhcd);
NYX 0:85b3fd62ea1a 610 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 611 the HAL_HCD_Connect_Callback could be implemented in the user file
NYX 0:85b3fd62ea1a 612 */
NYX 0:85b3fd62ea1a 613 }
NYX 0:85b3fd62ea1a 614
NYX 0:85b3fd62ea1a 615 /**
NYX 0:85b3fd62ea1a 616 * @brief Disconnection Event callback.
NYX 0:85b3fd62ea1a 617 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 618 * @retval None
NYX 0:85b3fd62ea1a 619 */
NYX 0:85b3fd62ea1a 620 __weak void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 621 {
NYX 0:85b3fd62ea1a 622 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 623 UNUSED(hhcd);
NYX 0:85b3fd62ea1a 624 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 625 the HAL_HCD_Disconnect_Callback could be implemented in the user file
NYX 0:85b3fd62ea1a 626 */
NYX 0:85b3fd62ea1a 627 }
NYX 0:85b3fd62ea1a 628
NYX 0:85b3fd62ea1a 629 /**
NYX 0:85b3fd62ea1a 630 * @brief Notify URB state change callback.
NYX 0:85b3fd62ea1a 631 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 632 * @param chnum: Channel number.
NYX 0:85b3fd62ea1a 633 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 634 * @param urb_state:
NYX 0:85b3fd62ea1a 635 * This parameter can be one of these values:
NYX 0:85b3fd62ea1a 636 * URB_IDLE/
NYX 0:85b3fd62ea1a 637 * URB_DONE/
NYX 0:85b3fd62ea1a 638 * URB_NOTREADY/
NYX 0:85b3fd62ea1a 639 * URB_NYET/
NYX 0:85b3fd62ea1a 640 * URB_ERROR/
NYX 0:85b3fd62ea1a 641 * URB_STALL/
NYX 0:85b3fd62ea1a 642 * @retval None
NYX 0:85b3fd62ea1a 643 */
NYX 0:85b3fd62ea1a 644 __weak void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state)
NYX 0:85b3fd62ea1a 645 {
NYX 0:85b3fd62ea1a 646 /* Prevent unused argument(s) compilation warning */
NYX 0:85b3fd62ea1a 647 UNUSED(hhcd);
NYX 0:85b3fd62ea1a 648 UNUSED(chnum);
NYX 0:85b3fd62ea1a 649 UNUSED(urb_state);
NYX 0:85b3fd62ea1a 650 /* NOTE : This function Should not be modified, when the callback is needed,
NYX 0:85b3fd62ea1a 651 the HAL_HCD_HC_NotifyURBChange_Callback could be implemented in the user file
NYX 0:85b3fd62ea1a 652 */
NYX 0:85b3fd62ea1a 653 }
NYX 0:85b3fd62ea1a 654
NYX 0:85b3fd62ea1a 655 /**
NYX 0:85b3fd62ea1a 656 * @}
NYX 0:85b3fd62ea1a 657 */
NYX 0:85b3fd62ea1a 658
NYX 0:85b3fd62ea1a 659 /** @defgroup HCD_Exported_Functions_Group3 Peripheral Control functions
NYX 0:85b3fd62ea1a 660 * @brief Management functions
NYX 0:85b3fd62ea1a 661 *
NYX 0:85b3fd62ea1a 662 @verbatim
NYX 0:85b3fd62ea1a 663 ===============================================================================
NYX 0:85b3fd62ea1a 664 ##### Peripheral Control functions #####
NYX 0:85b3fd62ea1a 665 ===============================================================================
NYX 0:85b3fd62ea1a 666 [..]
NYX 0:85b3fd62ea1a 667 This subsection provides a set of functions allowing to control the HCD data
NYX 0:85b3fd62ea1a 668 transfers.
NYX 0:85b3fd62ea1a 669
NYX 0:85b3fd62ea1a 670 @endverbatim
NYX 0:85b3fd62ea1a 671 * @{
NYX 0:85b3fd62ea1a 672 */
NYX 0:85b3fd62ea1a 673
NYX 0:85b3fd62ea1a 674 /**
NYX 0:85b3fd62ea1a 675 * @brief Start the host driver.
NYX 0:85b3fd62ea1a 676 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 677 * @retval HAL status
NYX 0:85b3fd62ea1a 678 */
NYX 0:85b3fd62ea1a 679 HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 680 {
NYX 0:85b3fd62ea1a 681 __HAL_LOCK(hhcd);
NYX 0:85b3fd62ea1a 682 __HAL_HCD_ENABLE(hhcd);
NYX 0:85b3fd62ea1a 683 USB_DriveVbus(hhcd->Instance, 1U);
NYX 0:85b3fd62ea1a 684 __HAL_UNLOCK(hhcd);
NYX 0:85b3fd62ea1a 685 return HAL_OK;
NYX 0:85b3fd62ea1a 686 }
NYX 0:85b3fd62ea1a 687
NYX 0:85b3fd62ea1a 688 /**
NYX 0:85b3fd62ea1a 689 * @brief Stop the host driver.
NYX 0:85b3fd62ea1a 690 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 691 * @retval HAL status
NYX 0:85b3fd62ea1a 692 */
NYX 0:85b3fd62ea1a 693
NYX 0:85b3fd62ea1a 694 HAL_StatusTypeDef HAL_HCD_Stop(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 695 {
NYX 0:85b3fd62ea1a 696 __HAL_LOCK(hhcd);
NYX 0:85b3fd62ea1a 697 USB_StopHost(hhcd->Instance);
NYX 0:85b3fd62ea1a 698 __HAL_UNLOCK(hhcd);
NYX 0:85b3fd62ea1a 699 return HAL_OK;
NYX 0:85b3fd62ea1a 700 }
NYX 0:85b3fd62ea1a 701
NYX 0:85b3fd62ea1a 702 /**
NYX 0:85b3fd62ea1a 703 * @brief Reset the host port.
NYX 0:85b3fd62ea1a 704 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 705 * @retval HAL status
NYX 0:85b3fd62ea1a 706 */
NYX 0:85b3fd62ea1a 707 HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 708 {
NYX 0:85b3fd62ea1a 709 return (USB_ResetPort(hhcd->Instance));
NYX 0:85b3fd62ea1a 710 }
NYX 0:85b3fd62ea1a 711
NYX 0:85b3fd62ea1a 712 /**
NYX 0:85b3fd62ea1a 713 * @}
NYX 0:85b3fd62ea1a 714 */
NYX 0:85b3fd62ea1a 715
NYX 0:85b3fd62ea1a 716 /** @defgroup HCD_Exported_Functions_Group4 Peripheral State functions
NYX 0:85b3fd62ea1a 717 * @brief Peripheral State functions
NYX 0:85b3fd62ea1a 718 *
NYX 0:85b3fd62ea1a 719 @verbatim
NYX 0:85b3fd62ea1a 720 ===============================================================================
NYX 0:85b3fd62ea1a 721 ##### Peripheral State functions #####
NYX 0:85b3fd62ea1a 722 ===============================================================================
NYX 0:85b3fd62ea1a 723 [..]
NYX 0:85b3fd62ea1a 724 This subsection permits to get in run-time the status of the peripheral
NYX 0:85b3fd62ea1a 725 and the data flow.
NYX 0:85b3fd62ea1a 726
NYX 0:85b3fd62ea1a 727 @endverbatim
NYX 0:85b3fd62ea1a 728 * @{
NYX 0:85b3fd62ea1a 729 */
NYX 0:85b3fd62ea1a 730
NYX 0:85b3fd62ea1a 731 /**
NYX 0:85b3fd62ea1a 732 * @brief Return the HCD handle state.
NYX 0:85b3fd62ea1a 733 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 734 * @retval HAL state
NYX 0:85b3fd62ea1a 735 */
NYX 0:85b3fd62ea1a 736 HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 737 {
NYX 0:85b3fd62ea1a 738 return hhcd->State;
NYX 0:85b3fd62ea1a 739 }
NYX 0:85b3fd62ea1a 740
NYX 0:85b3fd62ea1a 741 /**
NYX 0:85b3fd62ea1a 742 * @brief Return URB state for a channel.
NYX 0:85b3fd62ea1a 743 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 744 * @param chnum: Channel number.
NYX 0:85b3fd62ea1a 745 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 746 * @retval URB state.
NYX 0:85b3fd62ea1a 747 * This parameter can be one of these values:
NYX 0:85b3fd62ea1a 748 * URB_IDLE/
NYX 0:85b3fd62ea1a 749 * URB_DONE/
NYX 0:85b3fd62ea1a 750 * URB_NOTREADY/
NYX 0:85b3fd62ea1a 751 * URB_NYET/
NYX 0:85b3fd62ea1a 752 * URB_ERROR/
NYX 0:85b3fd62ea1a 753 * URB_STALL
NYX 0:85b3fd62ea1a 754 */
NYX 0:85b3fd62ea1a 755 HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef *hhcd, uint8_t chnum)
NYX 0:85b3fd62ea1a 756 {
NYX 0:85b3fd62ea1a 757 return hhcd->hc[chnum].urb_state;
NYX 0:85b3fd62ea1a 758 }
NYX 0:85b3fd62ea1a 759
NYX 0:85b3fd62ea1a 760
NYX 0:85b3fd62ea1a 761 /**
NYX 0:85b3fd62ea1a 762 * @brief Return the last host transfer size.
NYX 0:85b3fd62ea1a 763 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 764 * @param chnum: Channel number.
NYX 0:85b3fd62ea1a 765 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 766 * @retval last transfer size in byte
NYX 0:85b3fd62ea1a 767 */
NYX 0:85b3fd62ea1a 768 uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef *hhcd, uint8_t chnum)
NYX 0:85b3fd62ea1a 769 {
NYX 0:85b3fd62ea1a 770 return hhcd->hc[chnum].xfer_count;
NYX 0:85b3fd62ea1a 771 }
NYX 0:85b3fd62ea1a 772
NYX 0:85b3fd62ea1a 773 /**
NYX 0:85b3fd62ea1a 774 * @brief Return the Host Channel state.
NYX 0:85b3fd62ea1a 775 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 776 * @param chnum: Channel number.
NYX 0:85b3fd62ea1a 777 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 778 * @retval Host channel state
NYX 0:85b3fd62ea1a 779 * This parameter can be one of these values:
NYX 0:85b3fd62ea1a 780 * HC_IDLE/
NYX 0:85b3fd62ea1a 781 * HC_XFRC/
NYX 0:85b3fd62ea1a 782 * HC_HALTED/
NYX 0:85b3fd62ea1a 783 * HC_NYET/
NYX 0:85b3fd62ea1a 784 * HC_NAK/
NYX 0:85b3fd62ea1a 785 * HC_STALL/
NYX 0:85b3fd62ea1a 786 * HC_XACTERR/
NYX 0:85b3fd62ea1a 787 * HC_BBLERR/
NYX 0:85b3fd62ea1a 788 * HC_DATATGLERR
NYX 0:85b3fd62ea1a 789 */
NYX 0:85b3fd62ea1a 790 HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef *hhcd, uint8_t chnum)
NYX 0:85b3fd62ea1a 791 {
NYX 0:85b3fd62ea1a 792 return hhcd->hc[chnum].state;
NYX 0:85b3fd62ea1a 793 }
NYX 0:85b3fd62ea1a 794
NYX 0:85b3fd62ea1a 795 /**
NYX 0:85b3fd62ea1a 796 * @brief Return the current Host frame number.
NYX 0:85b3fd62ea1a 797 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 798 * @retval Current Host frame number
NYX 0:85b3fd62ea1a 799 */
NYX 0:85b3fd62ea1a 800 uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 801 {
NYX 0:85b3fd62ea1a 802 return (USB_GetCurrentFrame(hhcd->Instance));
NYX 0:85b3fd62ea1a 803 }
NYX 0:85b3fd62ea1a 804
NYX 0:85b3fd62ea1a 805 /**
NYX 0:85b3fd62ea1a 806 * @brief Return the Host enumeration speed.
NYX 0:85b3fd62ea1a 807 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 808 * @retval Enumeration speed
NYX 0:85b3fd62ea1a 809 */
NYX 0:85b3fd62ea1a 810 uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 811 {
NYX 0:85b3fd62ea1a 812 return (USB_GetHostSpeed(hhcd->Instance));
NYX 0:85b3fd62ea1a 813 }
NYX 0:85b3fd62ea1a 814
NYX 0:85b3fd62ea1a 815 /**
NYX 0:85b3fd62ea1a 816 * @}
NYX 0:85b3fd62ea1a 817 */
NYX 0:85b3fd62ea1a 818
NYX 0:85b3fd62ea1a 819 /**
NYX 0:85b3fd62ea1a 820 * @}
NYX 0:85b3fd62ea1a 821 */
NYX 0:85b3fd62ea1a 822
NYX 0:85b3fd62ea1a 823 /** @addtogroup HCD_Private_Functions
NYX 0:85b3fd62ea1a 824 * @{
NYX 0:85b3fd62ea1a 825 */
NYX 0:85b3fd62ea1a 826 /**
NYX 0:85b3fd62ea1a 827 * @brief Handle Host Channel IN interrupt requests.
NYX 0:85b3fd62ea1a 828 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 829 * @param chnum: Channel number.
NYX 0:85b3fd62ea1a 830 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 831 * @retval None
NYX 0:85b3fd62ea1a 832 */
NYX 0:85b3fd62ea1a 833 static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
NYX 0:85b3fd62ea1a 834 {
NYX 0:85b3fd62ea1a 835 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
NYX 0:85b3fd62ea1a 836 uint32_t tmpreg = 0U;
NYX 0:85b3fd62ea1a 837
NYX 0:85b3fd62ea1a 838 if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_AHBERR)
NYX 0:85b3fd62ea1a 839 {
NYX 0:85b3fd62ea1a 840 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR);
NYX 0:85b3fd62ea1a 841 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 842 }
NYX 0:85b3fd62ea1a 843 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_ACK)
NYX 0:85b3fd62ea1a 844 {
NYX 0:85b3fd62ea1a 845 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK);
NYX 0:85b3fd62ea1a 846 }
NYX 0:85b3fd62ea1a 847
NYX 0:85b3fd62ea1a 848 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_STALL)
NYX 0:85b3fd62ea1a 849 {
NYX 0:85b3fd62ea1a 850 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 851 hhcd->hc[chnum].state = HC_STALL;
NYX 0:85b3fd62ea1a 852 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
NYX 0:85b3fd62ea1a 853 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL);
NYX 0:85b3fd62ea1a 854 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 855 }
NYX 0:85b3fd62ea1a 856 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_DTERR)
NYX 0:85b3fd62ea1a 857 {
NYX 0:85b3fd62ea1a 858 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 859 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 860 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
NYX 0:85b3fd62ea1a 861 hhcd->hc[chnum].state = HC_DATATGLERR;
NYX 0:85b3fd62ea1a 862 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR);
NYX 0:85b3fd62ea1a 863 }
NYX 0:85b3fd62ea1a 864
NYX 0:85b3fd62ea1a 865 if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_FRMOR)
NYX 0:85b3fd62ea1a 866 {
NYX 0:85b3fd62ea1a 867 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 868 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 869 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR);
NYX 0:85b3fd62ea1a 870 }
NYX 0:85b3fd62ea1a 871
NYX 0:85b3fd62ea1a 872 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_XFRC)
NYX 0:85b3fd62ea1a 873 {
NYX 0:85b3fd62ea1a 874
NYX 0:85b3fd62ea1a 875 if (hhcd->Init.dma_enable)
NYX 0:85b3fd62ea1a 876 {
NYX 0:85b3fd62ea1a 877 hhcd->hc[chnum].xfer_count = hhcd->hc[chnum].xfer_len - \
NYX 0:85b3fd62ea1a 878 (USBx_HC(chnum)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ);
NYX 0:85b3fd62ea1a 879 }
NYX 0:85b3fd62ea1a 880
NYX 0:85b3fd62ea1a 881 hhcd->hc[chnum].state = HC_XFRC;
NYX 0:85b3fd62ea1a 882 hhcd->hc[chnum].ErrCnt = 0U;
NYX 0:85b3fd62ea1a 883 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC);
NYX 0:85b3fd62ea1a 884
NYX 0:85b3fd62ea1a 885
NYX 0:85b3fd62ea1a 886 if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)||
NYX 0:85b3fd62ea1a 887 (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
NYX 0:85b3fd62ea1a 888 {
NYX 0:85b3fd62ea1a 889 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 890 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 891 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
NYX 0:85b3fd62ea1a 892
NYX 0:85b3fd62ea1a 893 }
NYX 0:85b3fd62ea1a 894 else if(hhcd->hc[chnum].ep_type == EP_TYPE_INTR)
NYX 0:85b3fd62ea1a 895 {
NYX 0:85b3fd62ea1a 896 USBx_HC(chnum)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM;
NYX 0:85b3fd62ea1a 897 hhcd->hc[chnum].urb_state = URB_DONE;
NYX 0:85b3fd62ea1a 898 HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
NYX 0:85b3fd62ea1a 899 }
NYX 0:85b3fd62ea1a 900 hhcd->hc[chnum].toggle_in ^= 1U;
NYX 0:85b3fd62ea1a 901
NYX 0:85b3fd62ea1a 902 }
NYX 0:85b3fd62ea1a 903 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
NYX 0:85b3fd62ea1a 904 {
NYX 0:85b3fd62ea1a 905 int reactivate=0;
NYX 0:85b3fd62ea1a 906 __HAL_HCD_MASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 907
NYX 0:85b3fd62ea1a 908 if(hhcd->hc[chnum].state == HC_XFRC)
NYX 0:85b3fd62ea1a 909 {
NYX 0:85b3fd62ea1a 910 hhcd->hc[chnum].urb_state = URB_DONE;
NYX 0:85b3fd62ea1a 911 }
NYX 0:85b3fd62ea1a 912
NYX 0:85b3fd62ea1a 913 else if (hhcd->hc[chnum].state == HC_STALL)
NYX 0:85b3fd62ea1a 914 {
NYX 0:85b3fd62ea1a 915 hhcd->hc[chnum].urb_state = URB_STALL;
NYX 0:85b3fd62ea1a 916 }
NYX 0:85b3fd62ea1a 917
NYX 0:85b3fd62ea1a 918 else if((hhcd->hc[chnum].state == HC_XACTERR) ||
NYX 0:85b3fd62ea1a 919 (hhcd->hc[chnum].state == HC_DATATGLERR))
NYX 0:85b3fd62ea1a 920 {
NYX 0:85b3fd62ea1a 921 if(hhcd->hc[chnum].ErrCnt++ > 3U)
NYX 0:85b3fd62ea1a 922 {
NYX 0:85b3fd62ea1a 923 hhcd->hc[chnum].ErrCnt = 0U;
NYX 0:85b3fd62ea1a 924 hhcd->hc[chnum].urb_state = URB_ERROR;
NYX 0:85b3fd62ea1a 925 }
NYX 0:85b3fd62ea1a 926 else
NYX 0:85b3fd62ea1a 927 {
NYX 0:85b3fd62ea1a 928 hhcd->hc[chnum].urb_state = URB_NOTREADY;
NYX 0:85b3fd62ea1a 929 }
NYX 0:85b3fd62ea1a 930
NYX 0:85b3fd62ea1a 931 /* re-activate the channel */
NYX 0:85b3fd62ea1a 932 tmpreg = USBx_HC(chnum)->HCCHAR;
NYX 0:85b3fd62ea1a 933 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
NYX 0:85b3fd62ea1a 934 if ( hhcd->hc[chnum].urb_state != URB_ERROR) {
NYX 0:85b3fd62ea1a 935 tmpreg |= USB_OTG_HCCHAR_CHENA;
NYX 0:85b3fd62ea1a 936 reactivate = 1;
NYX 0:85b3fd62ea1a 937 }
NYX 0:85b3fd62ea1a 938 USBx_HC(chnum)->HCCHAR = tmpreg;
NYX 0:85b3fd62ea1a 939
NYX 0:85b3fd62ea1a 940 }
NYX 0:85b3fd62ea1a 941 if (hhcd->hc[chnum].state == 0) reactivate = 1;
NYX 0:85b3fd62ea1a 942 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
NYX 0:85b3fd62ea1a 943 if (reactivate == 0) HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
NYX 0:85b3fd62ea1a 944 }
NYX 0:85b3fd62ea1a 945
NYX 0:85b3fd62ea1a 946 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)
NYX 0:85b3fd62ea1a 947 {
NYX 0:85b3fd62ea1a 948 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 949 hhcd->hc[chnum].ErrCnt++;
NYX 0:85b3fd62ea1a 950 hhcd->hc[chnum].state = HC_XACTERR;
NYX 0:85b3fd62ea1a 951 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 952 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR);
NYX 0:85b3fd62ea1a 953 }
NYX 0:85b3fd62ea1a 954 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NAK)
NYX 0:85b3fd62ea1a 955 {
NYX 0:85b3fd62ea1a 956 if(hhcd->hc[chnum].ep_type == EP_TYPE_INTR)
NYX 0:85b3fd62ea1a 957 {
NYX 0:85b3fd62ea1a 958 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 959 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 960 }
NYX 0:85b3fd62ea1a 961
NYX 0:85b3fd62ea1a 962 /* Clear the NAK flag before re-enabling the channel for new IN request */
NYX 0:85b3fd62ea1a 963 hhcd->hc[chnum].state = HC_NAK;
NYX 0:85b3fd62ea1a 964 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
NYX 0:85b3fd62ea1a 965
NYX 0:85b3fd62ea1a 966 if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)||
NYX 0:85b3fd62ea1a 967 (hhcd->hc[chnum].ep_type == EP_TYPE_BULK))
NYX 0:85b3fd62ea1a 968 {
NYX 0:85b3fd62ea1a 969 /* re-activate the channel */
NYX 0:85b3fd62ea1a 970 tmpreg = USBx_HC(chnum)->HCCHAR;
NYX 0:85b3fd62ea1a 971 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
NYX 0:85b3fd62ea1a 972 tmpreg |= USB_OTG_HCCHAR_CHENA;
NYX 0:85b3fd62ea1a 973 USBx_HC(chnum)->HCCHAR = tmpreg;
NYX 0:85b3fd62ea1a 974 }
NYX 0:85b3fd62ea1a 975 }
NYX 0:85b3fd62ea1a 976 }
NYX 0:85b3fd62ea1a 977
NYX 0:85b3fd62ea1a 978 /**
NYX 0:85b3fd62ea1a 979 * @brief Handle Host Channel OUT interrupt requests.
NYX 0:85b3fd62ea1a 980 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 981 * @param chnum: Channel number.
NYX 0:85b3fd62ea1a 982 * This parameter can be a value from 1 to 15
NYX 0:85b3fd62ea1a 983 * @retval None
NYX 0:85b3fd62ea1a 984 */
NYX 0:85b3fd62ea1a 985 static void HCD_HC_OUT_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum)
NYX 0:85b3fd62ea1a 986 {
NYX 0:85b3fd62ea1a 987 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
NYX 0:85b3fd62ea1a 988
NYX 0:85b3fd62ea1a 989 if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_AHBERR)
NYX 0:85b3fd62ea1a 990 {
NYX 0:85b3fd62ea1a 991 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR);
NYX 0:85b3fd62ea1a 992 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 993 }
NYX 0:85b3fd62ea1a 994 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_ACK)
NYX 0:85b3fd62ea1a 995 {
NYX 0:85b3fd62ea1a 996 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK);
NYX 0:85b3fd62ea1a 997
NYX 0:85b3fd62ea1a 998 if( hhcd->hc[chnum].do_ping == 1U)
NYX 0:85b3fd62ea1a 999 {
NYX 0:85b3fd62ea1a 1000 hhcd->hc[chnum].state = HC_NYET;
NYX 0:85b3fd62ea1a 1001 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 1002 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 1003 hhcd->hc[chnum].urb_state = URB_NOTREADY;
NYX 0:85b3fd62ea1a 1004 }
NYX 0:85b3fd62ea1a 1005 }
NYX 0:85b3fd62ea1a 1006
NYX 0:85b3fd62ea1a 1007 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NYET)
NYX 0:85b3fd62ea1a 1008 {
NYX 0:85b3fd62ea1a 1009 hhcd->hc[chnum].state = HC_NYET;
NYX 0:85b3fd62ea1a 1010 hhcd->hc[chnum].ErrCnt= 0U;
NYX 0:85b3fd62ea1a 1011 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 1012 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 1013 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NYET);
NYX 0:85b3fd62ea1a 1014
NYX 0:85b3fd62ea1a 1015 }
NYX 0:85b3fd62ea1a 1016
NYX 0:85b3fd62ea1a 1017 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_FRMOR)
NYX 0:85b3fd62ea1a 1018 {
NYX 0:85b3fd62ea1a 1019 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 1020 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 1021 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR);
NYX 0:85b3fd62ea1a 1022 }
NYX 0:85b3fd62ea1a 1023
NYX 0:85b3fd62ea1a 1024 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_XFRC)
NYX 0:85b3fd62ea1a 1025 {
NYX 0:85b3fd62ea1a 1026 hhcd->hc[chnum].ErrCnt = 0U;
NYX 0:85b3fd62ea1a 1027 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 1028 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 1029 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC);
NYX 0:85b3fd62ea1a 1030 hhcd->hc[chnum].state = HC_XFRC;
NYX 0:85b3fd62ea1a 1031
NYX 0:85b3fd62ea1a 1032 }
NYX 0:85b3fd62ea1a 1033
NYX 0:85b3fd62ea1a 1034 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_STALL)
NYX 0:85b3fd62ea1a 1035 {
NYX 0:85b3fd62ea1a 1036 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL);
NYX 0:85b3fd62ea1a 1037 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 1038 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 1039 hhcd->hc[chnum].state = HC_STALL;
NYX 0:85b3fd62ea1a 1040 }
NYX 0:85b3fd62ea1a 1041
NYX 0:85b3fd62ea1a 1042 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NAK)
NYX 0:85b3fd62ea1a 1043 {
NYX 0:85b3fd62ea1a 1044 hhcd->hc[chnum].ErrCnt = 0U;
NYX 0:85b3fd62ea1a 1045 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 1046 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 1047 hhcd->hc[chnum].state = HC_NAK;
NYX 0:85b3fd62ea1a 1048 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
NYX 0:85b3fd62ea1a 1049 }
NYX 0:85b3fd62ea1a 1050
NYX 0:85b3fd62ea1a 1051 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR)
NYX 0:85b3fd62ea1a 1052 {
NYX 0:85b3fd62ea1a 1053 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 1054 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 1055 hhcd->hc[chnum].state = HC_XACTERR;
NYX 0:85b3fd62ea1a 1056 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR);
NYX 0:85b3fd62ea1a 1057 }
NYX 0:85b3fd62ea1a 1058
NYX 0:85b3fd62ea1a 1059 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_DTERR)
NYX 0:85b3fd62ea1a 1060 {
NYX 0:85b3fd62ea1a 1061 __HAL_HCD_UNMASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 1062 USB_HC_Halt(hhcd->Instance, chnum);
NYX 0:85b3fd62ea1a 1063 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK);
NYX 0:85b3fd62ea1a 1064 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR);
NYX 0:85b3fd62ea1a 1065 hhcd->hc[chnum].state = HC_DATATGLERR;
NYX 0:85b3fd62ea1a 1066 }
NYX 0:85b3fd62ea1a 1067
NYX 0:85b3fd62ea1a 1068
NYX 0:85b3fd62ea1a 1069 else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH)
NYX 0:85b3fd62ea1a 1070 {
NYX 0:85b3fd62ea1a 1071 __HAL_HCD_MASK_HALT_HC_INT(chnum);
NYX 0:85b3fd62ea1a 1072
NYX 0:85b3fd62ea1a 1073 if(hhcd->hc[chnum].state == HC_XFRC)
NYX 0:85b3fd62ea1a 1074 {
NYX 0:85b3fd62ea1a 1075 hhcd->hc[chnum].urb_state = URB_DONE;
NYX 0:85b3fd62ea1a 1076 if (hhcd->hc[chnum].ep_type == EP_TYPE_BULK)
NYX 0:85b3fd62ea1a 1077 {
NYX 0:85b3fd62ea1a 1078 hhcd->hc[chnum].toggle_out ^= 1U;
NYX 0:85b3fd62ea1a 1079 }
NYX 0:85b3fd62ea1a 1080 }
NYX 0:85b3fd62ea1a 1081 else if (hhcd->hc[chnum].state == HC_NAK)
NYX 0:85b3fd62ea1a 1082 {
NYX 0:85b3fd62ea1a 1083 hhcd->hc[chnum].urb_state = URB_NOTREADY;
NYX 0:85b3fd62ea1a 1084 }
NYX 0:85b3fd62ea1a 1085
NYX 0:85b3fd62ea1a 1086 else if (hhcd->hc[chnum].state == HC_NYET)
NYX 0:85b3fd62ea1a 1087 {
NYX 0:85b3fd62ea1a 1088 hhcd->hc[chnum].urb_state = URB_NOTREADY;
NYX 0:85b3fd62ea1a 1089 hhcd->hc[chnum].do_ping = 0U;
NYX 0:85b3fd62ea1a 1090 }
NYX 0:85b3fd62ea1a 1091
NYX 0:85b3fd62ea1a 1092 else if (hhcd->hc[chnum].state == HC_STALL)
NYX 0:85b3fd62ea1a 1093 {
NYX 0:85b3fd62ea1a 1094 hhcd->hc[chnum].urb_state = URB_STALL;
NYX 0:85b3fd62ea1a 1095 }
NYX 0:85b3fd62ea1a 1096
NYX 0:85b3fd62ea1a 1097 else if((hhcd->hc[chnum].state == HC_XACTERR) ||
NYX 0:85b3fd62ea1a 1098 (hhcd->hc[chnum].state == HC_DATATGLERR))
NYX 0:85b3fd62ea1a 1099 {
NYX 0:85b3fd62ea1a 1100 if(hhcd->hc[chnum].ErrCnt++ > 3U)
NYX 0:85b3fd62ea1a 1101 {
NYX 0:85b3fd62ea1a 1102 hhcd->hc[chnum].ErrCnt = 0U;
NYX 0:85b3fd62ea1a 1103 hhcd->hc[chnum].urb_state = URB_ERROR;
NYX 0:85b3fd62ea1a 1104 }
NYX 0:85b3fd62ea1a 1105 else
NYX 0:85b3fd62ea1a 1106 {
NYX 0:85b3fd62ea1a 1107 hhcd->hc[chnum].urb_state = URB_NOTREADY;
NYX 0:85b3fd62ea1a 1108 }
NYX 0:85b3fd62ea1a 1109 }
NYX 0:85b3fd62ea1a 1110
NYX 0:85b3fd62ea1a 1111 __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH);
NYX 0:85b3fd62ea1a 1112 HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state);
NYX 0:85b3fd62ea1a 1113 }
NYX 0:85b3fd62ea1a 1114 }
NYX 0:85b3fd62ea1a 1115
NYX 0:85b3fd62ea1a 1116 /**
NYX 0:85b3fd62ea1a 1117 * @brief Handle Rx Queue Level interrupt requests.
NYX 0:85b3fd62ea1a 1118 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 1119 * @retval None
NYX 0:85b3fd62ea1a 1120 */
NYX 0:85b3fd62ea1a 1121 static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 1122 {
NYX 0:85b3fd62ea1a 1123 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
NYX 0:85b3fd62ea1a 1124 uint8_t channelnum = 0;
NYX 0:85b3fd62ea1a 1125 uint32_t pktsts;
NYX 0:85b3fd62ea1a 1126 uint32_t pktcnt;
NYX 0:85b3fd62ea1a 1127 uint32_t temp = 0U;
NYX 0:85b3fd62ea1a 1128 uint32_t tmpreg = 0U;
NYX 0:85b3fd62ea1a 1129
NYX 0:85b3fd62ea1a 1130 temp = hhcd->Instance->GRXSTSP;
NYX 0:85b3fd62ea1a 1131 channelnum = temp & USB_OTG_GRXSTSP_EPNUM;
NYX 0:85b3fd62ea1a 1132 pktsts = (temp & USB_OTG_GRXSTSP_PKTSTS) >> 17U;
NYX 0:85b3fd62ea1a 1133 pktcnt = (temp & USB_OTG_GRXSTSP_BCNT) >> 4U;
NYX 0:85b3fd62ea1a 1134
NYX 0:85b3fd62ea1a 1135 switch (pktsts)
NYX 0:85b3fd62ea1a 1136 {
NYX 0:85b3fd62ea1a 1137 case GRXSTS_PKTSTS_IN:
NYX 0:85b3fd62ea1a 1138 /* Read the data into the host buffer. */
NYX 0:85b3fd62ea1a 1139 if ((pktcnt > 0U) && (hhcd->hc[channelnum].xfer_buff != (void *)0))
NYX 0:85b3fd62ea1a 1140 {
NYX 0:85b3fd62ea1a 1141
NYX 0:85b3fd62ea1a 1142 USB_ReadPacket(hhcd->Instance, hhcd->hc[channelnum].xfer_buff, pktcnt);
NYX 0:85b3fd62ea1a 1143
NYX 0:85b3fd62ea1a 1144 /*manage multiple Xfer */
NYX 0:85b3fd62ea1a 1145 hhcd->hc[channelnum].xfer_buff += pktcnt;
NYX 0:85b3fd62ea1a 1146 hhcd->hc[channelnum].xfer_count += pktcnt;
NYX 0:85b3fd62ea1a 1147
NYX 0:85b3fd62ea1a 1148 if((USBx_HC(channelnum)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) > 0)
NYX 0:85b3fd62ea1a 1149 {
NYX 0:85b3fd62ea1a 1150 /* re-activate the channel when more packets are expected */
NYX 0:85b3fd62ea1a 1151 tmpreg = USBx_HC(channelnum)->HCCHAR;
NYX 0:85b3fd62ea1a 1152 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
NYX 0:85b3fd62ea1a 1153 tmpreg |= USB_OTG_HCCHAR_CHENA;
NYX 0:85b3fd62ea1a 1154 USBx_HC(channelnum)->HCCHAR = tmpreg;
NYX 0:85b3fd62ea1a 1155 hhcd->hc[channelnum].toggle_in ^= 1;
NYX 0:85b3fd62ea1a 1156 }
NYX 0:85b3fd62ea1a 1157 }
NYX 0:85b3fd62ea1a 1158 break;
NYX 0:85b3fd62ea1a 1159
NYX 0:85b3fd62ea1a 1160 case GRXSTS_PKTSTS_DATA_TOGGLE_ERR:
NYX 0:85b3fd62ea1a 1161 break;
NYX 0:85b3fd62ea1a 1162 case GRXSTS_PKTSTS_IN_XFER_COMP:
NYX 0:85b3fd62ea1a 1163 case GRXSTS_PKTSTS_CH_HALTED:
NYX 0:85b3fd62ea1a 1164 default:
NYX 0:85b3fd62ea1a 1165 break;
NYX 0:85b3fd62ea1a 1166 }
NYX 0:85b3fd62ea1a 1167 }
NYX 0:85b3fd62ea1a 1168
NYX 0:85b3fd62ea1a 1169 /**
NYX 0:85b3fd62ea1a 1170 * @brief Handle Host Port interrupt requests.
NYX 0:85b3fd62ea1a 1171 * @param hhcd: HCD handle
NYX 0:85b3fd62ea1a 1172 * @retval None
NYX 0:85b3fd62ea1a 1173 */
NYX 0:85b3fd62ea1a 1174 static void HCD_Port_IRQHandler (HCD_HandleTypeDef *hhcd)
NYX 0:85b3fd62ea1a 1175 {
NYX 0:85b3fd62ea1a 1176 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
NYX 0:85b3fd62ea1a 1177 __IO uint32_t hprt0, hprt0_dup;
NYX 0:85b3fd62ea1a 1178
NYX 0:85b3fd62ea1a 1179 /* Handle Host Port Interrupts */
NYX 0:85b3fd62ea1a 1180 hprt0 = USBx_HPRT0;
NYX 0:85b3fd62ea1a 1181 hprt0_dup = USBx_HPRT0;
NYX 0:85b3fd62ea1a 1182
NYX 0:85b3fd62ea1a 1183 hprt0_dup &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
NYX 0:85b3fd62ea1a 1184 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
NYX 0:85b3fd62ea1a 1185
NYX 0:85b3fd62ea1a 1186 /* Check whether Port Connect Detected */
NYX 0:85b3fd62ea1a 1187 if((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET)
NYX 0:85b3fd62ea1a 1188 {
NYX 0:85b3fd62ea1a 1189 if((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS)
NYX 0:85b3fd62ea1a 1190 {
NYX 0:85b3fd62ea1a 1191 USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
NYX 0:85b3fd62ea1a 1192 HAL_HCD_Connect_Callback(hhcd);
NYX 0:85b3fd62ea1a 1193 }
NYX 0:85b3fd62ea1a 1194 hprt0_dup |= USB_OTG_HPRT_PCDET;
NYX 0:85b3fd62ea1a 1195
NYX 0:85b3fd62ea1a 1196 }
NYX 0:85b3fd62ea1a 1197
NYX 0:85b3fd62ea1a 1198 /* Check whether Port Enable Changed */
NYX 0:85b3fd62ea1a 1199 if((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG)
NYX 0:85b3fd62ea1a 1200 {
NYX 0:85b3fd62ea1a 1201 hprt0_dup |= USB_OTG_HPRT_PENCHNG;
NYX 0:85b3fd62ea1a 1202
NYX 0:85b3fd62ea1a 1203 if((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA)
NYX 0:85b3fd62ea1a 1204 {
NYX 0:85b3fd62ea1a 1205 if(hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY)
NYX 0:85b3fd62ea1a 1206 {
NYX 0:85b3fd62ea1a 1207 if ((hprt0 & USB_OTG_HPRT_PSPD) == (HPRT0_PRTSPD_LOW_SPEED << 17U))
NYX 0:85b3fd62ea1a 1208 {
NYX 0:85b3fd62ea1a 1209 USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_6_MHZ );
NYX 0:85b3fd62ea1a 1210 }
NYX 0:85b3fd62ea1a 1211 else
NYX 0:85b3fd62ea1a 1212 {
NYX 0:85b3fd62ea1a 1213 USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_48_MHZ );
NYX 0:85b3fd62ea1a 1214 }
NYX 0:85b3fd62ea1a 1215 }
NYX 0:85b3fd62ea1a 1216 else
NYX 0:85b3fd62ea1a 1217 {
NYX 0:85b3fd62ea1a 1218 if(hhcd->Init.speed == HCD_SPEED_FULL)
NYX 0:85b3fd62ea1a 1219 {
NYX 0:85b3fd62ea1a 1220 USBx_HOST->HFIR = 60000U;
NYX 0:85b3fd62ea1a 1221 }
NYX 0:85b3fd62ea1a 1222 }
NYX 0:85b3fd62ea1a 1223
NYX 0:85b3fd62ea1a 1224 HAL_HCD_Connect_Callback(hhcd);
NYX 0:85b3fd62ea1a 1225 }
NYX 0:85b3fd62ea1a 1226 else
NYX 0:85b3fd62ea1a 1227 {
NYX 0:85b3fd62ea1a 1228 /* Clean up HPRT */
NYX 0:85b3fd62ea1a 1229 USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
NYX 0:85b3fd62ea1a 1230 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
NYX 0:85b3fd62ea1a 1231
NYX 0:85b3fd62ea1a 1232 USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT);
NYX 0:85b3fd62ea1a 1233 }
NYX 0:85b3fd62ea1a 1234 }
NYX 0:85b3fd62ea1a 1235
NYX 0:85b3fd62ea1a 1236 /* Check for an over current */
NYX 0:85b3fd62ea1a 1237 if((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG)
NYX 0:85b3fd62ea1a 1238 {
NYX 0:85b3fd62ea1a 1239 hprt0_dup |= USB_OTG_HPRT_POCCHNG;
NYX 0:85b3fd62ea1a 1240 }
NYX 0:85b3fd62ea1a 1241
NYX 0:85b3fd62ea1a 1242 /* Clear Port Interrupts */
NYX 0:85b3fd62ea1a 1243 USBx_HPRT0 = hprt0_dup;
NYX 0:85b3fd62ea1a 1244 }
NYX 0:85b3fd62ea1a 1245
NYX 0:85b3fd62ea1a 1246 /**
NYX 0:85b3fd62ea1a 1247 * @}
NYX 0:85b3fd62ea1a 1248 */
NYX 0:85b3fd62ea1a 1249 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx ||
NYX 0:85b3fd62ea1a 1250 STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Rx ||
NYX 0:85b3fd62ea1a 1251 STM32F412Vx || STM32F412Cx || defined(STM32F413xx) || defined(STM32F423xx) */
NYX 0:85b3fd62ea1a 1252 #endif /* HAL_HCD_MODULE_ENABLED */
NYX 0:85b3fd62ea1a 1253 /**
NYX 0:85b3fd62ea1a 1254 * @}
NYX 0:85b3fd62ea1a 1255 */
NYX 0:85b3fd62ea1a 1256
NYX 0:85b3fd62ea1a 1257 /**
NYX 0:85b3fd62ea1a 1258 * @}
NYX 0:85b3fd62ea1a 1259 */
NYX 0:85b3fd62ea1a 1260
NYX 0:85b3fd62ea1a 1261 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/