Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

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