mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Fri Aug 14 13:15:17 2015 +0100
Revision:
610:813dcc80987e
Parent:
573:ad23fe03a082
Synchronized with git revision 6d84db41c6833e0b9b024741eb0616a5f62d5599

Full URL: https://github.com/mbedmicro/mbed/commit/6d84db41c6833e0b9b024741eb0616a5f62d5599/

DISCO_F746NG - Improvements

Who changed what in which revision?

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