Lancaster University's (short term!) clone of mbed-src for micro:bit. This is a copy of the github branch https://github.com/lancaster-university/mbed-classic

Fork of mbed-src by mbed official

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****/