mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
shaoziyang
Date:
Sat Sep 13 14:25:46 2014 +0000
Revision:
323:9e901b0a5aa1
Parent:
235:685d5f11838f
test with CLOCK_SETUP = 0

Who changed what in which revision?

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