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