mbed library sources

Dependents:   Marvino mbot

Fork of mbed-src by mbed official

Committer:
jaerts
Date:
Tue Dec 22 13:22:16 2015 +0000
Revision:
637:ed69428d4850
Parent:
610:813dcc80987e
Add very shady LPC1768 CAN Filter implementation

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