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:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Parent:
573:ad23fe03a082
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

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