mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Mon Jun 23 14:00:09 2014 +0100
Revision:
235:685d5f11838f
Synchronized with git revision 9728c76667962b289ee9c4c687ef9f115db48cd3

Full URL: https://github.com/mbedmicro/mbed/commit/9728c76667962b289ee9c4c687ef9f115db48cd3/

[NUCLEO_F411RE] Add all target files

Who changed what in which revision?

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