mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

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