added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

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