mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

Who changed what in which revision?

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