mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
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****/