mbed official / mbed-src

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Committer:
mbed_official
Date:
Thu Jul 02 16:30:08 2015 +0100
Revision:
581:39197bcd20f2
Parent:
532:fe11edbda85c
Child:
613:bc40b8d2aec4
Synchronized with git revision ae2d3cdffe70184eb8736d94f76c45c93f4b7724

Full URL: https://github.com/mbedmicro/mbed/commit/ae2d3cdffe70184eb8736d94f76c45c93f4b7724/

Make it possible to build the core mbed library with yotta

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