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:
Mon Nov 03 10:15:07 2014 +0000
Revision:
380:510f0c3515e3
Parent:
targets/cmsis/TARGET_STM/TARGET_NUCLEO_F411RE/stm32f4xx_hal_hcd.c@352:95e80f5e68f6
Child:
532:fe11edbda85c
Synchronized with git revision 417f470ba9f4882d7079611cbc576afd9c49b0ef

Full URL: https://github.com/mbedmicro/mbed/commit/417f470ba9f4882d7079611cbc576afd9c49b0ef/

Targets: Factorisation of NUCLEO_F401RE and F411RE cmsis folders

Who changed what in which revision?

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