Gan likun / mbed-dev11
Committer:
ganlikun
Date:
Mon Oct 24 15:19:39 2022 +0000
Revision:
0:06036f8bee2d
11

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ganlikun 0:06036f8bee2d 1 /**
ganlikun 0:06036f8bee2d 2 ******************************************************************************
ganlikun 0:06036f8bee2d 3 * @file stm32f4xx_ll_usb.c
ganlikun 0:06036f8bee2d 4 * @author MCD Application Team
ganlikun 0:06036f8bee2d 5 * @version V1.7.1
ganlikun 0:06036f8bee2d 6 * @date 14-April-2017
ganlikun 0:06036f8bee2d 7 * @brief USB Low Layer HAL module driver.
ganlikun 0:06036f8bee2d 8 *
ganlikun 0:06036f8bee2d 9 * This file provides firmware functions to manage the following
ganlikun 0:06036f8bee2d 10 * functionalities of the USB Peripheral Controller:
ganlikun 0:06036f8bee2d 11 * + Initialization/de-initialization functions
ganlikun 0:06036f8bee2d 12 * + I/O operation functions
ganlikun 0:06036f8bee2d 13 * + Peripheral Control functions
ganlikun 0:06036f8bee2d 14 * + Peripheral State functions
ganlikun 0:06036f8bee2d 15 *
ganlikun 0:06036f8bee2d 16 @verbatim
ganlikun 0:06036f8bee2d 17 ==============================================================================
ganlikun 0:06036f8bee2d 18 ##### How to use this driver #####
ganlikun 0:06036f8bee2d 19 ==============================================================================
ganlikun 0:06036f8bee2d 20 [..]
ganlikun 0:06036f8bee2d 21 (#) Fill parameters of Init structure in USB_OTG_CfgTypeDef structure.
ganlikun 0:06036f8bee2d 22
ganlikun 0:06036f8bee2d 23 (#) Call USB_CoreInit() API to initialize the USB Core peripheral.
ganlikun 0:06036f8bee2d 24
ganlikun 0:06036f8bee2d 25 (#) The upper HAL HCD/PCD driver will call the right routines for its internal processes.
ganlikun 0:06036f8bee2d 26
ganlikun 0:06036f8bee2d 27 @endverbatim
ganlikun 0:06036f8bee2d 28 ******************************************************************************
ganlikun 0:06036f8bee2d 29 * @attention
ganlikun 0:06036f8bee2d 30 *
ganlikun 0:06036f8bee2d 31 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
ganlikun 0:06036f8bee2d 32 *
ganlikun 0:06036f8bee2d 33 * Redistribution and use in source and binary forms, with or without modification,
ganlikun 0:06036f8bee2d 34 * are permitted provided that the following conditions are met:
ganlikun 0:06036f8bee2d 35 * 1. Redistributions of source code must retain the above copyright notice,
ganlikun 0:06036f8bee2d 36 * this list of conditions and the following disclaimer.
ganlikun 0:06036f8bee2d 37 * 2. Redistributions in binary form must reproduce the above copyright notice,
ganlikun 0:06036f8bee2d 38 * this list of conditions and the following disclaimer in the documentation
ganlikun 0:06036f8bee2d 39 * and/or other materials provided with the distribution.
ganlikun 0:06036f8bee2d 40 * 3. Neither the name of STMicroelectronics nor the names of its contributors
ganlikun 0:06036f8bee2d 41 * may be used to endorse or promote products derived from this software
ganlikun 0:06036f8bee2d 42 * without specific prior written permission.
ganlikun 0:06036f8bee2d 43 *
ganlikun 0:06036f8bee2d 44 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
ganlikun 0:06036f8bee2d 45 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ganlikun 0:06036f8bee2d 46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
ganlikun 0:06036f8bee2d 47 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
ganlikun 0:06036f8bee2d 48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ganlikun 0:06036f8bee2d 49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
ganlikun 0:06036f8bee2d 50 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
ganlikun 0:06036f8bee2d 51 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
ganlikun 0:06036f8bee2d 52 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
ganlikun 0:06036f8bee2d 53 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ganlikun 0:06036f8bee2d 54 *
ganlikun 0:06036f8bee2d 55 ******************************************************************************
ganlikun 0:06036f8bee2d 56 */
ganlikun 0:06036f8bee2d 57
ganlikun 0:06036f8bee2d 58 /* Includes ------------------------------------------------------------------*/
ganlikun 0:06036f8bee2d 59 #include "stm32f4xx_hal.h"
ganlikun 0:06036f8bee2d 60
ganlikun 0:06036f8bee2d 61 /** @addtogroup STM32F4xx_LL_USB_DRIVER
ganlikun 0:06036f8bee2d 62 * @{
ganlikun 0:06036f8bee2d 63 */
ganlikun 0:06036f8bee2d 64
ganlikun 0:06036f8bee2d 65 #if defined(HAL_PCD_MODULE_ENABLED) || defined(HAL_HCD_MODULE_ENABLED)
ganlikun 0:06036f8bee2d 66 #if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \
ganlikun 0:06036f8bee2d 67 defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \
ganlikun 0:06036f8bee2d 68 defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \
ganlikun 0:06036f8bee2d 69 defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \
ganlikun 0:06036f8bee2d 70 defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx)
ganlikun 0:06036f8bee2d 71 /* Private typedef -----------------------------------------------------------*/
ganlikun 0:06036f8bee2d 72 /* Private define ------------------------------------------------------------*/
ganlikun 0:06036f8bee2d 73 /* Private macro -------------------------------------------------------------*/
ganlikun 0:06036f8bee2d 74 /* Private variables ---------------------------------------------------------*/
ganlikun 0:06036f8bee2d 75 /* Private function prototypes -----------------------------------------------*/
ganlikun 0:06036f8bee2d 76 /* Private functions ---------------------------------------------------------*/
ganlikun 0:06036f8bee2d 77 static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx);
ganlikun 0:06036f8bee2d 78
ganlikun 0:06036f8bee2d 79 /* Exported functions --------------------------------------------------------*/
ganlikun 0:06036f8bee2d 80
ganlikun 0:06036f8bee2d 81 /** @defgroup LL_USB_Exported_Functions USB Low Layer Exported Functions
ganlikun 0:06036f8bee2d 82 * @{
ganlikun 0:06036f8bee2d 83 */
ganlikun 0:06036f8bee2d 84
ganlikun 0:06036f8bee2d 85 /** @defgroup LL_USB_Group1 Initialization/de-initialization functions
ganlikun 0:06036f8bee2d 86 * @brief Initialization and Configuration functions
ganlikun 0:06036f8bee2d 87 *
ganlikun 0:06036f8bee2d 88 @verbatim
ganlikun 0:06036f8bee2d 89 ===============================================================================
ganlikun 0:06036f8bee2d 90 ##### Initialization/de-initialization functions #####
ganlikun 0:06036f8bee2d 91 ===============================================================================
ganlikun 0:06036f8bee2d 92 [..] This section provides functions allowing to:
ganlikun 0:06036f8bee2d 93
ganlikun 0:06036f8bee2d 94 @endverbatim
ganlikun 0:06036f8bee2d 95 * @{
ganlikun 0:06036f8bee2d 96 */
ganlikun 0:06036f8bee2d 97
ganlikun 0:06036f8bee2d 98 /**
ganlikun 0:06036f8bee2d 99 * @brief Initializes the USB Core
ganlikun 0:06036f8bee2d 100 * @param USBx: USB Instance
ganlikun 0:06036f8bee2d 101 * @param cfg : pointer to a USB_OTG_CfgTypeDef structure that contains
ganlikun 0:06036f8bee2d 102 * the configuration information for the specified USBx peripheral.
ganlikun 0:06036f8bee2d 103 * @retval HAL status
ganlikun 0:06036f8bee2d 104 */
ganlikun 0:06036f8bee2d 105 HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
ganlikun 0:06036f8bee2d 106 {
ganlikun 0:06036f8bee2d 107 if (cfg.phy_itface == USB_OTG_ULPI_PHY)
ganlikun 0:06036f8bee2d 108 {
ganlikun 0:06036f8bee2d 109
ganlikun 0:06036f8bee2d 110 USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);
ganlikun 0:06036f8bee2d 111
ganlikun 0:06036f8bee2d 112 /* Init The ULPI Interface */
ganlikun 0:06036f8bee2d 113 USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL);
ganlikun 0:06036f8bee2d 114
ganlikun 0:06036f8bee2d 115 /* Select vbus source */
ganlikun 0:06036f8bee2d 116 USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI);
ganlikun 0:06036f8bee2d 117 if(cfg.use_external_vbus == 1U)
ganlikun 0:06036f8bee2d 118 {
ganlikun 0:06036f8bee2d 119 USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPIEVBUSD;
ganlikun 0:06036f8bee2d 120 }
ganlikun 0:06036f8bee2d 121 /* Reset after a PHY select */
ganlikun 0:06036f8bee2d 122 USB_CoreReset(USBx);
ganlikun 0:06036f8bee2d 123 }
ganlikun 0:06036f8bee2d 124 else /* FS interface (embedded Phy) */
ganlikun 0:06036f8bee2d 125 {
ganlikun 0:06036f8bee2d 126 /* Select FS Embedded PHY */
ganlikun 0:06036f8bee2d 127 USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL;
ganlikun 0:06036f8bee2d 128
ganlikun 0:06036f8bee2d 129 /* Reset after a PHY select and set Host mode */
ganlikun 0:06036f8bee2d 130 USB_CoreReset(USBx);
ganlikun 0:06036f8bee2d 131
ganlikun 0:06036f8bee2d 132 /* Deactivate the power down*/
ganlikun 0:06036f8bee2d 133 USBx->GCCFG = USB_OTG_GCCFG_PWRDWN;
ganlikun 0:06036f8bee2d 134 }
ganlikun 0:06036f8bee2d 135
ganlikun 0:06036f8bee2d 136 if(cfg.dma_enable == ENABLE)
ganlikun 0:06036f8bee2d 137 {
ganlikun 0:06036f8bee2d 138 USBx->GAHBCFG |= USB_OTG_GAHBCFG_HBSTLEN_2;
ganlikun 0:06036f8bee2d 139 USBx->GAHBCFG |= USB_OTG_GAHBCFG_DMAEN;
ganlikun 0:06036f8bee2d 140 }
ganlikun 0:06036f8bee2d 141
ganlikun 0:06036f8bee2d 142 return HAL_OK;
ganlikun 0:06036f8bee2d 143 }
ganlikun 0:06036f8bee2d 144
ganlikun 0:06036f8bee2d 145 /**
ganlikun 0:06036f8bee2d 146 * @brief USB_EnableGlobalInt
ganlikun 0:06036f8bee2d 147 * Enables the controller's Global Int in the AHB Config reg
ganlikun 0:06036f8bee2d 148 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 149 * @retval HAL status
ganlikun 0:06036f8bee2d 150 */
ganlikun 0:06036f8bee2d 151 HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 152 {
ganlikun 0:06036f8bee2d 153 USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT;
ganlikun 0:06036f8bee2d 154 return HAL_OK;
ganlikun 0:06036f8bee2d 155 }
ganlikun 0:06036f8bee2d 156
ganlikun 0:06036f8bee2d 157
ganlikun 0:06036f8bee2d 158 /**
ganlikun 0:06036f8bee2d 159 * @brief USB_DisableGlobalInt
ganlikun 0:06036f8bee2d 160 * Disable the controller's Global Int in the AHB Config reg
ganlikun 0:06036f8bee2d 161 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 162 * @retval HAL status
ganlikun 0:06036f8bee2d 163 */
ganlikun 0:06036f8bee2d 164 HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 165 {
ganlikun 0:06036f8bee2d 166 USBx->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT;
ganlikun 0:06036f8bee2d 167 return HAL_OK;
ganlikun 0:06036f8bee2d 168 }
ganlikun 0:06036f8bee2d 169
ganlikun 0:06036f8bee2d 170 /**
ganlikun 0:06036f8bee2d 171 * @brief USB_SetCurrentMode : Set functional mode
ganlikun 0:06036f8bee2d 172 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 173 * @param mode : current core mode
ganlikun 0:06036f8bee2d 174 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 175 * @arg USB_OTG_DEVICE_MODE: Peripheral mode
ganlikun 0:06036f8bee2d 176 * @arg USB_OTG_HOST_MODE: Host mode
ganlikun 0:06036f8bee2d 177 * @arg USB_OTG_DRD_MODE: Dual Role Device mode
ganlikun 0:06036f8bee2d 178 * @retval HAL status
ganlikun 0:06036f8bee2d 179 */
ganlikun 0:06036f8bee2d 180 HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx , USB_OTG_ModeTypeDef mode)
ganlikun 0:06036f8bee2d 181 {
ganlikun 0:06036f8bee2d 182 USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD);
ganlikun 0:06036f8bee2d 183
ganlikun 0:06036f8bee2d 184 if ( mode == USB_OTG_HOST_MODE)
ganlikun 0:06036f8bee2d 185 {
ganlikun 0:06036f8bee2d 186 USBx->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD;
ganlikun 0:06036f8bee2d 187 }
ganlikun 0:06036f8bee2d 188 else if ( mode == USB_OTG_DEVICE_MODE)
ganlikun 0:06036f8bee2d 189 {
ganlikun 0:06036f8bee2d 190 USBx->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD;
ganlikun 0:06036f8bee2d 191 }
ganlikun 0:06036f8bee2d 192 HAL_Delay(50U);
ganlikun 0:06036f8bee2d 193
ganlikun 0:06036f8bee2d 194 return HAL_OK;
ganlikun 0:06036f8bee2d 195 }
ganlikun 0:06036f8bee2d 196
ganlikun 0:06036f8bee2d 197 /**
ganlikun 0:06036f8bee2d 198 * @brief USB_DevInit : Initializes the USB_OTG controller registers
ganlikun 0:06036f8bee2d 199 * for device mode
ganlikun 0:06036f8bee2d 200 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 201 * @param cfg : pointer to a USB_OTG_CfgTypeDef structure that contains
ganlikun 0:06036f8bee2d 202 * the configuration information for the specified USBx peripheral.
ganlikun 0:06036f8bee2d 203 * @retval HAL status
ganlikun 0:06036f8bee2d 204 */
ganlikun 0:06036f8bee2d 205 HAL_StatusTypeDef USB_DevInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
ganlikun 0:06036f8bee2d 206 {
ganlikun 0:06036f8bee2d 207 uint32_t i = 0U;
ganlikun 0:06036f8bee2d 208
ganlikun 0:06036f8bee2d 209 /*Activate VBUS Sensing B */
ganlikun 0:06036f8bee2d 210 #if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \
ganlikun 0:06036f8bee2d 211 defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx)
ganlikun 0:06036f8bee2d 212 USBx->GCCFG |= USB_OTG_GCCFG_VBDEN;
ganlikun 0:06036f8bee2d 213
ganlikun 0:06036f8bee2d 214 if (cfg.vbus_sensing_enable == 0U)
ganlikun 0:06036f8bee2d 215 {
ganlikun 0:06036f8bee2d 216 /* Deactivate VBUS Sensing B */
ganlikun 0:06036f8bee2d 217 USBx->GCCFG &= ~USB_OTG_GCCFG_VBDEN;
ganlikun 0:06036f8bee2d 218
ganlikun 0:06036f8bee2d 219 /* B-peripheral session valid override enable*/
ganlikun 0:06036f8bee2d 220 USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN;
ganlikun 0:06036f8bee2d 221 USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL;
ganlikun 0:06036f8bee2d 222 }
ganlikun 0:06036f8bee2d 223 #else
ganlikun 0:06036f8bee2d 224 if (cfg.vbus_sensing_enable == 0U)
ganlikun 0:06036f8bee2d 225 {
ganlikun 0:06036f8bee2d 226 USBx->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS;
ganlikun 0:06036f8bee2d 227 }
ganlikun 0:06036f8bee2d 228 else
ganlikun 0:06036f8bee2d 229 {
ganlikun 0:06036f8bee2d 230 /* Enable VBUS */
ganlikun 0:06036f8bee2d 231 USBx->GCCFG |= USB_OTG_GCCFG_VBUSBSEN;
ganlikun 0:06036f8bee2d 232 }
ganlikun 0:06036f8bee2d 233 #endif /* STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || STM32F413xx || STM32F423xx */
ganlikun 0:06036f8bee2d 234
ganlikun 0:06036f8bee2d 235 /* Restart the Phy Clock */
ganlikun 0:06036f8bee2d 236 USBx_PCGCCTL = 0U;
ganlikun 0:06036f8bee2d 237
ganlikun 0:06036f8bee2d 238 /* Device mode configuration */
ganlikun 0:06036f8bee2d 239 USBx_DEVICE->DCFG |= DCFG_FRAME_INTERVAL_80;
ganlikun 0:06036f8bee2d 240
ganlikun 0:06036f8bee2d 241 if(cfg.phy_itface == USB_OTG_ULPI_PHY)
ganlikun 0:06036f8bee2d 242 {
ganlikun 0:06036f8bee2d 243 if(cfg.speed == USB_OTG_SPEED_HIGH)
ganlikun 0:06036f8bee2d 244 {
ganlikun 0:06036f8bee2d 245 /* Set High speed phy */
ganlikun 0:06036f8bee2d 246 USB_SetDevSpeed (USBx , USB_OTG_SPEED_HIGH);
ganlikun 0:06036f8bee2d 247 }
ganlikun 0:06036f8bee2d 248 else
ganlikun 0:06036f8bee2d 249 {
ganlikun 0:06036f8bee2d 250 /* set High speed phy in Full speed mode */
ganlikun 0:06036f8bee2d 251 USB_SetDevSpeed (USBx , USB_OTG_SPEED_HIGH_IN_FULL);
ganlikun 0:06036f8bee2d 252 }
ganlikun 0:06036f8bee2d 253 }
ganlikun 0:06036f8bee2d 254 else
ganlikun 0:06036f8bee2d 255 {
ganlikun 0:06036f8bee2d 256 /* Set Full speed phy */
ganlikun 0:06036f8bee2d 257 USB_SetDevSpeed (USBx , USB_OTG_SPEED_FULL);
ganlikun 0:06036f8bee2d 258 }
ganlikun 0:06036f8bee2d 259
ganlikun 0:06036f8bee2d 260 /* Flush the FIFOs */
ganlikun 0:06036f8bee2d 261 USB_FlushTxFifo(USBx , 0x10U); /* all Tx FIFOs */
ganlikun 0:06036f8bee2d 262 USB_FlushRxFifo(USBx);
ganlikun 0:06036f8bee2d 263
ganlikun 0:06036f8bee2d 264 /* Clear all pending Device Interrupts */
ganlikun 0:06036f8bee2d 265 USBx_DEVICE->DIEPMSK = 0U;
ganlikun 0:06036f8bee2d 266 USBx_DEVICE->DOEPMSK = 0U;
ganlikun 0:06036f8bee2d 267 USBx_DEVICE->DAINT = 0xFFFFFFFFU;
ganlikun 0:06036f8bee2d 268 USBx_DEVICE->DAINTMSK = 0U;
ganlikun 0:06036f8bee2d 269
ganlikun 0:06036f8bee2d 270 for (i = 0U; i < cfg.dev_endpoints; i++)
ganlikun 0:06036f8bee2d 271 {
ganlikun 0:06036f8bee2d 272 if ((USBx_INEP(i)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA)
ganlikun 0:06036f8bee2d 273 {
ganlikun 0:06036f8bee2d 274 USBx_INEP(i)->DIEPCTL = (USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK);
ganlikun 0:06036f8bee2d 275 }
ganlikun 0:06036f8bee2d 276 else
ganlikun 0:06036f8bee2d 277 {
ganlikun 0:06036f8bee2d 278 USBx_INEP(i)->DIEPCTL = 0U;
ganlikun 0:06036f8bee2d 279 }
ganlikun 0:06036f8bee2d 280
ganlikun 0:06036f8bee2d 281 USBx_INEP(i)->DIEPTSIZ = 0U;
ganlikun 0:06036f8bee2d 282 USBx_INEP(i)->DIEPINT = 0xFFU;
ganlikun 0:06036f8bee2d 283 }
ganlikun 0:06036f8bee2d 284
ganlikun 0:06036f8bee2d 285 for (i = 0U; i < cfg.dev_endpoints; i++)
ganlikun 0:06036f8bee2d 286 {
ganlikun 0:06036f8bee2d 287 if ((USBx_OUTEP(i)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA)
ganlikun 0:06036f8bee2d 288 {
ganlikun 0:06036f8bee2d 289 USBx_OUTEP(i)->DOEPCTL = (USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK);
ganlikun 0:06036f8bee2d 290 }
ganlikun 0:06036f8bee2d 291 else
ganlikun 0:06036f8bee2d 292 {
ganlikun 0:06036f8bee2d 293 USBx_OUTEP(i)->DOEPCTL = 0U;
ganlikun 0:06036f8bee2d 294 }
ganlikun 0:06036f8bee2d 295
ganlikun 0:06036f8bee2d 296 USBx_OUTEP(i)->DOEPTSIZ = 0U;
ganlikun 0:06036f8bee2d 297 USBx_OUTEP(i)->DOEPINT = 0xFFU;
ganlikun 0:06036f8bee2d 298 }
ganlikun 0:06036f8bee2d 299
ganlikun 0:06036f8bee2d 300 USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM);
ganlikun 0:06036f8bee2d 301
ganlikun 0:06036f8bee2d 302 if (cfg.dma_enable == 1U)
ganlikun 0:06036f8bee2d 303 {
ganlikun 0:06036f8bee2d 304 /*Set threshold parameters */
ganlikun 0:06036f8bee2d 305 USBx_DEVICE->DTHRCTL = (USB_OTG_DTHRCTL_TXTHRLEN_6 | USB_OTG_DTHRCTL_RXTHRLEN_6);
ganlikun 0:06036f8bee2d 306 USBx_DEVICE->DTHRCTL |= (USB_OTG_DTHRCTL_RXTHREN | USB_OTG_DTHRCTL_ISOTHREN | USB_OTG_DTHRCTL_NONISOTHREN);
ganlikun 0:06036f8bee2d 307
ganlikun 0:06036f8bee2d 308 i= USBx_DEVICE->DTHRCTL;
ganlikun 0:06036f8bee2d 309 }
ganlikun 0:06036f8bee2d 310
ganlikun 0:06036f8bee2d 311 /* Disable all interrupts. */
ganlikun 0:06036f8bee2d 312 USBx->GINTMSK = 0U;
ganlikun 0:06036f8bee2d 313
ganlikun 0:06036f8bee2d 314 /* Clear any pending interrupts */
ganlikun 0:06036f8bee2d 315 USBx->GINTSTS = 0xBFFFFFFFU;
ganlikun 0:06036f8bee2d 316
ganlikun 0:06036f8bee2d 317 /* Enable the common interrupts */
ganlikun 0:06036f8bee2d 318 if (cfg.dma_enable == DISABLE)
ganlikun 0:06036f8bee2d 319 {
ganlikun 0:06036f8bee2d 320 USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM;
ganlikun 0:06036f8bee2d 321 }
ganlikun 0:06036f8bee2d 322
ganlikun 0:06036f8bee2d 323 /* Enable interrupts matching to the Device mode ONLY */
ganlikun 0:06036f8bee2d 324 USBx->GINTMSK |= (USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_USBRST |\
ganlikun 0:06036f8bee2d 325 USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_IEPINT |\
ganlikun 0:06036f8bee2d 326 USB_OTG_GINTMSK_OEPINT | USB_OTG_GINTMSK_IISOIXFRM|\
ganlikun 0:06036f8bee2d 327 USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM);
ganlikun 0:06036f8bee2d 328
ganlikun 0:06036f8bee2d 329 if(cfg.Sof_enable)
ganlikun 0:06036f8bee2d 330 {
ganlikun 0:06036f8bee2d 331 USBx->GINTMSK |= USB_OTG_GINTMSK_SOFM;
ganlikun 0:06036f8bee2d 332 }
ganlikun 0:06036f8bee2d 333
ganlikun 0:06036f8bee2d 334 if (cfg.vbus_sensing_enable == ENABLE)
ganlikun 0:06036f8bee2d 335 {
ganlikun 0:06036f8bee2d 336 USBx->GINTMSK |= (USB_OTG_GINTMSK_SRQIM | USB_OTG_GINTMSK_OTGINT);
ganlikun 0:06036f8bee2d 337 }
ganlikun 0:06036f8bee2d 338
ganlikun 0:06036f8bee2d 339 return HAL_OK;
ganlikun 0:06036f8bee2d 340 }
ganlikun 0:06036f8bee2d 341
ganlikun 0:06036f8bee2d 342
ganlikun 0:06036f8bee2d 343 /**
ganlikun 0:06036f8bee2d 344 * @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO
ganlikun 0:06036f8bee2d 345 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 346 * @param num : FIFO number
ganlikun 0:06036f8bee2d 347 * This parameter can be a value from 1 to 15
ganlikun 0:06036f8bee2d 348 15 means Flush all Tx FIFOs
ganlikun 0:06036f8bee2d 349 * @retval HAL status
ganlikun 0:06036f8bee2d 350 */
ganlikun 0:06036f8bee2d 351 HAL_StatusTypeDef USB_FlushTxFifo (USB_OTG_GlobalTypeDef *USBx, uint32_t num )
ganlikun 0:06036f8bee2d 352 {
ganlikun 0:06036f8bee2d 353 uint32_t count = 0;
ganlikun 0:06036f8bee2d 354
ganlikun 0:06036f8bee2d 355 USBx->GRSTCTL = ( USB_OTG_GRSTCTL_TXFFLSH |(uint32_t)( num << 6));
ganlikun 0:06036f8bee2d 356
ganlikun 0:06036f8bee2d 357 do
ganlikun 0:06036f8bee2d 358 {
ganlikun 0:06036f8bee2d 359 if (++count > 200000)
ganlikun 0:06036f8bee2d 360 {
ganlikun 0:06036f8bee2d 361 return HAL_TIMEOUT;
ganlikun 0:06036f8bee2d 362 }
ganlikun 0:06036f8bee2d 363 }
ganlikun 0:06036f8bee2d 364 while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH);
ganlikun 0:06036f8bee2d 365
ganlikun 0:06036f8bee2d 366 return HAL_OK;
ganlikun 0:06036f8bee2d 367 }
ganlikun 0:06036f8bee2d 368
ganlikun 0:06036f8bee2d 369
ganlikun 0:06036f8bee2d 370 /**
ganlikun 0:06036f8bee2d 371 * @brief USB_FlushRxFifo : Flush Rx FIFO
ganlikun 0:06036f8bee2d 372 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 373 * @retval HAL status
ganlikun 0:06036f8bee2d 374 */
ganlikun 0:06036f8bee2d 375 HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 376 {
ganlikun 0:06036f8bee2d 377 uint32_t count = 0;
ganlikun 0:06036f8bee2d 378
ganlikun 0:06036f8bee2d 379 USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH;
ganlikun 0:06036f8bee2d 380
ganlikun 0:06036f8bee2d 381 do
ganlikun 0:06036f8bee2d 382 {
ganlikun 0:06036f8bee2d 383 if (++count > 200000)
ganlikun 0:06036f8bee2d 384 {
ganlikun 0:06036f8bee2d 385 return HAL_TIMEOUT;
ganlikun 0:06036f8bee2d 386 }
ganlikun 0:06036f8bee2d 387 }
ganlikun 0:06036f8bee2d 388 while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH);
ganlikun 0:06036f8bee2d 389
ganlikun 0:06036f8bee2d 390 return HAL_OK;
ganlikun 0:06036f8bee2d 391 }
ganlikun 0:06036f8bee2d 392
ganlikun 0:06036f8bee2d 393 /**
ganlikun 0:06036f8bee2d 394 * @brief USB_SetDevSpeed :Initializes the DevSpd field of DCFG register
ganlikun 0:06036f8bee2d 395 * depending the PHY type and the enumeration speed of the device.
ganlikun 0:06036f8bee2d 396 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 397 * @param speed : device speed
ganlikun 0:06036f8bee2d 398 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 399 * @arg USB_OTG_SPEED_HIGH: High speed mode
ganlikun 0:06036f8bee2d 400 * @arg USB_OTG_SPEED_HIGH_IN_FULL: High speed core in Full Speed mode
ganlikun 0:06036f8bee2d 401 * @arg USB_OTG_SPEED_FULL: Full speed mode
ganlikun 0:06036f8bee2d 402 * @arg USB_OTG_SPEED_LOW: Low speed mode
ganlikun 0:06036f8bee2d 403 * @retval Hal status
ganlikun 0:06036f8bee2d 404 */
ganlikun 0:06036f8bee2d 405 HAL_StatusTypeDef USB_SetDevSpeed(USB_OTG_GlobalTypeDef *USBx , uint8_t speed)
ganlikun 0:06036f8bee2d 406 {
ganlikun 0:06036f8bee2d 407 USBx_DEVICE->DCFG |= speed;
ganlikun 0:06036f8bee2d 408 return HAL_OK;
ganlikun 0:06036f8bee2d 409 }
ganlikun 0:06036f8bee2d 410
ganlikun 0:06036f8bee2d 411 /**
ganlikun 0:06036f8bee2d 412 * @brief USB_GetDevSpeed :Return the Dev Speed
ganlikun 0:06036f8bee2d 413 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 414 * @retval speed : device speed
ganlikun 0:06036f8bee2d 415 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 416 * @arg USB_OTG_SPEED_HIGH: High speed mode
ganlikun 0:06036f8bee2d 417 * @arg USB_OTG_SPEED_FULL: Full speed mode
ganlikun 0:06036f8bee2d 418 * @arg USB_OTG_SPEED_LOW: Low speed mode
ganlikun 0:06036f8bee2d 419 */
ganlikun 0:06036f8bee2d 420 uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 421 {
ganlikun 0:06036f8bee2d 422 uint8_t speed = 0U;
ganlikun 0:06036f8bee2d 423
ganlikun 0:06036f8bee2d 424 if((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ)
ganlikun 0:06036f8bee2d 425 {
ganlikun 0:06036f8bee2d 426 speed = USB_OTG_SPEED_HIGH;
ganlikun 0:06036f8bee2d 427 }
ganlikun 0:06036f8bee2d 428 else if (((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ)||
ganlikun 0:06036f8bee2d 429 ((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_FS_PHY_48MHZ))
ganlikun 0:06036f8bee2d 430 {
ganlikun 0:06036f8bee2d 431 speed = USB_OTG_SPEED_FULL;
ganlikun 0:06036f8bee2d 432 }
ganlikun 0:06036f8bee2d 433 else if((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ)
ganlikun 0:06036f8bee2d 434 {
ganlikun 0:06036f8bee2d 435 speed = USB_OTG_SPEED_LOW;
ganlikun 0:06036f8bee2d 436 }
ganlikun 0:06036f8bee2d 437
ganlikun 0:06036f8bee2d 438 return speed;
ganlikun 0:06036f8bee2d 439 }
ganlikun 0:06036f8bee2d 440
ganlikun 0:06036f8bee2d 441 /**
ganlikun 0:06036f8bee2d 442 * @brief Activate and configure an endpoint
ganlikun 0:06036f8bee2d 443 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 444 * @param ep: pointer to endpoint structure
ganlikun 0:06036f8bee2d 445 * @retval HAL status
ganlikun 0:06036f8bee2d 446 */
ganlikun 0:06036f8bee2d 447 HAL_StatusTypeDef USB_ActivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)
ganlikun 0:06036f8bee2d 448 {
ganlikun 0:06036f8bee2d 449 if (ep->is_in == 1U)
ganlikun 0:06036f8bee2d 450 {
ganlikun 0:06036f8bee2d 451 USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & ((1U << (ep->num)));
ganlikun 0:06036f8bee2d 452
ganlikun 0:06036f8bee2d 453 if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0U)
ganlikun 0:06036f8bee2d 454 {
ganlikun 0:06036f8bee2d 455 USBx_INEP(ep->num)->DIEPCTL |= ((ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ ) | (ep->type << 18U) |\
ganlikun 0:06036f8bee2d 456 ((ep->num) << 22U) | (USB_OTG_DIEPCTL_SD0PID_SEVNFRM) | (USB_OTG_DIEPCTL_USBAEP));
ganlikun 0:06036f8bee2d 457 }
ganlikun 0:06036f8bee2d 458 }
ganlikun 0:06036f8bee2d 459 else
ganlikun 0:06036f8bee2d 460 {
ganlikun 0:06036f8bee2d 461 USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & ((1U << (ep->num)) << 16U);
ganlikun 0:06036f8bee2d 462
ganlikun 0:06036f8bee2d 463 if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U)
ganlikun 0:06036f8bee2d 464 {
ganlikun 0:06036f8bee2d 465 USBx_OUTEP(ep->num)->DOEPCTL |= ((ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ ) | (ep->type << 18U) |\
ganlikun 0:06036f8bee2d 466 (USB_OTG_DIEPCTL_SD0PID_SEVNFRM)| (USB_OTG_DOEPCTL_USBAEP));
ganlikun 0:06036f8bee2d 467 }
ganlikun 0:06036f8bee2d 468 }
ganlikun 0:06036f8bee2d 469 return HAL_OK;
ganlikun 0:06036f8bee2d 470 }
ganlikun 0:06036f8bee2d 471 /**
ganlikun 0:06036f8bee2d 472 * @brief Activate and configure a dedicated endpoint
ganlikun 0:06036f8bee2d 473 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 474 * @param ep: pointer to endpoint structure
ganlikun 0:06036f8bee2d 475 * @retval HAL status
ganlikun 0:06036f8bee2d 476 */
ganlikun 0:06036f8bee2d 477 HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)
ganlikun 0:06036f8bee2d 478 {
ganlikun 0:06036f8bee2d 479 static __IO uint32_t debug = 0U;
ganlikun 0:06036f8bee2d 480
ganlikun 0:06036f8bee2d 481 /* Read DEPCTLn register */
ganlikun 0:06036f8bee2d 482 if (ep->is_in == 1U)
ganlikun 0:06036f8bee2d 483 {
ganlikun 0:06036f8bee2d 484 if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0U)
ganlikun 0:06036f8bee2d 485 {
ganlikun 0:06036f8bee2d 486 USBx_INEP(ep->num)->DIEPCTL |= ((ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ ) | (ep->type << 18U) |\
ganlikun 0:06036f8bee2d 487 ((ep->num) << 22U) | (USB_OTG_DIEPCTL_SD0PID_SEVNFRM) | (USB_OTG_DIEPCTL_USBAEP));
ganlikun 0:06036f8bee2d 488 }
ganlikun 0:06036f8bee2d 489
ganlikun 0:06036f8bee2d 490
ganlikun 0:06036f8bee2d 491 debug |= ((ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ ) | (ep->type << 18U) |\
ganlikun 0:06036f8bee2d 492 ((ep->num) << 22U) | (USB_OTG_DIEPCTL_SD0PID_SEVNFRM) | (USB_OTG_DIEPCTL_USBAEP));
ganlikun 0:06036f8bee2d 493
ganlikun 0:06036f8bee2d 494 USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_IEPM & ((1U << (ep->num)));
ganlikun 0:06036f8bee2d 495 }
ganlikun 0:06036f8bee2d 496 else
ganlikun 0:06036f8bee2d 497 {
ganlikun 0:06036f8bee2d 498 if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U)
ganlikun 0:06036f8bee2d 499 {
ganlikun 0:06036f8bee2d 500 USBx_OUTEP(ep->num)->DOEPCTL |= ((ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ ) | (ep->type << 18U) |\
ganlikun 0:06036f8bee2d 501 ((ep->num) << 22U) | (USB_OTG_DOEPCTL_USBAEP));
ganlikun 0:06036f8bee2d 502
ganlikun 0:06036f8bee2d 503 debug = (uint32_t)(((uint32_t )USBx) + USB_OTG_OUT_ENDPOINT_BASE + (0U)*USB_OTG_EP_REG_SIZE);
ganlikun 0:06036f8bee2d 504 debug = (uint32_t )&USBx_OUTEP(ep->num)->DOEPCTL;
ganlikun 0:06036f8bee2d 505 debug |= ((ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ ) | (ep->type << 18U) |\
ganlikun 0:06036f8bee2d 506 ((ep->num) << 22U) | (USB_OTG_DOEPCTL_USBAEP));
ganlikun 0:06036f8bee2d 507 }
ganlikun 0:06036f8bee2d 508
ganlikun 0:06036f8bee2d 509 USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_OEPM & ((1U << (ep->num)) << 16U);
ganlikun 0:06036f8bee2d 510 }
ganlikun 0:06036f8bee2d 511
ganlikun 0:06036f8bee2d 512 return HAL_OK;
ganlikun 0:06036f8bee2d 513 }
ganlikun 0:06036f8bee2d 514 /**
ganlikun 0:06036f8bee2d 515 * @brief De-activate and de-initialize an endpoint
ganlikun 0:06036f8bee2d 516 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 517 * @param ep: pointer to endpoint structure
ganlikun 0:06036f8bee2d 518 * @retval HAL status
ganlikun 0:06036f8bee2d 519 */
ganlikun 0:06036f8bee2d 520 HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)
ganlikun 0:06036f8bee2d 521 {
ganlikun 0:06036f8bee2d 522 uint32_t count = 0U;
ganlikun 0:06036f8bee2d 523
ganlikun 0:06036f8bee2d 524 /* Disable the IN endpoint */
ganlikun 0:06036f8bee2d 525 if (ep->is_in == 1U)
ganlikun 0:06036f8bee2d 526 {
ganlikun 0:06036f8bee2d 527 USBx_INEP(ep->num)->DIEPCTL &= ~USB_OTG_DIEPCTL_USBAEP;
ganlikun 0:06036f8bee2d 528
ganlikun 0:06036f8bee2d 529 /* sets the NAK bit for the IN endpoint */
ganlikun 0:06036f8bee2d 530 USBx_INEP(ep->num)->DIEPCTL = USB_OTG_DIEPCTL_SNAK;
ganlikun 0:06036f8bee2d 531
ganlikun 0:06036f8bee2d 532 /* Disable IN endpoint */
ganlikun 0:06036f8bee2d 533 USBx_INEP(ep->num)->DIEPCTL = USB_OTG_DIEPCTL_EPDIS;
ganlikun 0:06036f8bee2d 534
ganlikun 0:06036f8bee2d 535 do
ganlikun 0:06036f8bee2d 536 {
ganlikun 0:06036f8bee2d 537 if (++count > 200000U)
ganlikun 0:06036f8bee2d 538 {
ganlikun 0:06036f8bee2d 539 return HAL_TIMEOUT;
ganlikun 0:06036f8bee2d 540 }
ganlikun 0:06036f8bee2d 541 }
ganlikun 0:06036f8bee2d 542
ganlikun 0:06036f8bee2d 543 /*Wait for EPDISD endpoint disabled interrupt*/
ganlikun 0:06036f8bee2d 544 while ((USBx_INEP(ep->num)->DIEPINT & USB_OTG_DIEPCTL_EPDIS) == USB_OTG_DIEPCTL_EPDIS);
ganlikun 0:06036f8bee2d 545
ganlikun 0:06036f8bee2d 546
ganlikun 0:06036f8bee2d 547 /* Flush any data remaining in the TxFIFO */
ganlikun 0:06036f8bee2d 548 USB_FlushTxFifo(USBx , 0x10U);
ganlikun 0:06036f8bee2d 549
ganlikun 0:06036f8bee2d 550 /* Disable endpoint interrupts */
ganlikun 0:06036f8bee2d 551 USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1U << (ep->num))));
ganlikun 0:06036f8bee2d 552
ganlikun 0:06036f8bee2d 553 }
ganlikun 0:06036f8bee2d 554 else /* Disable the OUT endpoint */
ganlikun 0:06036f8bee2d 555 {
ganlikun 0:06036f8bee2d 556
ganlikun 0:06036f8bee2d 557 USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP;
ganlikun 0:06036f8bee2d 558
ganlikun 0:06036f8bee2d 559 /* sets the NAK bit for the OUT endpoint */
ganlikun 0:06036f8bee2d 560 USBx_OUTEP(ep->num)->DOEPCTL = USB_OTG_DOEPCTL_SNAK;
ganlikun 0:06036f8bee2d 561
ganlikun 0:06036f8bee2d 562 /* Disable OUT endpoint */
ganlikun 0:06036f8bee2d 563 USBx_OUTEP(ep->num)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS;
ganlikun 0:06036f8bee2d 564
ganlikun 0:06036f8bee2d 565 do
ganlikun 0:06036f8bee2d 566 {
ganlikun 0:06036f8bee2d 567 if (++count > 200000U)
ganlikun 0:06036f8bee2d 568 {
ganlikun 0:06036f8bee2d 569 return HAL_TIMEOUT;
ganlikun 0:06036f8bee2d 570 }
ganlikun 0:06036f8bee2d 571 }
ganlikun 0:06036f8bee2d 572
ganlikun 0:06036f8bee2d 573 /*Wait for EPDISD endpoint disabled interrupt*/
ganlikun 0:06036f8bee2d 574 while ((USBx_OUTEP(ep->num)->DOEPINT & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS);
ganlikun 0:06036f8bee2d 575
ganlikun 0:06036f8bee2d 576 /* Set the "Clear the Global OUT NAK bit" to disable global OUT NAK mode */
ganlikun 0:06036f8bee2d 577 USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGONAK;
ganlikun 0:06036f8bee2d 578
ganlikun 0:06036f8bee2d 579 /* Disable endpoint interrupts */
ganlikun 0:06036f8bee2d 580 USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1U << (ep->num)) << 16U));
ganlikun 0:06036f8bee2d 581 }
ganlikun 0:06036f8bee2d 582 return HAL_OK;
ganlikun 0:06036f8bee2d 583 }
ganlikun 0:06036f8bee2d 584
ganlikun 0:06036f8bee2d 585 /**
ganlikun 0:06036f8bee2d 586 * @brief De-activate and de-initialize a dedicated endpoint
ganlikun 0:06036f8bee2d 587 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 588 * @param ep: pointer to endpoint structure
ganlikun 0:06036f8bee2d 589 * @retval HAL status
ganlikun 0:06036f8bee2d 590 */
ganlikun 0:06036f8bee2d 591 HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)
ganlikun 0:06036f8bee2d 592 {
ganlikun 0:06036f8bee2d 593 uint32_t count = 0U;
ganlikun 0:06036f8bee2d 594
ganlikun 0:06036f8bee2d 595 /* Disable the IN endpoint */
ganlikun 0:06036f8bee2d 596 if (ep->is_in == 1U)
ganlikun 0:06036f8bee2d 597 {
ganlikun 0:06036f8bee2d 598 USBx_INEP(ep->num)->DIEPCTL &= ~USB_OTG_DIEPCTL_USBAEP;
ganlikun 0:06036f8bee2d 599
ganlikun 0:06036f8bee2d 600 /* sets the NAK bit for the IN endpoint */
ganlikun 0:06036f8bee2d 601 USBx_INEP(ep->num)->DIEPCTL = USB_OTG_DIEPCTL_SNAK;
ganlikun 0:06036f8bee2d 602
ganlikun 0:06036f8bee2d 603 /* Disable IN endpoint */
ganlikun 0:06036f8bee2d 604 USBx_INEP(ep->num)->DIEPCTL = USB_OTG_DIEPCTL_EPDIS;
ganlikun 0:06036f8bee2d 605
ganlikun 0:06036f8bee2d 606 do
ganlikun 0:06036f8bee2d 607 {
ganlikun 0:06036f8bee2d 608 if (++count > 200000U)
ganlikun 0:06036f8bee2d 609 {
ganlikun 0:06036f8bee2d 610 return HAL_TIMEOUT;
ganlikun 0:06036f8bee2d 611 }
ganlikun 0:06036f8bee2d 612 }
ganlikun 0:06036f8bee2d 613
ganlikun 0:06036f8bee2d 614 /*Wait for EPDISD endpoint disabled interrupt*/
ganlikun 0:06036f8bee2d 615 while ((USBx_INEP(ep->num)->DIEPINT & USB_OTG_DIEPCTL_EPDIS) == USB_OTG_DIEPCTL_EPDIS);
ganlikun 0:06036f8bee2d 616
ganlikun 0:06036f8bee2d 617
ganlikun 0:06036f8bee2d 618 /* Flush any data remaining in the TxFIFO */
ganlikun 0:06036f8bee2d 619 USB_FlushTxFifo(USBx , 0x10U);
ganlikun 0:06036f8bee2d 620
ganlikun 0:06036f8bee2d 621 /* Disable endpoint interrupts */
ganlikun 0:06036f8bee2d 622 USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1U << (ep->num))));
ganlikun 0:06036f8bee2d 623
ganlikun 0:06036f8bee2d 624 }
ganlikun 0:06036f8bee2d 625 else /* Disable the OUT endpoint */
ganlikun 0:06036f8bee2d 626 {
ganlikun 0:06036f8bee2d 627
ganlikun 0:06036f8bee2d 628 USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP;
ganlikun 0:06036f8bee2d 629
ganlikun 0:06036f8bee2d 630 /* sets the NAK bit for the OUT endpoint */
ganlikun 0:06036f8bee2d 631 USBx_OUTEP(ep->num)->DOEPCTL = USB_OTG_DOEPCTL_SNAK;
ganlikun 0:06036f8bee2d 632
ganlikun 0:06036f8bee2d 633 /* Disable OUT endpoint */
ganlikun 0:06036f8bee2d 634 USBx_OUTEP(ep->num)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS;
ganlikun 0:06036f8bee2d 635
ganlikun 0:06036f8bee2d 636 do
ganlikun 0:06036f8bee2d 637 {
ganlikun 0:06036f8bee2d 638 if (++count > 200000U)
ganlikun 0:06036f8bee2d 639 {
ganlikun 0:06036f8bee2d 640 return HAL_TIMEOUT;
ganlikun 0:06036f8bee2d 641 }
ganlikun 0:06036f8bee2d 642 }
ganlikun 0:06036f8bee2d 643
ganlikun 0:06036f8bee2d 644 /*Wait for EPDISD endpoint disabled interrupt*/
ganlikun 0:06036f8bee2d 645 while ((USBx_OUTEP(ep->num)->DOEPINT & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS);
ganlikun 0:06036f8bee2d 646
ganlikun 0:06036f8bee2d 647 /* Set the "Clear the Global OUT NAK bit" to disable global OUT NAK mode */
ganlikun 0:06036f8bee2d 648 USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGONAK;
ganlikun 0:06036f8bee2d 649
ganlikun 0:06036f8bee2d 650 /* Disable endpoint interrupts */
ganlikun 0:06036f8bee2d 651 USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1U << (ep->num)) << 16U));
ganlikun 0:06036f8bee2d 652 }
ganlikun 0:06036f8bee2d 653 return HAL_OK;
ganlikun 0:06036f8bee2d 654
ganlikun 0:06036f8bee2d 655 }
ganlikun 0:06036f8bee2d 656
ganlikun 0:06036f8bee2d 657 /**
ganlikun 0:06036f8bee2d 658 * @brief USB_EPStartXfer : setup and starts a transfer over an EP
ganlikun 0:06036f8bee2d 659 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 660 * @param ep: pointer to endpoint structure
ganlikun 0:06036f8bee2d 661 * @param dma: USB dma enabled or disabled
ganlikun 0:06036f8bee2d 662 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 663 * 0 : DMA feature not used
ganlikun 0:06036f8bee2d 664 * 1 : DMA feature used
ganlikun 0:06036f8bee2d 665 * @retval HAL status
ganlikun 0:06036f8bee2d 666 */
ganlikun 0:06036f8bee2d 667 HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep, uint8_t dma)
ganlikun 0:06036f8bee2d 668 {
ganlikun 0:06036f8bee2d 669 uint16_t pktcnt = 0U;
ganlikun 0:06036f8bee2d 670
ganlikun 0:06036f8bee2d 671 /* IN endpoint */
ganlikun 0:06036f8bee2d 672 if (ep->is_in == 1U)
ganlikun 0:06036f8bee2d 673 {
ganlikun 0:06036f8bee2d 674 /* Zero Length Packet? */
ganlikun 0:06036f8bee2d 675 if (ep->xfer_len == 0U)
ganlikun 0:06036f8bee2d 676 {
ganlikun 0:06036f8bee2d 677 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
ganlikun 0:06036f8bee2d 678 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19U)) ;
ganlikun 0:06036f8bee2d 679 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
ganlikun 0:06036f8bee2d 680 }
ganlikun 0:06036f8bee2d 681 else
ganlikun 0:06036f8bee2d 682 {
ganlikun 0:06036f8bee2d 683 /* Program the transfer size and packet count
ganlikun 0:06036f8bee2d 684 * as follows: xfersize = N * maxpacket +
ganlikun 0:06036f8bee2d 685 * short_packet pktcnt = N + (short_packet
ganlikun 0:06036f8bee2d 686 * exist ? 1 : 0)
ganlikun 0:06036f8bee2d 687 */
ganlikun 0:06036f8bee2d 688 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
ganlikun 0:06036f8bee2d 689 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
ganlikun 0:06036f8bee2d 690 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (((ep->xfer_len + ep->maxpacket -1U)/ ep->maxpacket) << 19U)) ;
ganlikun 0:06036f8bee2d 691 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len);
ganlikun 0:06036f8bee2d 692
ganlikun 0:06036f8bee2d 693 if (ep->type == EP_TYPE_ISOC)
ganlikun 0:06036f8bee2d 694 {
ganlikun 0:06036f8bee2d 695 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT);
ganlikun 0:06036f8bee2d 696 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1U << 29U));
ganlikun 0:06036f8bee2d 697 }
ganlikun 0:06036f8bee2d 698 }
ganlikun 0:06036f8bee2d 699
ganlikun 0:06036f8bee2d 700 if (dma == 1U)
ganlikun 0:06036f8bee2d 701 {
ganlikun 0:06036f8bee2d 702 USBx_INEP(ep->num)->DIEPDMA = (uint32_t)(ep->dma_addr);
ganlikun 0:06036f8bee2d 703 }
ganlikun 0:06036f8bee2d 704 else
ganlikun 0:06036f8bee2d 705 {
ganlikun 0:06036f8bee2d 706 if (ep->type != EP_TYPE_ISOC)
ganlikun 0:06036f8bee2d 707 {
ganlikun 0:06036f8bee2d 708 /* Enable the Tx FIFO Empty Interrupt for this EP */
ganlikun 0:06036f8bee2d 709 if (ep->xfer_len > 0U)
ganlikun 0:06036f8bee2d 710 {
ganlikun 0:06036f8bee2d 711 atomic_set_u32(&USBx_DEVICE->DIEPEMPMSK, 1U << ep->num);
ganlikun 0:06036f8bee2d 712 }
ganlikun 0:06036f8bee2d 713 }
ganlikun 0:06036f8bee2d 714 }
ganlikun 0:06036f8bee2d 715
ganlikun 0:06036f8bee2d 716 if (ep->type == EP_TYPE_ISOC)
ganlikun 0:06036f8bee2d 717 {
ganlikun 0:06036f8bee2d 718 if ((USBx_DEVICE->DSTS & ( 1U << 8U )) == 0U)
ganlikun 0:06036f8bee2d 719 {
ganlikun 0:06036f8bee2d 720 USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM;
ganlikun 0:06036f8bee2d 721 }
ganlikun 0:06036f8bee2d 722 else
ganlikun 0:06036f8bee2d 723 {
ganlikun 0:06036f8bee2d 724 USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM;
ganlikun 0:06036f8bee2d 725 }
ganlikun 0:06036f8bee2d 726 }
ganlikun 0:06036f8bee2d 727
ganlikun 0:06036f8bee2d 728 /* EP enable, IN data in FIFO */
ganlikun 0:06036f8bee2d 729 USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA);
ganlikun 0:06036f8bee2d 730
ganlikun 0:06036f8bee2d 731 if (ep->type == EP_TYPE_ISOC)
ganlikun 0:06036f8bee2d 732 {
ganlikun 0:06036f8bee2d 733 USB_WritePacket(USBx, ep->xfer_buff, ep->num, ep->xfer_len, dma);
ganlikun 0:06036f8bee2d 734 }
ganlikun 0:06036f8bee2d 735 }
ganlikun 0:06036f8bee2d 736 else /* OUT endpoint */
ganlikun 0:06036f8bee2d 737 {
ganlikun 0:06036f8bee2d 738 /* Program the transfer size and packet count as follows:
ganlikun 0:06036f8bee2d 739 * pktcnt = N
ganlikun 0:06036f8bee2d 740 * xfersize = N * maxpacket
ganlikun 0:06036f8bee2d 741 */
ganlikun 0:06036f8bee2d 742 USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ);
ganlikun 0:06036f8bee2d 743 USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT);
ganlikun 0:06036f8bee2d 744
ganlikun 0:06036f8bee2d 745 if (ep->xfer_len == 0U)
ganlikun 0:06036f8bee2d 746 {
ganlikun 0:06036f8bee2d 747 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->maxpacket);
ganlikun 0:06036f8bee2d 748 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19U));
ganlikun 0:06036f8bee2d 749 }
ganlikun 0:06036f8bee2d 750 else
ganlikun 0:06036f8bee2d 751 {
ganlikun 0:06036f8bee2d 752 pktcnt = (ep->xfer_len + ep->maxpacket -1U)/ ep->maxpacket;
ganlikun 0:06036f8bee2d 753 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (pktcnt << 19U));
ganlikun 0:06036f8bee2d 754 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket * pktcnt));
ganlikun 0:06036f8bee2d 755 }
ganlikun 0:06036f8bee2d 756
ganlikun 0:06036f8bee2d 757 if (dma == 1U)
ganlikun 0:06036f8bee2d 758 {
ganlikun 0:06036f8bee2d 759 USBx_OUTEP(ep->num)->DOEPDMA = (uint32_t)ep->xfer_buff;
ganlikun 0:06036f8bee2d 760 }
ganlikun 0:06036f8bee2d 761
ganlikun 0:06036f8bee2d 762 if (ep->type == EP_TYPE_ISOC)
ganlikun 0:06036f8bee2d 763 {
ganlikun 0:06036f8bee2d 764 if ((USBx_DEVICE->DSTS & ( 1U << 8U )) == 0U)
ganlikun 0:06036f8bee2d 765 {
ganlikun 0:06036f8bee2d 766 USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_SODDFRM;
ganlikun 0:06036f8bee2d 767 }
ganlikun 0:06036f8bee2d 768 else
ganlikun 0:06036f8bee2d 769 {
ganlikun 0:06036f8bee2d 770 USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM;
ganlikun 0:06036f8bee2d 771 }
ganlikun 0:06036f8bee2d 772 }
ganlikun 0:06036f8bee2d 773 /* EP enable */
ganlikun 0:06036f8bee2d 774 USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA);
ganlikun 0:06036f8bee2d 775 }
ganlikun 0:06036f8bee2d 776 return HAL_OK;
ganlikun 0:06036f8bee2d 777 }
ganlikun 0:06036f8bee2d 778
ganlikun 0:06036f8bee2d 779 /**
ganlikun 0:06036f8bee2d 780 * @brief USB_EP0StartXfer : setup and starts a transfer over the EP 0
ganlikun 0:06036f8bee2d 781 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 782 * @param ep: pointer to endpoint structure
ganlikun 0:06036f8bee2d 783 * @param dma: USB dma enabled or disabled
ganlikun 0:06036f8bee2d 784 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 785 * 0 : DMA feature not used
ganlikun 0:06036f8bee2d 786 * 1 : DMA feature used
ganlikun 0:06036f8bee2d 787 * @retval HAL status
ganlikun 0:06036f8bee2d 788 */
ganlikun 0:06036f8bee2d 789 HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep, uint8_t dma)
ganlikun 0:06036f8bee2d 790 {
ganlikun 0:06036f8bee2d 791 /* IN endpoint */
ganlikun 0:06036f8bee2d 792 if (ep->is_in == 1U)
ganlikun 0:06036f8bee2d 793 {
ganlikun 0:06036f8bee2d 794 /* Zero Length Packet? */
ganlikun 0:06036f8bee2d 795 if (ep->xfer_len == 0U)
ganlikun 0:06036f8bee2d 796 {
ganlikun 0:06036f8bee2d 797 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
ganlikun 0:06036f8bee2d 798 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19U)) ;
ganlikun 0:06036f8bee2d 799 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
ganlikun 0:06036f8bee2d 800 }
ganlikun 0:06036f8bee2d 801 else
ganlikun 0:06036f8bee2d 802 {
ganlikun 0:06036f8bee2d 803 /* Program the transfer size and packet count
ganlikun 0:06036f8bee2d 804 * as follows: xfersize = N * maxpacket +
ganlikun 0:06036f8bee2d 805 * short_packet pktcnt = N + (short_packet
ganlikun 0:06036f8bee2d 806 * exist ? 1 : 0)
ganlikun 0:06036f8bee2d 807 */
ganlikun 0:06036f8bee2d 808 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
ganlikun 0:06036f8bee2d 809 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
ganlikun 0:06036f8bee2d 810
ganlikun 0:06036f8bee2d 811 if(ep->xfer_len > ep->maxpacket)
ganlikun 0:06036f8bee2d 812 {
ganlikun 0:06036f8bee2d 813 ep->xfer_len = ep->maxpacket;
ganlikun 0:06036f8bee2d 814 }
ganlikun 0:06036f8bee2d 815 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19U)) ;
ganlikun 0:06036f8bee2d 816 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len);
ganlikun 0:06036f8bee2d 817
ganlikun 0:06036f8bee2d 818 }
ganlikun 0:06036f8bee2d 819
ganlikun 0:06036f8bee2d 820 /* EP enable, IN data in FIFO */
ganlikun 0:06036f8bee2d 821 USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA);
ganlikun 0:06036f8bee2d 822
ganlikun 0:06036f8bee2d 823 if (dma == 1)
ganlikun 0:06036f8bee2d 824 {
ganlikun 0:06036f8bee2d 825 USBx_INEP(ep->num)->DIEPDMA = (uint32_t)(ep->dma_addr);
ganlikun 0:06036f8bee2d 826 }
ganlikun 0:06036f8bee2d 827 else
ganlikun 0:06036f8bee2d 828 {
ganlikun 0:06036f8bee2d 829 /* Enable the Tx FIFO Empty Interrupt for this EP */
ganlikun 0:06036f8bee2d 830 if (ep->xfer_len > 0U)
ganlikun 0:06036f8bee2d 831 {
ganlikun 0:06036f8bee2d 832 atomic_set_u32(&USBx_DEVICE->DIEPEMPMSK, 1U << (ep->num));
ganlikun 0:06036f8bee2d 833 }
ganlikun 0:06036f8bee2d 834 }
ganlikun 0:06036f8bee2d 835 }
ganlikun 0:06036f8bee2d 836
ganlikun 0:06036f8bee2d 837 else /* OUT endpoint */
ganlikun 0:06036f8bee2d 838 {
ganlikun 0:06036f8bee2d 839 /* Program the transfer size and packet count as follows:
ganlikun 0:06036f8bee2d 840 * pktcnt = N
ganlikun 0:06036f8bee2d 841 * xfersize = N * maxpacket
ganlikun 0:06036f8bee2d 842 */
ganlikun 0:06036f8bee2d 843 USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ);
ganlikun 0:06036f8bee2d 844 USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT);
ganlikun 0:06036f8bee2d 845
ganlikun 0:06036f8bee2d 846 if (ep->xfer_len > 0U)
ganlikun 0:06036f8bee2d 847 {
ganlikun 0:06036f8bee2d 848 ep->xfer_len = ep->maxpacket;
ganlikun 0:06036f8bee2d 849 }
ganlikun 0:06036f8bee2d 850
ganlikun 0:06036f8bee2d 851 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19U));
ganlikun 0:06036f8bee2d 852 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket));
ganlikun 0:06036f8bee2d 853
ganlikun 0:06036f8bee2d 854
ganlikun 0:06036f8bee2d 855 if (dma == 1U)
ganlikun 0:06036f8bee2d 856 {
ganlikun 0:06036f8bee2d 857 USBx_OUTEP(ep->num)->DOEPDMA = (uint32_t)(ep->xfer_buff);
ganlikun 0:06036f8bee2d 858 }
ganlikun 0:06036f8bee2d 859
ganlikun 0:06036f8bee2d 860 /* EP enable */
ganlikun 0:06036f8bee2d 861 USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA);
ganlikun 0:06036f8bee2d 862 }
ganlikun 0:06036f8bee2d 863 return HAL_OK;
ganlikun 0:06036f8bee2d 864 }
ganlikun 0:06036f8bee2d 865
ganlikun 0:06036f8bee2d 866 /**
ganlikun 0:06036f8bee2d 867 * @brief USB_WritePacket : Writes a packet into the Tx FIFO associated
ganlikun 0:06036f8bee2d 868 * with the EP/channel
ganlikun 0:06036f8bee2d 869 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 870 * @param src : pointer to source buffer
ganlikun 0:06036f8bee2d 871 * @param ch_ep_num : endpoint or host channel number
ganlikun 0:06036f8bee2d 872 * @param len : Number of bytes to write
ganlikun 0:06036f8bee2d 873 * @param dma: USB dma enabled or disabled
ganlikun 0:06036f8bee2d 874 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 875 * 0 : DMA feature not used
ganlikun 0:06036f8bee2d 876 * 1 : DMA feature used
ganlikun 0:06036f8bee2d 877 * @retval HAL status
ganlikun 0:06036f8bee2d 878 */
ganlikun 0:06036f8bee2d 879 HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len, uint8_t dma)
ganlikun 0:06036f8bee2d 880 {
ganlikun 0:06036f8bee2d 881 uint32_t count32b = 0U , i = 0U;
ganlikun 0:06036f8bee2d 882
ganlikun 0:06036f8bee2d 883 if (dma == 0U)
ganlikun 0:06036f8bee2d 884 {
ganlikun 0:06036f8bee2d 885 count32b = (len + 3U) / 4U;
ganlikun 0:06036f8bee2d 886 for (i = 0U; i < count32b; i++, src += 4U)
ganlikun 0:06036f8bee2d 887 {
ganlikun 0:06036f8bee2d 888 USBx_DFIFO(ch_ep_num) = *((__packed uint32_t *)src);
ganlikun 0:06036f8bee2d 889 }
ganlikun 0:06036f8bee2d 890 }
ganlikun 0:06036f8bee2d 891 return HAL_OK;
ganlikun 0:06036f8bee2d 892 }
ganlikun 0:06036f8bee2d 893
ganlikun 0:06036f8bee2d 894 /**
ganlikun 0:06036f8bee2d 895 * @brief USB_ReadPacket : read a packet from the Tx FIFO associated
ganlikun 0:06036f8bee2d 896 * with the EP/channel
ganlikun 0:06036f8bee2d 897 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 898 * @param src : source pointer
ganlikun 0:06036f8bee2d 899 * @param ch_ep_num : endpoint or host channel number
ganlikun 0:06036f8bee2d 900 * @param len : Number of bytes to read
ganlikun 0:06036f8bee2d 901 * @param dma: USB dma enabled or disabled
ganlikun 0:06036f8bee2d 902 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 903 * 0 : DMA feature not used
ganlikun 0:06036f8bee2d 904 * 1 : DMA feature used
ganlikun 0:06036f8bee2d 905 * @retval pointer to destination buffer
ganlikun 0:06036f8bee2d 906 */
ganlikun 0:06036f8bee2d 907 void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len)
ganlikun 0:06036f8bee2d 908 {
ganlikun 0:06036f8bee2d 909 uint32_t i=0U;
ganlikun 0:06036f8bee2d 910 uint32_t count32b = (len + 3U) / 4U;
ganlikun 0:06036f8bee2d 911
ganlikun 0:06036f8bee2d 912 for ( i = 0U; i < count32b; i++, dest += 4U )
ganlikun 0:06036f8bee2d 913 {
ganlikun 0:06036f8bee2d 914 *(__packed uint32_t *)dest = USBx_DFIFO(0U);
ganlikun 0:06036f8bee2d 915
ganlikun 0:06036f8bee2d 916 }
ganlikun 0:06036f8bee2d 917 return ((void *)dest);
ganlikun 0:06036f8bee2d 918 }
ganlikun 0:06036f8bee2d 919
ganlikun 0:06036f8bee2d 920 /**
ganlikun 0:06036f8bee2d 921 * @brief USB_EPSetStall : set a stall condition over an EP
ganlikun 0:06036f8bee2d 922 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 923 * @param ep: pointer to endpoint structure
ganlikun 0:06036f8bee2d 924 * @retval HAL status
ganlikun 0:06036f8bee2d 925 */
ganlikun 0:06036f8bee2d 926 HAL_StatusTypeDef USB_EPSetStall(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep)
ganlikun 0:06036f8bee2d 927 {
ganlikun 0:06036f8bee2d 928 if (ep->is_in == 1U)
ganlikun 0:06036f8bee2d 929 {
ganlikun 0:06036f8bee2d 930 if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_EPENA) == 0U)
ganlikun 0:06036f8bee2d 931 {
ganlikun 0:06036f8bee2d 932 USBx_INEP(ep->num)->DIEPCTL &= ~(USB_OTG_DIEPCTL_EPDIS);
ganlikun 0:06036f8bee2d 933 }
ganlikun 0:06036f8bee2d 934 USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_STALL;
ganlikun 0:06036f8bee2d 935 }
ganlikun 0:06036f8bee2d 936 else
ganlikun 0:06036f8bee2d 937 {
ganlikun 0:06036f8bee2d 938 if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_EPENA) == 0U)
ganlikun 0:06036f8bee2d 939 {
ganlikun 0:06036f8bee2d 940 USBx_OUTEP(ep->num)->DOEPCTL &= ~(USB_OTG_DOEPCTL_EPDIS);
ganlikun 0:06036f8bee2d 941 }
ganlikun 0:06036f8bee2d 942 USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_STALL;
ganlikun 0:06036f8bee2d 943 }
ganlikun 0:06036f8bee2d 944 return HAL_OK;
ganlikun 0:06036f8bee2d 945 }
ganlikun 0:06036f8bee2d 946
ganlikun 0:06036f8bee2d 947
ganlikun 0:06036f8bee2d 948 /**
ganlikun 0:06036f8bee2d 949 * @brief USB_EPClearStall : Clear a stall condition over an EP
ganlikun 0:06036f8bee2d 950 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 951 * @param ep: pointer to endpoint structure
ganlikun 0:06036f8bee2d 952 * @retval HAL status
ganlikun 0:06036f8bee2d 953 */
ganlikun 0:06036f8bee2d 954 HAL_StatusTypeDef USB_EPClearStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)
ganlikun 0:06036f8bee2d 955 {
ganlikun 0:06036f8bee2d 956 if (ep->is_in == 1U)
ganlikun 0:06036f8bee2d 957 {
ganlikun 0:06036f8bee2d 958 USBx_INEP(ep->num)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL;
ganlikun 0:06036f8bee2d 959 if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK)
ganlikun 0:06036f8bee2d 960 {
ganlikun 0:06036f8bee2d 961 USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; /* DATA0 */
ganlikun 0:06036f8bee2d 962 }
ganlikun 0:06036f8bee2d 963 }
ganlikun 0:06036f8bee2d 964 else
ganlikun 0:06036f8bee2d 965 {
ganlikun 0:06036f8bee2d 966 USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL;
ganlikun 0:06036f8bee2d 967 if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK)
ganlikun 0:06036f8bee2d 968 {
ganlikun 0:06036f8bee2d 969 USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; /* DATA0 */
ganlikun 0:06036f8bee2d 970 }
ganlikun 0:06036f8bee2d 971 }
ganlikun 0:06036f8bee2d 972 return HAL_OK;
ganlikun 0:06036f8bee2d 973 }
ganlikun 0:06036f8bee2d 974
ganlikun 0:06036f8bee2d 975 /**
ganlikun 0:06036f8bee2d 976 * @brief USB_StopDevice : Stop the usb device mode
ganlikun 0:06036f8bee2d 977 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 978 * @retval HAL status
ganlikun 0:06036f8bee2d 979 */
ganlikun 0:06036f8bee2d 980 HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 981 {
ganlikun 0:06036f8bee2d 982 uint32_t i;
ganlikun 0:06036f8bee2d 983
ganlikun 0:06036f8bee2d 984 /* Clear Pending interrupt */
ganlikun 0:06036f8bee2d 985 for (i = 0U; i < 15U ; i++)
ganlikun 0:06036f8bee2d 986 {
ganlikun 0:06036f8bee2d 987 USBx_INEP(i)->DIEPINT = 0xFFU;
ganlikun 0:06036f8bee2d 988 USBx_OUTEP(i)->DOEPINT = 0xFFU;
ganlikun 0:06036f8bee2d 989 }
ganlikun 0:06036f8bee2d 990 USBx_DEVICE->DAINT = 0xFFFFFFFFU;
ganlikun 0:06036f8bee2d 991
ganlikun 0:06036f8bee2d 992 /* Clear interrupt masks */
ganlikun 0:06036f8bee2d 993 USBx_DEVICE->DIEPMSK = 0U;
ganlikun 0:06036f8bee2d 994 USBx_DEVICE->DOEPMSK = 0U;
ganlikun 0:06036f8bee2d 995 USBx_DEVICE->DAINTMSK = 0U;
ganlikun 0:06036f8bee2d 996
ganlikun 0:06036f8bee2d 997 /* Flush the FIFO */
ganlikun 0:06036f8bee2d 998 USB_FlushRxFifo(USBx);
ganlikun 0:06036f8bee2d 999 USB_FlushTxFifo(USBx , 0x10U);
ganlikun 0:06036f8bee2d 1000
ganlikun 0:06036f8bee2d 1001 return HAL_OK;
ganlikun 0:06036f8bee2d 1002 }
ganlikun 0:06036f8bee2d 1003
ganlikun 0:06036f8bee2d 1004 /**
ganlikun 0:06036f8bee2d 1005 * @brief USB_SetDevAddress : Stop the usb device mode
ganlikun 0:06036f8bee2d 1006 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1007 * @param address : new device address to be assigned
ganlikun 0:06036f8bee2d 1008 * This parameter can be a value from 0 to 255
ganlikun 0:06036f8bee2d 1009 * @retval HAL status
ganlikun 0:06036f8bee2d 1010 */
ganlikun 0:06036f8bee2d 1011 HAL_StatusTypeDef USB_SetDevAddress (USB_OTG_GlobalTypeDef *USBx, uint8_t address)
ganlikun 0:06036f8bee2d 1012 {
ganlikun 0:06036f8bee2d 1013 USBx_DEVICE->DCFG &= ~ (USB_OTG_DCFG_DAD);
ganlikun 0:06036f8bee2d 1014 USBx_DEVICE->DCFG |= (address << 4U) & USB_OTG_DCFG_DAD ;
ganlikun 0:06036f8bee2d 1015
ganlikun 0:06036f8bee2d 1016 return HAL_OK;
ganlikun 0:06036f8bee2d 1017 }
ganlikun 0:06036f8bee2d 1018
ganlikun 0:06036f8bee2d 1019 /**
ganlikun 0:06036f8bee2d 1020 * @brief USB_DevConnect : Connect the USB device by enabling the pull-up/pull-down
ganlikun 0:06036f8bee2d 1021 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1022 * @retval HAL status
ganlikun 0:06036f8bee2d 1023 */
ganlikun 0:06036f8bee2d 1024 HAL_StatusTypeDef USB_DevConnect (USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1025 {
ganlikun 0:06036f8bee2d 1026 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS ;
ganlikun 0:06036f8bee2d 1027 HAL_Delay(3U);
ganlikun 0:06036f8bee2d 1028
ganlikun 0:06036f8bee2d 1029 return HAL_OK;
ganlikun 0:06036f8bee2d 1030 }
ganlikun 0:06036f8bee2d 1031
ganlikun 0:06036f8bee2d 1032 /**
ganlikun 0:06036f8bee2d 1033 * @brief USB_DevDisconnect : Disconnect the USB device by disabling the pull-up/pull-down
ganlikun 0:06036f8bee2d 1034 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1035 * @retval HAL status
ganlikun 0:06036f8bee2d 1036 */
ganlikun 0:06036f8bee2d 1037 HAL_StatusTypeDef USB_DevDisconnect (USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1038 {
ganlikun 0:06036f8bee2d 1039 USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS ;
ganlikun 0:06036f8bee2d 1040 HAL_Delay(3U);
ganlikun 0:06036f8bee2d 1041
ganlikun 0:06036f8bee2d 1042 return HAL_OK;
ganlikun 0:06036f8bee2d 1043 }
ganlikun 0:06036f8bee2d 1044
ganlikun 0:06036f8bee2d 1045 /**
ganlikun 0:06036f8bee2d 1046 * @brief USB_ReadInterrupts: return the global USB interrupt status
ganlikun 0:06036f8bee2d 1047 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1048 * @retval HAL status
ganlikun 0:06036f8bee2d 1049 */
ganlikun 0:06036f8bee2d 1050 uint32_t USB_ReadInterrupts (USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1051 {
ganlikun 0:06036f8bee2d 1052 uint32_t v = 0U;
ganlikun 0:06036f8bee2d 1053
ganlikun 0:06036f8bee2d 1054 v = USBx->GINTSTS;
ganlikun 0:06036f8bee2d 1055 v &= USBx->GINTMSK;
ganlikun 0:06036f8bee2d 1056 return v;
ganlikun 0:06036f8bee2d 1057 }
ganlikun 0:06036f8bee2d 1058
ganlikun 0:06036f8bee2d 1059 /**
ganlikun 0:06036f8bee2d 1060 * @brief USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status
ganlikun 0:06036f8bee2d 1061 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1062 * @retval HAL status
ganlikun 0:06036f8bee2d 1063 */
ganlikun 0:06036f8bee2d 1064 uint32_t USB_ReadDevAllOutEpInterrupt (USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1065 {
ganlikun 0:06036f8bee2d 1066 uint32_t v;
ganlikun 0:06036f8bee2d 1067 v = USBx_DEVICE->DAINT;
ganlikun 0:06036f8bee2d 1068 v &= USBx_DEVICE->DAINTMSK;
ganlikun 0:06036f8bee2d 1069 return ((v & 0xffff0000U) >> 16U);
ganlikun 0:06036f8bee2d 1070 }
ganlikun 0:06036f8bee2d 1071
ganlikun 0:06036f8bee2d 1072 /**
ganlikun 0:06036f8bee2d 1073 * @brief USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status
ganlikun 0:06036f8bee2d 1074 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1075 * @retval HAL status
ganlikun 0:06036f8bee2d 1076 */
ganlikun 0:06036f8bee2d 1077 uint32_t USB_ReadDevAllInEpInterrupt (USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1078 {
ganlikun 0:06036f8bee2d 1079 uint32_t v;
ganlikun 0:06036f8bee2d 1080 v = USBx_DEVICE->DAINT;
ganlikun 0:06036f8bee2d 1081 v &= USBx_DEVICE->DAINTMSK;
ganlikun 0:06036f8bee2d 1082 return ((v & 0xFFFFU));
ganlikun 0:06036f8bee2d 1083 }
ganlikun 0:06036f8bee2d 1084
ganlikun 0:06036f8bee2d 1085 /**
ganlikun 0:06036f8bee2d 1086 * @brief Returns Device OUT EP Interrupt register
ganlikun 0:06036f8bee2d 1087 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1088 * @param epnum : endpoint number
ganlikun 0:06036f8bee2d 1089 * This parameter can be a value from 0 to 15
ganlikun 0:06036f8bee2d 1090 * @retval Device OUT EP Interrupt register
ganlikun 0:06036f8bee2d 1091 */
ganlikun 0:06036f8bee2d 1092 uint32_t USB_ReadDevOutEPInterrupt (USB_OTG_GlobalTypeDef *USBx , uint8_t epnum)
ganlikun 0:06036f8bee2d 1093 {
ganlikun 0:06036f8bee2d 1094 uint32_t v;
ganlikun 0:06036f8bee2d 1095 v = USBx_OUTEP(epnum)->DOEPINT;
ganlikun 0:06036f8bee2d 1096 v &= USBx_DEVICE->DOEPMSK;
ganlikun 0:06036f8bee2d 1097 return v;
ganlikun 0:06036f8bee2d 1098 }
ganlikun 0:06036f8bee2d 1099
ganlikun 0:06036f8bee2d 1100 /**
ganlikun 0:06036f8bee2d 1101 * @brief Returns Device IN EP Interrupt register
ganlikun 0:06036f8bee2d 1102 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1103 * @param epnum : endpoint number
ganlikun 0:06036f8bee2d 1104 * This parameter can be a value from 0 to 15
ganlikun 0:06036f8bee2d 1105 * @retval Device IN EP Interrupt register
ganlikun 0:06036f8bee2d 1106 */
ganlikun 0:06036f8bee2d 1107 uint32_t USB_ReadDevInEPInterrupt (USB_OTG_GlobalTypeDef *USBx , uint8_t epnum)
ganlikun 0:06036f8bee2d 1108 {
ganlikun 0:06036f8bee2d 1109 uint32_t v, msk, emp;
ganlikun 0:06036f8bee2d 1110
ganlikun 0:06036f8bee2d 1111 msk = USBx_DEVICE->DIEPMSK;
ganlikun 0:06036f8bee2d 1112 emp = USBx_DEVICE->DIEPEMPMSK;
ganlikun 0:06036f8bee2d 1113 msk |= ((emp >> epnum) & 0x1U) << 7U;
ganlikun 0:06036f8bee2d 1114 v = USBx_INEP(epnum)->DIEPINT & msk;
ganlikun 0:06036f8bee2d 1115 return v;
ganlikun 0:06036f8bee2d 1116 }
ganlikun 0:06036f8bee2d 1117
ganlikun 0:06036f8bee2d 1118 /**
ganlikun 0:06036f8bee2d 1119 * @brief USB_ClearInterrupts: clear a USB interrupt
ganlikun 0:06036f8bee2d 1120 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1121 * @param interrupt : interrupt flag
ganlikun 0:06036f8bee2d 1122 * @retval None
ganlikun 0:06036f8bee2d 1123 */
ganlikun 0:06036f8bee2d 1124 void USB_ClearInterrupts (USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt)
ganlikun 0:06036f8bee2d 1125 {
ganlikun 0:06036f8bee2d 1126 USBx->GINTSTS |= interrupt;
ganlikun 0:06036f8bee2d 1127 }
ganlikun 0:06036f8bee2d 1128
ganlikun 0:06036f8bee2d 1129 /**
ganlikun 0:06036f8bee2d 1130 * @brief Returns USB core mode
ganlikun 0:06036f8bee2d 1131 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1132 * @retval return core mode : Host or Device
ganlikun 0:06036f8bee2d 1133 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 1134 * 0 : Host
ganlikun 0:06036f8bee2d 1135 * 1 : Device
ganlikun 0:06036f8bee2d 1136 */
ganlikun 0:06036f8bee2d 1137 uint32_t USB_GetMode(USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1138 {
ganlikun 0:06036f8bee2d 1139 return ((USBx->GINTSTS ) & 0x1U);
ganlikun 0:06036f8bee2d 1140 }
ganlikun 0:06036f8bee2d 1141
ganlikun 0:06036f8bee2d 1142
ganlikun 0:06036f8bee2d 1143 /**
ganlikun 0:06036f8bee2d 1144 * @brief Activate EP0 for Setup transactions
ganlikun 0:06036f8bee2d 1145 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1146 * @retval HAL status
ganlikun 0:06036f8bee2d 1147 */
ganlikun 0:06036f8bee2d 1148 HAL_StatusTypeDef USB_ActivateSetup (USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1149 {
ganlikun 0:06036f8bee2d 1150 /* Set the MPS of the IN EP based on the enumeration speed */
ganlikun 0:06036f8bee2d 1151 USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ;
ganlikun 0:06036f8bee2d 1152
ganlikun 0:06036f8bee2d 1153 if((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ)
ganlikun 0:06036f8bee2d 1154 {
ganlikun 0:06036f8bee2d 1155 USBx_INEP(0U)->DIEPCTL |= 3U;
ganlikun 0:06036f8bee2d 1156 }
ganlikun 0:06036f8bee2d 1157 USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK;
ganlikun 0:06036f8bee2d 1158
ganlikun 0:06036f8bee2d 1159 return HAL_OK;
ganlikun 0:06036f8bee2d 1160 }
ganlikun 0:06036f8bee2d 1161
ganlikun 0:06036f8bee2d 1162
ganlikun 0:06036f8bee2d 1163 /**
ganlikun 0:06036f8bee2d 1164 * @brief Prepare the EP0 to start the first control setup
ganlikun 0:06036f8bee2d 1165 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1166 * @param dma: USB dma enabled or disabled
ganlikun 0:06036f8bee2d 1167 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 1168 * 0 : DMA feature not used
ganlikun 0:06036f8bee2d 1169 * 1 : DMA feature used
ganlikun 0:06036f8bee2d 1170 * @param psetup : pointer to setup packet
ganlikun 0:06036f8bee2d 1171 * @retval HAL status
ganlikun 0:06036f8bee2d 1172 */
ganlikun 0:06036f8bee2d 1173 HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t dma, uint8_t *psetup)
ganlikun 0:06036f8bee2d 1174 {
ganlikun 0:06036f8bee2d 1175 USBx_OUTEP(0U)->DOEPTSIZ = 0U;
ganlikun 0:06036f8bee2d 1176 USBx_OUTEP(0U)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19U)) ;
ganlikun 0:06036f8bee2d 1177 USBx_OUTEP(0U)->DOEPTSIZ |= (3U * 8U);
ganlikun 0:06036f8bee2d 1178 USBx_OUTEP(0U)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_STUPCNT;
ganlikun 0:06036f8bee2d 1179
ganlikun 0:06036f8bee2d 1180 if (dma == 1U)
ganlikun 0:06036f8bee2d 1181 {
ganlikun 0:06036f8bee2d 1182 USBx_OUTEP(0U)->DOEPDMA = (uint32_t)psetup;
ganlikun 0:06036f8bee2d 1183 /* EP enable */
ganlikun 0:06036f8bee2d 1184 USBx_OUTEP(0U)->DOEPCTL = 0x80008000U;
ganlikun 0:06036f8bee2d 1185 }
ganlikun 0:06036f8bee2d 1186
ganlikun 0:06036f8bee2d 1187 return HAL_OK;
ganlikun 0:06036f8bee2d 1188 }
ganlikun 0:06036f8bee2d 1189
ganlikun 0:06036f8bee2d 1190
ganlikun 0:06036f8bee2d 1191 /**
ganlikun 0:06036f8bee2d 1192 * @brief Reset the USB Core (needed after USB clock settings change)
ganlikun 0:06036f8bee2d 1193 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1194 * @retval HAL status
ganlikun 0:06036f8bee2d 1195 */
ganlikun 0:06036f8bee2d 1196 static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1197 {
ganlikun 0:06036f8bee2d 1198 uint32_t count = 0U;
ganlikun 0:06036f8bee2d 1199
ganlikun 0:06036f8bee2d 1200 /* Wait for AHB master IDLE state. */
ganlikun 0:06036f8bee2d 1201 do
ganlikun 0:06036f8bee2d 1202 {
ganlikun 0:06036f8bee2d 1203 if (++count > 200000U)
ganlikun 0:06036f8bee2d 1204 {
ganlikun 0:06036f8bee2d 1205 return HAL_TIMEOUT;
ganlikun 0:06036f8bee2d 1206 }
ganlikun 0:06036f8bee2d 1207 }
ganlikun 0:06036f8bee2d 1208 while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U);
ganlikun 0:06036f8bee2d 1209
ganlikun 0:06036f8bee2d 1210 /* Core Soft Reset */
ganlikun 0:06036f8bee2d 1211 count = 0U;
ganlikun 0:06036f8bee2d 1212 USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST;
ganlikun 0:06036f8bee2d 1213
ganlikun 0:06036f8bee2d 1214 do
ganlikun 0:06036f8bee2d 1215 {
ganlikun 0:06036f8bee2d 1216 if (++count > 200000U)
ganlikun 0:06036f8bee2d 1217 {
ganlikun 0:06036f8bee2d 1218 return HAL_TIMEOUT;
ganlikun 0:06036f8bee2d 1219 }
ganlikun 0:06036f8bee2d 1220 }
ganlikun 0:06036f8bee2d 1221 while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST);
ganlikun 0:06036f8bee2d 1222
ganlikun 0:06036f8bee2d 1223 return HAL_OK;
ganlikun 0:06036f8bee2d 1224 }
ganlikun 0:06036f8bee2d 1225
ganlikun 0:06036f8bee2d 1226
ganlikun 0:06036f8bee2d 1227 /**
ganlikun 0:06036f8bee2d 1228 * @brief USB_HostInit : Initializes the USB OTG controller registers
ganlikun 0:06036f8bee2d 1229 * for Host mode
ganlikun 0:06036f8bee2d 1230 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1231 * @param cfg : pointer to a USB_OTG_CfgTypeDef structure that contains
ganlikun 0:06036f8bee2d 1232 * the configuration information for the specified USBx peripheral.
ganlikun 0:06036f8bee2d 1233 * @retval HAL status
ganlikun 0:06036f8bee2d 1234 */
ganlikun 0:06036f8bee2d 1235 HAL_StatusTypeDef USB_HostInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
ganlikun 0:06036f8bee2d 1236 {
ganlikun 0:06036f8bee2d 1237 uint32_t i;
ganlikun 0:06036f8bee2d 1238
ganlikun 0:06036f8bee2d 1239 /* Restart the Phy Clock */
ganlikun 0:06036f8bee2d 1240 USBx_PCGCCTL = 0U;
ganlikun 0:06036f8bee2d 1241
ganlikun 0:06036f8bee2d 1242 /* Activate VBUS Sensing B */
ganlikun 0:06036f8bee2d 1243 #if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \
ganlikun 0:06036f8bee2d 1244 defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx)
ganlikun 0:06036f8bee2d 1245 USBx->GCCFG |= USB_OTG_GCCFG_VBDEN;
ganlikun 0:06036f8bee2d 1246 #else
ganlikun 0:06036f8bee2d 1247 USBx->GCCFG &=~ (USB_OTG_GCCFG_VBUSASEN);
ganlikun 0:06036f8bee2d 1248 USBx->GCCFG &=~ (USB_OTG_GCCFG_VBUSBSEN);
ganlikun 0:06036f8bee2d 1249 USBx->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS;
ganlikun 0:06036f8bee2d 1250 #endif /* STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || STM32F413xx || STM32F423xx */
ganlikun 0:06036f8bee2d 1251
ganlikun 0:06036f8bee2d 1252 /* Disable the FS/LS support mode only */
ganlikun 0:06036f8bee2d 1253 if((cfg.speed == USB_OTG_SPEED_FULL)&&
ganlikun 0:06036f8bee2d 1254 (USBx != USB_OTG_FS))
ganlikun 0:06036f8bee2d 1255 {
ganlikun 0:06036f8bee2d 1256 USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS;
ganlikun 0:06036f8bee2d 1257 }
ganlikun 0:06036f8bee2d 1258 else
ganlikun 0:06036f8bee2d 1259 {
ganlikun 0:06036f8bee2d 1260 USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS);
ganlikun 0:06036f8bee2d 1261 }
ganlikun 0:06036f8bee2d 1262
ganlikun 0:06036f8bee2d 1263 /* Make sure the FIFOs are flushed. */
ganlikun 0:06036f8bee2d 1264 USB_FlushTxFifo(USBx, 0x10U); /* all Tx FIFOs */
ganlikun 0:06036f8bee2d 1265 USB_FlushRxFifo(USBx);
ganlikun 0:06036f8bee2d 1266
ganlikun 0:06036f8bee2d 1267 /* Clear all pending HC Interrupts */
ganlikun 0:06036f8bee2d 1268 for (i = 0U; i < cfg.Host_channels; i++)
ganlikun 0:06036f8bee2d 1269 {
ganlikun 0:06036f8bee2d 1270 USBx_HC(i)->HCINT = 0xFFFFFFFFU;
ganlikun 0:06036f8bee2d 1271 USBx_HC(i)->HCINTMSK = 0U;
ganlikun 0:06036f8bee2d 1272 }
ganlikun 0:06036f8bee2d 1273
ganlikun 0:06036f8bee2d 1274 /* Enable VBUS driving */
ganlikun 0:06036f8bee2d 1275 USB_DriveVbus(USBx, 1U);
ganlikun 0:06036f8bee2d 1276
ganlikun 0:06036f8bee2d 1277 HAL_Delay(200U);
ganlikun 0:06036f8bee2d 1278
ganlikun 0:06036f8bee2d 1279 /* Disable all interrupts. */
ganlikun 0:06036f8bee2d 1280 USBx->GINTMSK = 0U;
ganlikun 0:06036f8bee2d 1281
ganlikun 0:06036f8bee2d 1282 /* Clear any pending interrupts */
ganlikun 0:06036f8bee2d 1283 USBx->GINTSTS = 0xFFFFFFFFU;
ganlikun 0:06036f8bee2d 1284
ganlikun 0:06036f8bee2d 1285 if(USBx == USB_OTG_FS)
ganlikun 0:06036f8bee2d 1286 {
ganlikun 0:06036f8bee2d 1287 /* set Rx FIFO size */
ganlikun 0:06036f8bee2d 1288 USBx->GRXFSIZ = 0x80U;
ganlikun 0:06036f8bee2d 1289 USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t )(((0x60U << 16U)& USB_OTG_NPTXFD) | 0x80U);
ganlikun 0:06036f8bee2d 1290 USBx->HPTXFSIZ = (uint32_t )(((0x40U << 16U)& USB_OTG_HPTXFSIZ_PTXFD) | 0xE0U);
ganlikun 0:06036f8bee2d 1291 }
ganlikun 0:06036f8bee2d 1292 else
ganlikun 0:06036f8bee2d 1293 {
ganlikun 0:06036f8bee2d 1294 /* set Rx FIFO size */
ganlikun 0:06036f8bee2d 1295 USBx->GRXFSIZ = 0x200U;
ganlikun 0:06036f8bee2d 1296 USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t )(((0x100U << 16U)& USB_OTG_NPTXFD) | 0x200U);
ganlikun 0:06036f8bee2d 1297 USBx->HPTXFSIZ = (uint32_t )(((0xE0U << 16U)& USB_OTG_HPTXFSIZ_PTXFD) | 0x300U);
ganlikun 0:06036f8bee2d 1298 }
ganlikun 0:06036f8bee2d 1299
ganlikun 0:06036f8bee2d 1300 /* Enable the common interrupts */
ganlikun 0:06036f8bee2d 1301 if (cfg.dma_enable == DISABLE)
ganlikun 0:06036f8bee2d 1302 {
ganlikun 0:06036f8bee2d 1303 USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM;
ganlikun 0:06036f8bee2d 1304 }
ganlikun 0:06036f8bee2d 1305
ganlikun 0:06036f8bee2d 1306 /* Enable interrupts matching to the Host mode ONLY */
ganlikun 0:06036f8bee2d 1307 USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM |\
ganlikun 0:06036f8bee2d 1308 USB_OTG_GINTMSK_SOFM |USB_OTG_GINTSTS_DISCINT|\
ganlikun 0:06036f8bee2d 1309 USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM);
ganlikun 0:06036f8bee2d 1310
ganlikun 0:06036f8bee2d 1311 return HAL_OK;
ganlikun 0:06036f8bee2d 1312 }
ganlikun 0:06036f8bee2d 1313
ganlikun 0:06036f8bee2d 1314 /**
ganlikun 0:06036f8bee2d 1315 * @brief USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the
ganlikun 0:06036f8bee2d 1316 * HCFG register on the PHY type and set the right frame interval
ganlikun 0:06036f8bee2d 1317 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1318 * @param freq : clock frequency
ganlikun 0:06036f8bee2d 1319 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 1320 * HCFG_48_MHZ : Full Speed 48 MHz Clock
ganlikun 0:06036f8bee2d 1321 * HCFG_6_MHZ : Low Speed 6 MHz Clock
ganlikun 0:06036f8bee2d 1322 * @retval HAL status
ganlikun 0:06036f8bee2d 1323 */
ganlikun 0:06036f8bee2d 1324 HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx , uint8_t freq)
ganlikun 0:06036f8bee2d 1325 {
ganlikun 0:06036f8bee2d 1326 USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSPCS);
ganlikun 0:06036f8bee2d 1327 USBx_HOST->HCFG |= (freq & USB_OTG_HCFG_FSLSPCS);
ganlikun 0:06036f8bee2d 1328
ganlikun 0:06036f8bee2d 1329 if (freq == HCFG_48_MHZ)
ganlikun 0:06036f8bee2d 1330 {
ganlikun 0:06036f8bee2d 1331 USBx_HOST->HFIR = 48000U;
ganlikun 0:06036f8bee2d 1332 }
ganlikun 0:06036f8bee2d 1333 else if (freq == HCFG_6_MHZ)
ganlikun 0:06036f8bee2d 1334 {
ganlikun 0:06036f8bee2d 1335 USBx_HOST->HFIR = 6000U;
ganlikun 0:06036f8bee2d 1336 }
ganlikun 0:06036f8bee2d 1337 return HAL_OK;
ganlikun 0:06036f8bee2d 1338 }
ganlikun 0:06036f8bee2d 1339
ganlikun 0:06036f8bee2d 1340 /**
ganlikun 0:06036f8bee2d 1341 * @brief USB_OTG_ResetPort : Reset Host Port
ganlikun 0:06036f8bee2d 1342 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1343 * @retval HAL status
ganlikun 0:06036f8bee2d 1344 * @note (1)The application must wait at least 10 ms
ganlikun 0:06036f8bee2d 1345 * before clearing the reset bit.
ganlikun 0:06036f8bee2d 1346 */
ganlikun 0:06036f8bee2d 1347 HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1348 {
ganlikun 0:06036f8bee2d 1349 __IO uint32_t hprt0;
ganlikun 0:06036f8bee2d 1350
ganlikun 0:06036f8bee2d 1351 hprt0 = USBx_HPRT0;
ganlikun 0:06036f8bee2d 1352
ganlikun 0:06036f8bee2d 1353 hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
ganlikun 0:06036f8bee2d 1354 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
ganlikun 0:06036f8bee2d 1355
ganlikun 0:06036f8bee2d 1356 USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0);
ganlikun 0:06036f8bee2d 1357 HAL_Delay (10U); /* See Note #1 */
ganlikun 0:06036f8bee2d 1358 USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0);
ganlikun 0:06036f8bee2d 1359 return HAL_OK;
ganlikun 0:06036f8bee2d 1360 }
ganlikun 0:06036f8bee2d 1361
ganlikun 0:06036f8bee2d 1362 /**
ganlikun 0:06036f8bee2d 1363 * @brief USB_DriveVbus : activate or de-activate vbus
ganlikun 0:06036f8bee2d 1364 * @param state : VBUS state
ganlikun 0:06036f8bee2d 1365 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 1366 * 0 : VBUS Active
ganlikun 0:06036f8bee2d 1367 * 1 : VBUS Inactive
ganlikun 0:06036f8bee2d 1368 * @retval HAL status
ganlikun 0:06036f8bee2d 1369 */
ganlikun 0:06036f8bee2d 1370 HAL_StatusTypeDef USB_DriveVbus (USB_OTG_GlobalTypeDef *USBx, uint8_t state)
ganlikun 0:06036f8bee2d 1371 {
ganlikun 0:06036f8bee2d 1372 __IO uint32_t hprt0;
ganlikun 0:06036f8bee2d 1373
ganlikun 0:06036f8bee2d 1374 hprt0 = USBx_HPRT0;
ganlikun 0:06036f8bee2d 1375 hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
ganlikun 0:06036f8bee2d 1376 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
ganlikun 0:06036f8bee2d 1377
ganlikun 0:06036f8bee2d 1378 if (((hprt0 & USB_OTG_HPRT_PPWR) == 0U) && (state == 1U))
ganlikun 0:06036f8bee2d 1379 {
ganlikun 0:06036f8bee2d 1380 USBx_HPRT0 = (USB_OTG_HPRT_PPWR | hprt0);
ganlikun 0:06036f8bee2d 1381 }
ganlikun 0:06036f8bee2d 1382 if (((hprt0 & USB_OTG_HPRT_PPWR) == USB_OTG_HPRT_PPWR) && (state == 0U))
ganlikun 0:06036f8bee2d 1383 {
ganlikun 0:06036f8bee2d 1384 USBx_HPRT0 = ((~USB_OTG_HPRT_PPWR) & hprt0);
ganlikun 0:06036f8bee2d 1385 }
ganlikun 0:06036f8bee2d 1386 return HAL_OK;
ganlikun 0:06036f8bee2d 1387 }
ganlikun 0:06036f8bee2d 1388
ganlikun 0:06036f8bee2d 1389 /**
ganlikun 0:06036f8bee2d 1390 * @brief Return Host Core speed
ganlikun 0:06036f8bee2d 1391 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1392 * @retval speed : Host speed
ganlikun 0:06036f8bee2d 1393 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 1394 * @arg USB_OTG_SPEED_HIGH: High speed mode
ganlikun 0:06036f8bee2d 1395 * @arg USB_OTG_SPEED_FULL: Full speed mode
ganlikun 0:06036f8bee2d 1396 * @arg USB_OTG_SPEED_LOW: Low speed mode
ganlikun 0:06036f8bee2d 1397 */
ganlikun 0:06036f8bee2d 1398 uint32_t USB_GetHostSpeed (USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1399 {
ganlikun 0:06036f8bee2d 1400 __IO uint32_t hprt0;
ganlikun 0:06036f8bee2d 1401
ganlikun 0:06036f8bee2d 1402 hprt0 = USBx_HPRT0;
ganlikun 0:06036f8bee2d 1403 return ((hprt0 & USB_OTG_HPRT_PSPD) >> 17U);
ganlikun 0:06036f8bee2d 1404 }
ganlikun 0:06036f8bee2d 1405
ganlikun 0:06036f8bee2d 1406 /**
ganlikun 0:06036f8bee2d 1407 * @brief Return Host Current Frame number
ganlikun 0:06036f8bee2d 1408 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1409 * @retval current frame number
ganlikun 0:06036f8bee2d 1410 */
ganlikun 0:06036f8bee2d 1411 uint32_t USB_GetCurrentFrame (USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1412 {
ganlikun 0:06036f8bee2d 1413 return (USBx_HOST->HFNUM & USB_OTG_HFNUM_FRNUM);
ganlikun 0:06036f8bee2d 1414 }
ganlikun 0:06036f8bee2d 1415
ganlikun 0:06036f8bee2d 1416 /**
ganlikun 0:06036f8bee2d 1417 * @brief Initialize a host channel
ganlikun 0:06036f8bee2d 1418 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1419 * @param ch_num : Channel number
ganlikun 0:06036f8bee2d 1420 * This parameter can be a value from 1 to 15
ganlikun 0:06036f8bee2d 1421 * @param epnum : Endpoint number
ganlikun 0:06036f8bee2d 1422 * This parameter can be a value from 1 to 15
ganlikun 0:06036f8bee2d 1423 * @param dev_address : Current device address
ganlikun 0:06036f8bee2d 1424 * This parameter can be a value from 0 to 255
ganlikun 0:06036f8bee2d 1425 * @param speed : Current device speed
ganlikun 0:06036f8bee2d 1426 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 1427 * @arg USB_OTG_SPEED_HIGH: High speed mode
ganlikun 0:06036f8bee2d 1428 * @arg USB_OTG_SPEED_FULL: Full speed mode
ganlikun 0:06036f8bee2d 1429 * @arg USB_OTG_SPEED_LOW: Low speed mode
ganlikun 0:06036f8bee2d 1430 * @param ep_type : Endpoint Type
ganlikun 0:06036f8bee2d 1431 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 1432 * @arg EP_TYPE_CTRL: Control type
ganlikun 0:06036f8bee2d 1433 * @arg EP_TYPE_ISOC: Isochronous type
ganlikun 0:06036f8bee2d 1434 * @arg EP_TYPE_BULK: Bulk type
ganlikun 0:06036f8bee2d 1435 * @arg EP_TYPE_INTR: Interrupt type
ganlikun 0:06036f8bee2d 1436 * @param mps : Max Packet Size
ganlikun 0:06036f8bee2d 1437 * This parameter can be a value from 0 to32K
ganlikun 0:06036f8bee2d 1438 * @retval HAL state
ganlikun 0:06036f8bee2d 1439 */
ganlikun 0:06036f8bee2d 1440 HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx,
ganlikun 0:06036f8bee2d 1441 uint8_t ch_num,
ganlikun 0:06036f8bee2d 1442 uint8_t epnum,
ganlikun 0:06036f8bee2d 1443 uint8_t dev_address,
ganlikun 0:06036f8bee2d 1444 uint8_t speed,
ganlikun 0:06036f8bee2d 1445 uint8_t ep_type,
ganlikun 0:06036f8bee2d 1446 uint16_t mps)
ganlikun 0:06036f8bee2d 1447 {
ganlikun 0:06036f8bee2d 1448
ganlikun 0:06036f8bee2d 1449 /* Clear old interrupt conditions for this host channel. */
ganlikun 0:06036f8bee2d 1450 USBx_HC(ch_num)->HCINT = 0xFFFFFFFFU;
ganlikun 0:06036f8bee2d 1451
ganlikun 0:06036f8bee2d 1452 /* Enable channel interrupts required for this transfer. */
ganlikun 0:06036f8bee2d 1453 switch (ep_type)
ganlikun 0:06036f8bee2d 1454 {
ganlikun 0:06036f8bee2d 1455 case EP_TYPE_CTRL:
ganlikun 0:06036f8bee2d 1456 case EP_TYPE_BULK:
ganlikun 0:06036f8bee2d 1457
ganlikun 0:06036f8bee2d 1458 USBx_HC(ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM |\
ganlikun 0:06036f8bee2d 1459 USB_OTG_HCINTMSK_STALLM |\
ganlikun 0:06036f8bee2d 1460 USB_OTG_HCINTMSK_TXERRM |\
ganlikun 0:06036f8bee2d 1461 USB_OTG_HCINTMSK_DTERRM |\
ganlikun 0:06036f8bee2d 1462 USB_OTG_HCINTMSK_AHBERR |\
ganlikun 0:06036f8bee2d 1463 USB_OTG_HCINTMSK_NAKM ;
ganlikun 0:06036f8bee2d 1464
ganlikun 0:06036f8bee2d 1465 if (epnum & 0x80U)
ganlikun 0:06036f8bee2d 1466 {
ganlikun 0:06036f8bee2d 1467 USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;
ganlikun 0:06036f8bee2d 1468 }
ganlikun 0:06036f8bee2d 1469 else
ganlikun 0:06036f8bee2d 1470 {
ganlikun 0:06036f8bee2d 1471 if(USBx != USB_OTG_FS)
ganlikun 0:06036f8bee2d 1472 {
ganlikun 0:06036f8bee2d 1473 USBx_HC(ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_NYET | USB_OTG_HCINTMSK_ACKM);
ganlikun 0:06036f8bee2d 1474 }
ganlikun 0:06036f8bee2d 1475 }
ganlikun 0:06036f8bee2d 1476 break;
ganlikun 0:06036f8bee2d 1477
ganlikun 0:06036f8bee2d 1478 case EP_TYPE_INTR:
ganlikun 0:06036f8bee2d 1479
ganlikun 0:06036f8bee2d 1480 USBx_HC(ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM |\
ganlikun 0:06036f8bee2d 1481 USB_OTG_HCINTMSK_STALLM |\
ganlikun 0:06036f8bee2d 1482 USB_OTG_HCINTMSK_TXERRM |\
ganlikun 0:06036f8bee2d 1483 USB_OTG_HCINTMSK_DTERRM |\
ganlikun 0:06036f8bee2d 1484 USB_OTG_HCINTMSK_NAKM |\
ganlikun 0:06036f8bee2d 1485 USB_OTG_HCINTMSK_AHBERR |\
ganlikun 0:06036f8bee2d 1486 USB_OTG_HCINTMSK_FRMORM ;
ganlikun 0:06036f8bee2d 1487
ganlikun 0:06036f8bee2d 1488 if (epnum & 0x80U)
ganlikun 0:06036f8bee2d 1489 {
ganlikun 0:06036f8bee2d 1490 USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;
ganlikun 0:06036f8bee2d 1491 }
ganlikun 0:06036f8bee2d 1492
ganlikun 0:06036f8bee2d 1493 break;
ganlikun 0:06036f8bee2d 1494 case EP_TYPE_ISOC:
ganlikun 0:06036f8bee2d 1495
ganlikun 0:06036f8bee2d 1496 USBx_HC(ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM |\
ganlikun 0:06036f8bee2d 1497 USB_OTG_HCINTMSK_ACKM |\
ganlikun 0:06036f8bee2d 1498 USB_OTG_HCINTMSK_AHBERR |\
ganlikun 0:06036f8bee2d 1499 USB_OTG_HCINTMSK_FRMORM ;
ganlikun 0:06036f8bee2d 1500
ganlikun 0:06036f8bee2d 1501 if (epnum & 0x80U)
ganlikun 0:06036f8bee2d 1502 {
ganlikun 0:06036f8bee2d 1503 USBx_HC(ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_TXERRM | USB_OTG_HCINTMSK_BBERRM);
ganlikun 0:06036f8bee2d 1504 }
ganlikun 0:06036f8bee2d 1505 break;
ganlikun 0:06036f8bee2d 1506 }
ganlikun 0:06036f8bee2d 1507
ganlikun 0:06036f8bee2d 1508 /* Enable the top level host channel interrupt. */
ganlikun 0:06036f8bee2d 1509 USBx_HOST->HAINTMSK |= (1 << ch_num);
ganlikun 0:06036f8bee2d 1510
ganlikun 0:06036f8bee2d 1511 /* Make sure host channel interrupts are enabled. */
ganlikun 0:06036f8bee2d 1512 USBx->GINTMSK |= USB_OTG_GINTMSK_HCIM;
ganlikun 0:06036f8bee2d 1513
ganlikun 0:06036f8bee2d 1514 /* Program the HCCHAR register */
ganlikun 0:06036f8bee2d 1515 USBx_HC(ch_num)->HCCHAR = (((dev_address << 22U) & USB_OTG_HCCHAR_DAD) |\
ganlikun 0:06036f8bee2d 1516 (((epnum & 0x7FU)<< 11U) & USB_OTG_HCCHAR_EPNUM)|\
ganlikun 0:06036f8bee2d 1517 ((((epnum & 0x80U) == 0x80U)<< 15U) & USB_OTG_HCCHAR_EPDIR)|\
ganlikun 0:06036f8bee2d 1518 (((speed == USB_OTG_SPEED_LOW)<< 17U) & USB_OTG_HCCHAR_LSDEV)|\
ganlikun 0:06036f8bee2d 1519 ((ep_type << 18U) & USB_OTG_HCCHAR_EPTYP)|\
ganlikun 0:06036f8bee2d 1520 (mps & USB_OTG_HCCHAR_MPSIZ));
ganlikun 0:06036f8bee2d 1521
ganlikun 0:06036f8bee2d 1522 if (ep_type == EP_TYPE_INTR)
ganlikun 0:06036f8bee2d 1523 {
ganlikun 0:06036f8bee2d 1524 USBx_HC(ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM ;
ganlikun 0:06036f8bee2d 1525 }
ganlikun 0:06036f8bee2d 1526
ganlikun 0:06036f8bee2d 1527 return HAL_OK;
ganlikun 0:06036f8bee2d 1528 }
ganlikun 0:06036f8bee2d 1529
ganlikun 0:06036f8bee2d 1530 /**
ganlikun 0:06036f8bee2d 1531 * @brief Start a transfer over a host channel
ganlikun 0:06036f8bee2d 1532 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1533 * @param hc : pointer to host channel structure
ganlikun 0:06036f8bee2d 1534 * @param dma: USB dma enabled or disabled
ganlikun 0:06036f8bee2d 1535 * This parameter can be one of these values:
ganlikun 0:06036f8bee2d 1536 * 0 : DMA feature not used
ganlikun 0:06036f8bee2d 1537 * 1 : DMA feature used
ganlikun 0:06036f8bee2d 1538 * @retval HAL state
ganlikun 0:06036f8bee2d 1539 */
ganlikun 0:06036f8bee2d 1540 #if defined (__CC_ARM) /*!< ARM Compiler */
ganlikun 0:06036f8bee2d 1541 #pragma O0
ganlikun 0:06036f8bee2d 1542 #elif defined (__GNUC__) /*!< GNU Compiler */
ganlikun 0:06036f8bee2d 1543 #pragma GCC optimize ("O0")
ganlikun 0:06036f8bee2d 1544 #endif /* __CC_ARM */
ganlikun 0:06036f8bee2d 1545 HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma)
ganlikun 0:06036f8bee2d 1546 {
ganlikun 0:06036f8bee2d 1547 uint8_t is_oddframe = 0;
ganlikun 0:06036f8bee2d 1548 uint16_t len_words = 0;
ganlikun 0:06036f8bee2d 1549 uint16_t num_packets = 0;
ganlikun 0:06036f8bee2d 1550 uint16_t max_hc_pkt_count = 256;
ganlikun 0:06036f8bee2d 1551 uint32_t tmpreg = 0U;
ganlikun 0:06036f8bee2d 1552
ganlikun 0:06036f8bee2d 1553 if((USBx != USB_OTG_FS) && (hc->speed == USB_OTG_SPEED_HIGH))
ganlikun 0:06036f8bee2d 1554 {
ganlikun 0:06036f8bee2d 1555 if((dma == 0) && (hc->do_ping == 1U))
ganlikun 0:06036f8bee2d 1556 {
ganlikun 0:06036f8bee2d 1557 USB_DoPing(USBx, hc->ch_num);
ganlikun 0:06036f8bee2d 1558 return HAL_OK;
ganlikun 0:06036f8bee2d 1559 }
ganlikun 0:06036f8bee2d 1560 else if(dma == 1)
ganlikun 0:06036f8bee2d 1561 {
ganlikun 0:06036f8bee2d 1562 USBx_HC(hc->ch_num)->HCINTMSK &= ~(USB_OTG_HCINTMSK_NYET | USB_OTG_HCINTMSK_ACKM);
ganlikun 0:06036f8bee2d 1563 hc->do_ping = 0U;
ganlikun 0:06036f8bee2d 1564 }
ganlikun 0:06036f8bee2d 1565 }
ganlikun 0:06036f8bee2d 1566
ganlikun 0:06036f8bee2d 1567 /* Compute the expected number of packets associated to the transfer */
ganlikun 0:06036f8bee2d 1568 if (hc->xfer_len > 0U)
ganlikun 0:06036f8bee2d 1569 {
ganlikun 0:06036f8bee2d 1570 num_packets = (hc->xfer_len + hc->max_packet - 1U) / hc->max_packet;
ganlikun 0:06036f8bee2d 1571
ganlikun 0:06036f8bee2d 1572 if (num_packets > max_hc_pkt_count)
ganlikun 0:06036f8bee2d 1573 {
ganlikun 0:06036f8bee2d 1574 num_packets = max_hc_pkt_count;
ganlikun 0:06036f8bee2d 1575 hc->xfer_len = num_packets * hc->max_packet;
ganlikun 0:06036f8bee2d 1576 }
ganlikun 0:06036f8bee2d 1577 }
ganlikun 0:06036f8bee2d 1578 else
ganlikun 0:06036f8bee2d 1579 {
ganlikun 0:06036f8bee2d 1580 num_packets = 1;
ganlikun 0:06036f8bee2d 1581 }
ganlikun 0:06036f8bee2d 1582 if (hc->ep_is_in)
ganlikun 0:06036f8bee2d 1583 {
ganlikun 0:06036f8bee2d 1584 hc->xfer_len = num_packets * hc->max_packet;
ganlikun 0:06036f8bee2d 1585 }
ganlikun 0:06036f8bee2d 1586
ganlikun 0:06036f8bee2d 1587 /* Initialize the HCTSIZn register */
ganlikun 0:06036f8bee2d 1588 USBx_HC(hc->ch_num)->HCTSIZ = (((hc->xfer_len) & USB_OTG_HCTSIZ_XFRSIZ)) |\
ganlikun 0:06036f8bee2d 1589 ((num_packets << 19U) & USB_OTG_HCTSIZ_PKTCNT) |\
ganlikun 0:06036f8bee2d 1590 (((hc->data_pid) << 29U) & USB_OTG_HCTSIZ_DPID);
ganlikun 0:06036f8bee2d 1591
ganlikun 0:06036f8bee2d 1592 if (dma)
ganlikun 0:06036f8bee2d 1593 {
ganlikun 0:06036f8bee2d 1594 /* xfer_buff MUST be 32-bits aligned */
ganlikun 0:06036f8bee2d 1595 USBx_HC(hc->ch_num)->HCDMA = (uint32_t)hc->xfer_buff;
ganlikun 0:06036f8bee2d 1596 }
ganlikun 0:06036f8bee2d 1597
ganlikun 0:06036f8bee2d 1598 is_oddframe = (USBx_HOST->HFNUM & 0x01) ? 0 : 1;
ganlikun 0:06036f8bee2d 1599 USBx_HC(hc->ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM;
ganlikun 0:06036f8bee2d 1600 USBx_HC(hc->ch_num)->HCCHAR |= (is_oddframe << 29);
ganlikun 0:06036f8bee2d 1601
ganlikun 0:06036f8bee2d 1602 /* Set host channel enable */
ganlikun 0:06036f8bee2d 1603 tmpreg = USBx_HC(hc->ch_num)->HCCHAR;
ganlikun 0:06036f8bee2d 1604 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
ganlikun 0:06036f8bee2d 1605 tmpreg |= USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1606 USBx_HC(hc->ch_num)->HCCHAR = tmpreg;
ganlikun 0:06036f8bee2d 1607
ganlikun 0:06036f8bee2d 1608 if (dma == 0) /* Slave mode */
ganlikun 0:06036f8bee2d 1609 {
ganlikun 0:06036f8bee2d 1610 if((hc->ep_is_in == 0U) && (hc->xfer_len > 0U))
ganlikun 0:06036f8bee2d 1611 {
ganlikun 0:06036f8bee2d 1612 switch(hc->ep_type)
ganlikun 0:06036f8bee2d 1613 {
ganlikun 0:06036f8bee2d 1614 /* Non periodic transfer */
ganlikun 0:06036f8bee2d 1615 case EP_TYPE_CTRL:
ganlikun 0:06036f8bee2d 1616 case EP_TYPE_BULK:
ganlikun 0:06036f8bee2d 1617
ganlikun 0:06036f8bee2d 1618 len_words = (hc->xfer_len + 3) / 4;
ganlikun 0:06036f8bee2d 1619
ganlikun 0:06036f8bee2d 1620 /* check if there is enough space in FIFO space */
ganlikun 0:06036f8bee2d 1621 if(len_words > (USBx->HNPTXSTS & 0xFFFF))
ganlikun 0:06036f8bee2d 1622 {
ganlikun 0:06036f8bee2d 1623 /* need to process data in nptxfempty interrupt */
ganlikun 0:06036f8bee2d 1624 USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM;
ganlikun 0:06036f8bee2d 1625 }
ganlikun 0:06036f8bee2d 1626 break;
ganlikun 0:06036f8bee2d 1627 /* Periodic transfer */
ganlikun 0:06036f8bee2d 1628 case EP_TYPE_INTR:
ganlikun 0:06036f8bee2d 1629 case EP_TYPE_ISOC:
ganlikun 0:06036f8bee2d 1630 len_words = (hc->xfer_len + 3) / 4;
ganlikun 0:06036f8bee2d 1631 /* check if there is enough space in FIFO space */
ganlikun 0:06036f8bee2d 1632 if(len_words > (USBx_HOST->HPTXSTS & 0xFFFF)) /* split the transfer */
ganlikun 0:06036f8bee2d 1633 {
ganlikun 0:06036f8bee2d 1634 /* need to process data in ptxfempty interrupt */
ganlikun 0:06036f8bee2d 1635 USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM;
ganlikun 0:06036f8bee2d 1636 }
ganlikun 0:06036f8bee2d 1637 break;
ganlikun 0:06036f8bee2d 1638
ganlikun 0:06036f8bee2d 1639 default:
ganlikun 0:06036f8bee2d 1640 break;
ganlikun 0:06036f8bee2d 1641 }
ganlikun 0:06036f8bee2d 1642
ganlikun 0:06036f8bee2d 1643 /* Write packet into the Tx FIFO. */
ganlikun 0:06036f8bee2d 1644 USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0);
ganlikun 0:06036f8bee2d 1645 hc->xfer_count = hc->xfer_len;
ganlikun 0:06036f8bee2d 1646 }
ganlikun 0:06036f8bee2d 1647 }
ganlikun 0:06036f8bee2d 1648
ganlikun 0:06036f8bee2d 1649 return HAL_OK;
ganlikun 0:06036f8bee2d 1650 }
ganlikun 0:06036f8bee2d 1651
ganlikun 0:06036f8bee2d 1652 /**
ganlikun 0:06036f8bee2d 1653 * @brief Read all host channel interrupts status
ganlikun 0:06036f8bee2d 1654 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1655 * @retval HAL state
ganlikun 0:06036f8bee2d 1656 */
ganlikun 0:06036f8bee2d 1657 uint32_t USB_HC_ReadInterrupt (USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1658 {
ganlikun 0:06036f8bee2d 1659 return ((USBx_HOST->HAINT) & 0xFFFFU);
ganlikun 0:06036f8bee2d 1660 }
ganlikun 0:06036f8bee2d 1661
ganlikun 0:06036f8bee2d 1662 /**
ganlikun 0:06036f8bee2d 1663 * @brief Halt a host channel
ganlikun 0:06036f8bee2d 1664 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1665 * @param hc_num : Host Channel number
ganlikun 0:06036f8bee2d 1666 * This parameter can be a value from 1 to 15
ganlikun 0:06036f8bee2d 1667 * @retval HAL state
ganlikun 0:06036f8bee2d 1668 */
ganlikun 0:06036f8bee2d 1669 HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx , uint8_t hc_num)
ganlikun 0:06036f8bee2d 1670 {
ganlikun 0:06036f8bee2d 1671 uint32_t count = 0U;
ganlikun 0:06036f8bee2d 1672
ganlikun 0:06036f8bee2d 1673 /* Check for space in the request queue to issue the halt. */
ganlikun 0:06036f8bee2d 1674 if (((((USBx_HC(hc_num)->HCCHAR) & USB_OTG_HCCHAR_EPTYP) >> 18) == HCCHAR_CTRL) || (((((USBx_HC(hc_num)->HCCHAR) &
ganlikun 0:06036f8bee2d 1675 USB_OTG_HCCHAR_EPTYP) >> 18) == HCCHAR_BULK)))
ganlikun 0:06036f8bee2d 1676 {
ganlikun 0:06036f8bee2d 1677 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHDIS;
ganlikun 0:06036f8bee2d 1678
ganlikun 0:06036f8bee2d 1679 if ((USBx->HNPTXSTS & 0xFF0000U) == 0U)
ganlikun 0:06036f8bee2d 1680 {
ganlikun 0:06036f8bee2d 1681 USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1682 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1683 do
ganlikun 0:06036f8bee2d 1684 {
ganlikun 0:06036f8bee2d 1685 if (++count > 1000U)
ganlikun 0:06036f8bee2d 1686 {
ganlikun 0:06036f8bee2d 1687 break;
ganlikun 0:06036f8bee2d 1688 }
ganlikun 0:06036f8bee2d 1689 }
ganlikun 0:06036f8bee2d 1690 while ((USBx_HC(hc_num)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA);
ganlikun 0:06036f8bee2d 1691 }
ganlikun 0:06036f8bee2d 1692 else
ganlikun 0:06036f8bee2d 1693 {
ganlikun 0:06036f8bee2d 1694 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1695 }
ganlikun 0:06036f8bee2d 1696 }
ganlikun 0:06036f8bee2d 1697 else
ganlikun 0:06036f8bee2d 1698 {
ganlikun 0:06036f8bee2d 1699 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHDIS;
ganlikun 0:06036f8bee2d 1700
ganlikun 0:06036f8bee2d 1701 if ((USBx_HOST->HPTXSTS & 0xFFFFU) == 0U)
ganlikun 0:06036f8bee2d 1702 {
ganlikun 0:06036f8bee2d 1703 USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1704 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1705 do
ganlikun 0:06036f8bee2d 1706 {
ganlikun 0:06036f8bee2d 1707 if (++count > 1000U)
ganlikun 0:06036f8bee2d 1708 {
ganlikun 0:06036f8bee2d 1709 break;
ganlikun 0:06036f8bee2d 1710 }
ganlikun 0:06036f8bee2d 1711 }
ganlikun 0:06036f8bee2d 1712 while ((USBx_HC(hc_num)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA);
ganlikun 0:06036f8bee2d 1713 }
ganlikun 0:06036f8bee2d 1714 else
ganlikun 0:06036f8bee2d 1715 {
ganlikun 0:06036f8bee2d 1716 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1717 }
ganlikun 0:06036f8bee2d 1718 }
ganlikun 0:06036f8bee2d 1719
ganlikun 0:06036f8bee2d 1720 return HAL_OK;
ganlikun 0:06036f8bee2d 1721 }
ganlikun 0:06036f8bee2d 1722
ganlikun 0:06036f8bee2d 1723 /**
ganlikun 0:06036f8bee2d 1724 * @brief Initiate Do Ping protocol
ganlikun 0:06036f8bee2d 1725 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1726 * @param hc_num : Host Channel number
ganlikun 0:06036f8bee2d 1727 * This parameter can be a value from 1 to 15
ganlikun 0:06036f8bee2d 1728 * @retval HAL state
ganlikun 0:06036f8bee2d 1729 */
ganlikun 0:06036f8bee2d 1730 HAL_StatusTypeDef USB_DoPing(USB_OTG_GlobalTypeDef *USBx , uint8_t ch_num)
ganlikun 0:06036f8bee2d 1731 {
ganlikun 0:06036f8bee2d 1732 uint8_t num_packets = 1U;
ganlikun 0:06036f8bee2d 1733 uint32_t tmpreg = 0U;
ganlikun 0:06036f8bee2d 1734
ganlikun 0:06036f8bee2d 1735 USBx_HC(ch_num)->HCTSIZ = ((num_packets << 19U) & USB_OTG_HCTSIZ_PKTCNT) |\
ganlikun 0:06036f8bee2d 1736 USB_OTG_HCTSIZ_DOPING;
ganlikun 0:06036f8bee2d 1737
ganlikun 0:06036f8bee2d 1738 /* Set host channel enable */
ganlikun 0:06036f8bee2d 1739 tmpreg = USBx_HC(ch_num)->HCCHAR;
ganlikun 0:06036f8bee2d 1740 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
ganlikun 0:06036f8bee2d 1741 tmpreg |= USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1742 USBx_HC(ch_num)->HCCHAR = tmpreg;
ganlikun 0:06036f8bee2d 1743
ganlikun 0:06036f8bee2d 1744 return HAL_OK;
ganlikun 0:06036f8bee2d 1745 }
ganlikun 0:06036f8bee2d 1746
ganlikun 0:06036f8bee2d 1747 /**
ganlikun 0:06036f8bee2d 1748 * @brief Stop Host Core
ganlikun 0:06036f8bee2d 1749 * @param USBx : Selected device
ganlikun 0:06036f8bee2d 1750 * @retval HAL state
ganlikun 0:06036f8bee2d 1751 */
ganlikun 0:06036f8bee2d 1752 HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx)
ganlikun 0:06036f8bee2d 1753 {
ganlikun 0:06036f8bee2d 1754 uint8_t i;
ganlikun 0:06036f8bee2d 1755 uint32_t count = 0U;
ganlikun 0:06036f8bee2d 1756 uint32_t value;
ganlikun 0:06036f8bee2d 1757
ganlikun 0:06036f8bee2d 1758 USB_DisableGlobalInt(USBx);
ganlikun 0:06036f8bee2d 1759
ganlikun 0:06036f8bee2d 1760 /* Flush FIFO */
ganlikun 0:06036f8bee2d 1761 USB_FlushTxFifo(USBx, 0x10U);
ganlikun 0:06036f8bee2d 1762 USB_FlushRxFifo(USBx);
ganlikun 0:06036f8bee2d 1763
ganlikun 0:06036f8bee2d 1764 /* Flush out any leftover queued requests. */
ganlikun 0:06036f8bee2d 1765 for (i = 0; i <= 15; i++)
ganlikun 0:06036f8bee2d 1766 {
ganlikun 0:06036f8bee2d 1767
ganlikun 0:06036f8bee2d 1768 value = USBx_HC(i)->HCCHAR ;
ganlikun 0:06036f8bee2d 1769 value |= USB_OTG_HCCHAR_CHDIS;
ganlikun 0:06036f8bee2d 1770 value &= ~USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1771 value &= ~USB_OTG_HCCHAR_EPDIR;
ganlikun 0:06036f8bee2d 1772 USBx_HC(i)->HCCHAR = value;
ganlikun 0:06036f8bee2d 1773 }
ganlikun 0:06036f8bee2d 1774
ganlikun 0:06036f8bee2d 1775 /* Halt all channels to put them into a known state. */
ganlikun 0:06036f8bee2d 1776 for (i = 0; i <= 15; i++)
ganlikun 0:06036f8bee2d 1777 {
ganlikun 0:06036f8bee2d 1778 value = USBx_HC(i)->HCCHAR ;
ganlikun 0:06036f8bee2d 1779
ganlikun 0:06036f8bee2d 1780 value |= USB_OTG_HCCHAR_CHDIS;
ganlikun 0:06036f8bee2d 1781 value |= USB_OTG_HCCHAR_CHENA;
ganlikun 0:06036f8bee2d 1782 value &= ~USB_OTG_HCCHAR_EPDIR;
ganlikun 0:06036f8bee2d 1783
ganlikun 0:06036f8bee2d 1784 USBx_HC(i)->HCCHAR = value;
ganlikun 0:06036f8bee2d 1785 do
ganlikun 0:06036f8bee2d 1786 {
ganlikun 0:06036f8bee2d 1787 if (++count > 1000U)
ganlikun 0:06036f8bee2d 1788 {
ganlikun 0:06036f8bee2d 1789 break;
ganlikun 0:06036f8bee2d 1790 }
ganlikun 0:06036f8bee2d 1791 }
ganlikun 0:06036f8bee2d 1792 while ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA);
ganlikun 0:06036f8bee2d 1793 }
ganlikun 0:06036f8bee2d 1794
ganlikun 0:06036f8bee2d 1795 /* Clear any pending Host interrupts */
ganlikun 0:06036f8bee2d 1796 USBx_HOST->HAINT = 0xFFFFFFFFU;
ganlikun 0:06036f8bee2d 1797 USBx->GINTSTS = 0xFFFFFFFFU;
ganlikun 0:06036f8bee2d 1798 USB_EnableGlobalInt(USBx);
ganlikun 0:06036f8bee2d 1799 return HAL_OK;
ganlikun 0:06036f8bee2d 1800 }
ganlikun 0:06036f8bee2d 1801 /**
ganlikun 0:06036f8bee2d 1802 * @}
ganlikun 0:06036f8bee2d 1803 */
ganlikun 0:06036f8bee2d 1804 #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx ||
ganlikun 0:06036f8bee2d 1805 STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Rx ||
ganlikun 0:06036f8bee2d 1806 STM32F412Vx || STM32F412Cx || STM32F413xx || STM32F423xx */
ganlikun 0:06036f8bee2d 1807 #endif /* defined(HAL_PCD_MODULE_ENABLED) || defined(HAL_HCD_MODULE_ENABLED) */
ganlikun 0:06036f8bee2d 1808
ganlikun 0:06036f8bee2d 1809 /**
ganlikun 0:06036f8bee2d 1810 * @}
ganlikun 0:06036f8bee2d 1811 */
ganlikun 0:06036f8bee2d 1812
ganlikun 0:06036f8bee2d 1813 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
ganlikun 0:06036f8bee2d 1814