mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Thu Jul 02 16:30:08 2015 +0100
Revision:
581:39197bcd20f2
Parent:
532:fe11edbda85c
Child:
613:bc40b8d2aec4
Synchronized with git revision ae2d3cdffe70184eb8736d94f76c45c93f4b7724

Full URL: https://github.com/mbedmicro/mbed/commit/ae2d3cdffe70184eb8736d94f76c45c93f4b7724/

Make it possible to build the core mbed library with yotta

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