SPKT

Dependents:   WAV

Committer:
phungductung
Date:
Tue Jun 04 21:51:46 2019 +0000
Revision:
0:e87aa4c49e95
libray

Who changed what in which revision?

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