mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

Committer:
jaerts
Date:
Tue Dec 22 13:22:16 2015 +0000
Revision:
637:ed69428d4850
Parent:
610:813dcc80987e
Add very shady LPC1768 CAN Filter implementation

Who changed what in which revision?

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