SilentSensors / mbed-dev

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Oct 28 11:17:30 2016 +0100
Revision:
149:156823d33999
Parent:
targets/cmsis/TARGET_STM/TARGET_STM32F1/stm32f1xx_ll_usb.c@144:ef7eb2e8f9f7
Child:
154:37f96f9d4de2
This updates the lib to the mbed lib v128

NOTE: This release includes a restructuring of the file and directory locations and thus some
include paths in your code may need updating accordingly.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file stm32f1xx_ll_usb.c
<> 144:ef7eb2e8f9f7 4 * @author MCD Application Team
<> 144:ef7eb2e8f9f7 5 * @version V1.0.4
<> 144:ef7eb2e8f9f7 6 * @date 29-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 "stm32f1xx_hal.h"
<> 144:ef7eb2e8f9f7 60
<> 144:ef7eb2e8f9f7 61 /** @addtogroup STM32F1xx_HAL_Driver
<> 144:ef7eb2e8f9f7 62 * @{
<> 144:ef7eb2e8f9f7 63 */
<> 144:ef7eb2e8f9f7 64
<> 144:ef7eb2e8f9f7 65 /** @defgroup USB_LL USB Low Layer
<> 144:ef7eb2e8f9f7 66 * @brief Low layer module for USB_FS and USB_OTG_FS drivers
<> 144:ef7eb2e8f9f7 67 * @{
<> 144:ef7eb2e8f9f7 68 */
<> 144:ef7eb2e8f9f7 69
<> 144:ef7eb2e8f9f7 70 #if defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED)
<> 144:ef7eb2e8f9f7 71
<> 144:ef7eb2e8f9f7 72 #if defined(STM32F102x6) || defined(STM32F102xB) || \
<> 144:ef7eb2e8f9f7 73 defined(STM32F103x6) || defined(STM32F103xB) || \
<> 144:ef7eb2e8f9f7 74 defined(STM32F103xE) || defined(STM32F103xG) || \
<> 144:ef7eb2e8f9f7 75 defined(STM32F105xC) || defined(STM32F107xC)
<> 144:ef7eb2e8f9f7 76
<> 144:ef7eb2e8f9f7 77 /* Private types -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 78 /* Private variables ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 79 /* Private constants ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 80 /* Private macros ------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 81 /* Private functions ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 82 #if defined (USB_OTG_FS)
<> 144:ef7eb2e8f9f7 83 /** @defgroup USB_LL_Private_Functions USB Low Layer Private Functions
<> 144:ef7eb2e8f9f7 84 * @{
<> 144:ef7eb2e8f9f7 85 */
<> 144:ef7eb2e8f9f7 86 static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx);
<> 144:ef7eb2e8f9f7 87 /**
<> 144:ef7eb2e8f9f7 88 * @}
<> 144:ef7eb2e8f9f7 89 */
<> 144:ef7eb2e8f9f7 90 #endif /* USB_OTG_FS */
<> 144:ef7eb2e8f9f7 91
<> 144:ef7eb2e8f9f7 92 /* Exported functions --------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 93 /** @defgroup USB_LL_Exported_Functions USB Low Layer Exported Functions
<> 144:ef7eb2e8f9f7 94 * @{
<> 144:ef7eb2e8f9f7 95 */
<> 144:ef7eb2e8f9f7 96
<> 144:ef7eb2e8f9f7 97 /** @defgroup USB_LL_Exported_Functions_Group1 Peripheral Control functions
<> 144:ef7eb2e8f9f7 98 * @brief management functions
<> 144:ef7eb2e8f9f7 99 *
<> 144:ef7eb2e8f9f7 100 @verbatim
<> 144:ef7eb2e8f9f7 101 ===============================================================================
<> 144:ef7eb2e8f9f7 102 ##### Peripheral Control functions #####
<> 144:ef7eb2e8f9f7 103 ===============================================================================
<> 144:ef7eb2e8f9f7 104 [..]
<> 144:ef7eb2e8f9f7 105 This subsection provides a set of functions allowing to control the PCD data
<> 144:ef7eb2e8f9f7 106 transfers.
<> 144:ef7eb2e8f9f7 107
<> 144:ef7eb2e8f9f7 108 @endverbatim
<> 144:ef7eb2e8f9f7 109 * @{
<> 144:ef7eb2e8f9f7 110 */
<> 144:ef7eb2e8f9f7 111
<> 144:ef7eb2e8f9f7 112 /*==============================================================================
<> 144:ef7eb2e8f9f7 113 USB OTG FS peripheral available on STM32F105xx and STM32F107xx devices
<> 144:ef7eb2e8f9f7 114 ==============================================================================*/
<> 144:ef7eb2e8f9f7 115 #if defined (USB_OTG_FS)
<> 144:ef7eb2e8f9f7 116
<> 144:ef7eb2e8f9f7 117 /**
<> 144:ef7eb2e8f9f7 118 * @brief Initializes the USB Core
<> 144:ef7eb2e8f9f7 119 * @param USBx: USB Instance
<> 144:ef7eb2e8f9f7 120 * @param cfg : pointer to a USB_OTG_CfgTypeDef structure that contains
<> 144:ef7eb2e8f9f7 121 * the configuration information for the specified USBx peripheral.
<> 144:ef7eb2e8f9f7 122 * @retval HAL status
<> 144:ef7eb2e8f9f7 123 */
<> 144:ef7eb2e8f9f7 124 HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
<> 144:ef7eb2e8f9f7 125 {
<> 144:ef7eb2e8f9f7 126 /* Select FS Embedded PHY */
<> 144:ef7eb2e8f9f7 127 USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL;
<> 144:ef7eb2e8f9f7 128
<> 144:ef7eb2e8f9f7 129 /* Reset after a PHY select and set Host mode */
<> 144:ef7eb2e8f9f7 130 USB_CoreReset(USBx);
<> 144:ef7eb2e8f9f7 131
<> 144:ef7eb2e8f9f7 132 /* Deactivate the power down*/
<> 144:ef7eb2e8f9f7 133 USBx->GCCFG = USB_OTG_GCCFG_PWRDWN;
<> 144:ef7eb2e8f9f7 134
<> 144:ef7eb2e8f9f7 135 return HAL_OK;
<> 144:ef7eb2e8f9f7 136 }
<> 144:ef7eb2e8f9f7 137
<> 144:ef7eb2e8f9f7 138 /**
<> 144:ef7eb2e8f9f7 139 * @brief USB_EnableGlobalInt
<> 144:ef7eb2e8f9f7 140 * Enables the controller's Global Int in the AHB Config reg
<> 144:ef7eb2e8f9f7 141 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 142 * @retval HAL status
<> 144:ef7eb2e8f9f7 143 */
<> 144:ef7eb2e8f9f7 144 HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 145 {
<> 144:ef7eb2e8f9f7 146 USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT;
<> 144:ef7eb2e8f9f7 147 return HAL_OK;
<> 144:ef7eb2e8f9f7 148 }
<> 144:ef7eb2e8f9f7 149
<> 144:ef7eb2e8f9f7 150 /**
<> 144:ef7eb2e8f9f7 151 * @brief USB_DisableGlobalInt
<> 144:ef7eb2e8f9f7 152 * Disable the controller's Global Int in the AHB Config reg
<> 144:ef7eb2e8f9f7 153 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 154 * @retval HAL status
<> 144:ef7eb2e8f9f7 155 */
<> 144:ef7eb2e8f9f7 156 HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 157 {
<> 144:ef7eb2e8f9f7 158 USBx->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT;
<> 144:ef7eb2e8f9f7 159 return HAL_OK;
<> 144:ef7eb2e8f9f7 160 }
<> 144:ef7eb2e8f9f7 161
<> 144:ef7eb2e8f9f7 162 /**
<> 144:ef7eb2e8f9f7 163 * @brief USB_SetCurrentMode : Set functional mode
<> 144:ef7eb2e8f9f7 164 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 165 * @param mode : current core mode
<> 144:ef7eb2e8f9f7 166 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 167 * @arg USB_DEVICE_MODE: Peripheral mode mode
<> 144:ef7eb2e8f9f7 168 * @arg USB_HOST_MODE: Host mode
<> 144:ef7eb2e8f9f7 169 * @arg USB_DRD_MODE: Dual Role Device mode
<> 144:ef7eb2e8f9f7 170 * @retval HAL status
<> 144:ef7eb2e8f9f7 171 */
<> 144:ef7eb2e8f9f7 172 HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx , USB_ModeTypeDef mode)
<> 144:ef7eb2e8f9f7 173 {
<> 144:ef7eb2e8f9f7 174 USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD);
<> 144:ef7eb2e8f9f7 175
<> 144:ef7eb2e8f9f7 176 if ( mode == USB_HOST_MODE)
<> 144:ef7eb2e8f9f7 177 {
<> 144:ef7eb2e8f9f7 178 USBx->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD;
<> 144:ef7eb2e8f9f7 179 }
<> 144:ef7eb2e8f9f7 180 else if ( mode == USB_DEVICE_MODE)
<> 144:ef7eb2e8f9f7 181 {
<> 144:ef7eb2e8f9f7 182 USBx->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD;
<> 144:ef7eb2e8f9f7 183 }
<> 144:ef7eb2e8f9f7 184 HAL_Delay(50);
<> 144:ef7eb2e8f9f7 185
<> 144:ef7eb2e8f9f7 186 return HAL_OK;
<> 144:ef7eb2e8f9f7 187 }
<> 144:ef7eb2e8f9f7 188
<> 144:ef7eb2e8f9f7 189 /**
<> 144:ef7eb2e8f9f7 190 * @brief USB_DevInit : Initializes the USB_OTG controller registers
<> 144:ef7eb2e8f9f7 191 * for device mode
<> 144:ef7eb2e8f9f7 192 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 193 * @param cfg : pointer to a USB_OTG_CfgTypeDef structure that contains
<> 144:ef7eb2e8f9f7 194 * the configuration information for the specified USBx peripheral.
<> 144:ef7eb2e8f9f7 195 * @retval HAL status
<> 144:ef7eb2e8f9f7 196 */
<> 144:ef7eb2e8f9f7 197 HAL_StatusTypeDef USB_DevInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
<> 144:ef7eb2e8f9f7 198 {
<> 144:ef7eb2e8f9f7 199 uint32_t index = 0;
<> 144:ef7eb2e8f9f7 200
<> 144:ef7eb2e8f9f7 201 for (index = 0; index < 15 ; index++)
<> 144:ef7eb2e8f9f7 202 {
<> 144:ef7eb2e8f9f7 203 USBx->DIEPTXF[index] = 0;
<> 144:ef7eb2e8f9f7 204 }
<> 144:ef7eb2e8f9f7 205
<> 144:ef7eb2e8f9f7 206 /*Activate VBUS Sensing B */
<> 144:ef7eb2e8f9f7 207 USBx->GCCFG |= USB_OTG_GCCFG_VBUSBSEN;
<> 144:ef7eb2e8f9f7 208
<> 144:ef7eb2e8f9f7 209 /* Restart the Phy Clock */
<> 144:ef7eb2e8f9f7 210 USBx_PCGCCTL = 0;
<> 144:ef7eb2e8f9f7 211
<> 144:ef7eb2e8f9f7 212 /* Device mode configuration */
<> 144:ef7eb2e8f9f7 213 USBx_DEVICE->DCFG |= DCFG_FRAME_INTERVAL_80;
<> 144:ef7eb2e8f9f7 214
<> 144:ef7eb2e8f9f7 215 /* Set Full speed phy */
<> 144:ef7eb2e8f9f7 216 USB_SetDevSpeed (USBx , USB_OTG_SPEED_FULL);
<> 144:ef7eb2e8f9f7 217
<> 144:ef7eb2e8f9f7 218 /* Flush the FIFOs */
<> 144:ef7eb2e8f9f7 219 USB_FlushTxFifo(USBx , 0x10); /* all Tx FIFOs */
<> 144:ef7eb2e8f9f7 220 USB_FlushRxFifo(USBx);
<> 144:ef7eb2e8f9f7 221
<> 144:ef7eb2e8f9f7 222 /* Clear all pending Device Interrupts */
<> 144:ef7eb2e8f9f7 223 USBx_DEVICE->DIEPMSK = 0;
<> 144:ef7eb2e8f9f7 224 USBx_DEVICE->DOEPMSK = 0;
<> 144:ef7eb2e8f9f7 225 USBx_DEVICE->DAINT = 0xFFFFFFFF;
<> 144:ef7eb2e8f9f7 226 USBx_DEVICE->DAINTMSK = 0;
<> 144:ef7eb2e8f9f7 227
<> 144:ef7eb2e8f9f7 228 for (index = 0; index < cfg.dev_endpoints; index++)
<> 144:ef7eb2e8f9f7 229 {
<> 144:ef7eb2e8f9f7 230 if ((USBx_INEP(index)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA)
<> 144:ef7eb2e8f9f7 231 {
<> 144:ef7eb2e8f9f7 232 USBx_INEP(index)->DIEPCTL = (USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK);
<> 144:ef7eb2e8f9f7 233 }
<> 144:ef7eb2e8f9f7 234 else
<> 144:ef7eb2e8f9f7 235 {
<> 144:ef7eb2e8f9f7 236 USBx_INEP(index)->DIEPCTL = 0;
<> 144:ef7eb2e8f9f7 237 }
<> 144:ef7eb2e8f9f7 238
<> 144:ef7eb2e8f9f7 239 USBx_INEP(index)->DIEPTSIZ = 0;
<> 144:ef7eb2e8f9f7 240 USBx_INEP(index)->DIEPINT = 0xFF;
<> 144:ef7eb2e8f9f7 241 }
<> 144:ef7eb2e8f9f7 242
<> 144:ef7eb2e8f9f7 243 for (index = 0; index < cfg.dev_endpoints; index++)
<> 144:ef7eb2e8f9f7 244 {
<> 144:ef7eb2e8f9f7 245 if ((USBx_OUTEP(index)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA)
<> 144:ef7eb2e8f9f7 246 {
<> 144:ef7eb2e8f9f7 247 USBx_OUTEP(index)->DOEPCTL = (USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK);
<> 144:ef7eb2e8f9f7 248 }
<> 144:ef7eb2e8f9f7 249 else
<> 144:ef7eb2e8f9f7 250 {
<> 144:ef7eb2e8f9f7 251 USBx_OUTEP(index)->DOEPCTL = 0;
<> 144:ef7eb2e8f9f7 252 }
<> 144:ef7eb2e8f9f7 253
<> 144:ef7eb2e8f9f7 254 USBx_OUTEP(index)->DOEPTSIZ = 0;
<> 144:ef7eb2e8f9f7 255 USBx_OUTEP(index)->DOEPINT = 0xFF;
<> 144:ef7eb2e8f9f7 256 }
<> 144:ef7eb2e8f9f7 257
<> 144:ef7eb2e8f9f7 258 USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM);
<> 144:ef7eb2e8f9f7 259
<> 144:ef7eb2e8f9f7 260 /* Disable all interrupts. */
<> 144:ef7eb2e8f9f7 261 USBx->GINTMSK = 0;
<> 144:ef7eb2e8f9f7 262
<> 144:ef7eb2e8f9f7 263 /* Clear any pending interrupts */
<> 144:ef7eb2e8f9f7 264 USBx->GINTSTS = 0xBFFFFFFF;
<> 144:ef7eb2e8f9f7 265
<> 144:ef7eb2e8f9f7 266 /* Enable the common interrupts */
<> 144:ef7eb2e8f9f7 267 USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM;
<> 144:ef7eb2e8f9f7 268
<> 144:ef7eb2e8f9f7 269 /* Enable interrupts matching to the Device mode ONLY */
<> 144:ef7eb2e8f9f7 270 USBx->GINTMSK |= (USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_USBRST |\
<> 144:ef7eb2e8f9f7 271 USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_IEPINT |\
<> 144:ef7eb2e8f9f7 272 USB_OTG_GINTMSK_OEPINT | USB_OTG_GINTMSK_IISOIXFRM|\
<> 144:ef7eb2e8f9f7 273 USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM);
<> 144:ef7eb2e8f9f7 274
<> 144:ef7eb2e8f9f7 275 if(cfg.Sof_enable)
<> 144:ef7eb2e8f9f7 276 {
<> 144:ef7eb2e8f9f7 277 USBx->GINTMSK |= USB_OTG_GINTMSK_SOFM;
<> 144:ef7eb2e8f9f7 278 }
<> 144:ef7eb2e8f9f7 279
<> 144:ef7eb2e8f9f7 280 if (cfg.vbus_sensing_enable == ENABLE)
<> 144:ef7eb2e8f9f7 281 {
<> 144:ef7eb2e8f9f7 282 USBx->GINTMSK |= (USB_OTG_GINTMSK_SRQIM | USB_OTG_GINTMSK_OTGINT);
<> 144:ef7eb2e8f9f7 283 }
<> 144:ef7eb2e8f9f7 284
<> 144:ef7eb2e8f9f7 285 return HAL_OK;
<> 144:ef7eb2e8f9f7 286 }
<> 144:ef7eb2e8f9f7 287
<> 144:ef7eb2e8f9f7 288 /**
<> 144:ef7eb2e8f9f7 289 * @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO
<> 144:ef7eb2e8f9f7 290 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 291 * @param num : FIFO number
<> 144:ef7eb2e8f9f7 292 * This parameter can be a value from 1 to 15
<> 144:ef7eb2e8f9f7 293 15 means Flush all Tx FIFOs
<> 144:ef7eb2e8f9f7 294 * @retval HAL status
<> 144:ef7eb2e8f9f7 295 */
<> 144:ef7eb2e8f9f7 296 HAL_StatusTypeDef USB_FlushTxFifo (USB_OTG_GlobalTypeDef *USBx, uint32_t num )
<> 144:ef7eb2e8f9f7 297 {
<> 144:ef7eb2e8f9f7 298 uint32_t count = 0;
<> 144:ef7eb2e8f9f7 299
<> 144:ef7eb2e8f9f7 300 USBx->GRSTCTL = ( USB_OTG_GRSTCTL_TXFFLSH |(uint32_t)( num << 6));
<> 144:ef7eb2e8f9f7 301
<> 144:ef7eb2e8f9f7 302 do
<> 144:ef7eb2e8f9f7 303 {
<> 144:ef7eb2e8f9f7 304 if (++count > 200000)
<> 144:ef7eb2e8f9f7 305 {
<> 144:ef7eb2e8f9f7 306 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 307 }
<> 144:ef7eb2e8f9f7 308 }
<> 144:ef7eb2e8f9f7 309 while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH);
<> 144:ef7eb2e8f9f7 310
<> 144:ef7eb2e8f9f7 311 return HAL_OK;
<> 144:ef7eb2e8f9f7 312 }
<> 144:ef7eb2e8f9f7 313
<> 144:ef7eb2e8f9f7 314 /**
<> 144:ef7eb2e8f9f7 315 * @brief USB_FlushRxFifo : Flush Rx FIFO
<> 144:ef7eb2e8f9f7 316 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 317 * @retval HAL status
<> 144:ef7eb2e8f9f7 318 */
<> 144:ef7eb2e8f9f7 319 HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 320 {
<> 144:ef7eb2e8f9f7 321 uint32_t count = 0;
<> 144:ef7eb2e8f9f7 322
<> 144:ef7eb2e8f9f7 323 USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH;
<> 144:ef7eb2e8f9f7 324
<> 144:ef7eb2e8f9f7 325 do
<> 144:ef7eb2e8f9f7 326 {
<> 144:ef7eb2e8f9f7 327 if (++count > 200000)
<> 144:ef7eb2e8f9f7 328 {
<> 144:ef7eb2e8f9f7 329 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 330 }
<> 144:ef7eb2e8f9f7 331 }
<> 144:ef7eb2e8f9f7 332 while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH);
<> 144:ef7eb2e8f9f7 333
<> 144:ef7eb2e8f9f7 334 return HAL_OK;
<> 144:ef7eb2e8f9f7 335 }
<> 144:ef7eb2e8f9f7 336
<> 144:ef7eb2e8f9f7 337 /**
<> 144:ef7eb2e8f9f7 338 * @brief USB_SetDevSpeed :Initializes the DevSpd field of DCFG register
<> 144:ef7eb2e8f9f7 339 * depending the PHY type and the enumeration speed of the device.
<> 144:ef7eb2e8f9f7 340 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 341 * @param speed : device speed
<> 144:ef7eb2e8f9f7 342 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 343 * @arg USB_OTG_SPEED_FULL: Full speed mode
<> 144:ef7eb2e8f9f7 344 * @arg USB_OTG_SPEED_LOW: Low speed mode
<> 144:ef7eb2e8f9f7 345 * @retval Hal status
<> 144:ef7eb2e8f9f7 346 */
<> 144:ef7eb2e8f9f7 347 HAL_StatusTypeDef USB_SetDevSpeed(USB_OTG_GlobalTypeDef *USBx , uint8_t speed)
<> 144:ef7eb2e8f9f7 348 {
<> 144:ef7eb2e8f9f7 349 USBx_DEVICE->DCFG |= speed;
<> 144:ef7eb2e8f9f7 350 return HAL_OK;
<> 144:ef7eb2e8f9f7 351 }
<> 144:ef7eb2e8f9f7 352
<> 144:ef7eb2e8f9f7 353 /**
<> 144:ef7eb2e8f9f7 354 * @brief USB_GetDevSpeed :Return the Dev Speed
<> 144:ef7eb2e8f9f7 355 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 356 * @retval speed : device speed
<> 144:ef7eb2e8f9f7 357 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 358 * @arg USB_OTG_SPEED_FULL: Full speed mode
<> 144:ef7eb2e8f9f7 359 * @arg USB_OTG_SPEED_LOW: Low speed mode
<> 144:ef7eb2e8f9f7 360 */
<> 144:ef7eb2e8f9f7 361 uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 362 {
<> 144:ef7eb2e8f9f7 363 uint8_t speed = 0;
<> 144:ef7eb2e8f9f7 364
<> 144:ef7eb2e8f9f7 365 if (((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ)||
<> 144:ef7eb2e8f9f7 366 ((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_FS_PHY_48MHZ))
<> 144:ef7eb2e8f9f7 367 {
<> 144:ef7eb2e8f9f7 368 speed = USB_OTG_SPEED_FULL;
<> 144:ef7eb2e8f9f7 369 }
<> 144:ef7eb2e8f9f7 370 else if((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ)
<> 144:ef7eb2e8f9f7 371 {
<> 144:ef7eb2e8f9f7 372 speed = USB_OTG_SPEED_LOW;
<> 144:ef7eb2e8f9f7 373 }
<> 144:ef7eb2e8f9f7 374
<> 144:ef7eb2e8f9f7 375 return speed;
<> 144:ef7eb2e8f9f7 376 }
<> 144:ef7eb2e8f9f7 377
<> 144:ef7eb2e8f9f7 378 /**
<> 144:ef7eb2e8f9f7 379 * @brief Activate and configure an endpoint
<> 144:ef7eb2e8f9f7 380 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 381 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 382 * @retval HAL status
<> 144:ef7eb2e8f9f7 383 */
<> 144:ef7eb2e8f9f7 384 HAL_StatusTypeDef USB_ActivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 385 {
<> 144:ef7eb2e8f9f7 386 if (ep->is_in)
<> 144:ef7eb2e8f9f7 387 {
<> 144:ef7eb2e8f9f7 388 /* Assign a Tx FIFO */
<> 144:ef7eb2e8f9f7 389 ep->tx_fifo_num = ep->num;
<> 144:ef7eb2e8f9f7 390 }
<> 144:ef7eb2e8f9f7 391 /* Set initial data PID. */
<> 144:ef7eb2e8f9f7 392 if (ep->type == EP_TYPE_BULK )
<> 144:ef7eb2e8f9f7 393 {
<> 144:ef7eb2e8f9f7 394 ep->data_pid_start = 0;
<> 144:ef7eb2e8f9f7 395 }
<> 144:ef7eb2e8f9f7 396
<> 144:ef7eb2e8f9f7 397 if (ep->is_in == 1)
<> 144:ef7eb2e8f9f7 398 {
<> 144:ef7eb2e8f9f7 399 USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & ((1 << (ep->num)));
<> 144:ef7eb2e8f9f7 400
<> 144:ef7eb2e8f9f7 401 if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0)
<> 144:ef7eb2e8f9f7 402 {
<> 144:ef7eb2e8f9f7 403 USBx_INEP(ep->num)->DIEPCTL |= ((ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ ) | (ep->type << 18 ) |\
<> 144:ef7eb2e8f9f7 404 ((ep->num) << 22 ) | (USB_OTG_DIEPCTL_SD0PID_SEVNFRM) | (USB_OTG_DIEPCTL_USBAEP));
<> 144:ef7eb2e8f9f7 405 }
<> 144:ef7eb2e8f9f7 406 }
<> 144:ef7eb2e8f9f7 407 else
<> 144:ef7eb2e8f9f7 408 {
<> 144:ef7eb2e8f9f7 409 USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & ((1 << (ep->num)) << 16);
<> 144:ef7eb2e8f9f7 410
<> 144:ef7eb2e8f9f7 411 if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0)
<> 144:ef7eb2e8f9f7 412 {
<> 144:ef7eb2e8f9f7 413 USBx_OUTEP(ep->num)->DOEPCTL |= ((ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ ) | (ep->type << 18 ) |\
<> 144:ef7eb2e8f9f7 414 (USB_OTG_DIEPCTL_SD0PID_SEVNFRM)| (USB_OTG_DOEPCTL_USBAEP));
<> 144:ef7eb2e8f9f7 415 }
<> 144:ef7eb2e8f9f7 416 }
<> 144:ef7eb2e8f9f7 417
<> 144:ef7eb2e8f9f7 418 return HAL_OK;
<> 144:ef7eb2e8f9f7 419 }
<> 144:ef7eb2e8f9f7 420
<> 144:ef7eb2e8f9f7 421 /**
<> 144:ef7eb2e8f9f7 422 * @brief De-activate and de-initialize an endpoint
<> 144:ef7eb2e8f9f7 423 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 424 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 425 * @retval HAL status
<> 144:ef7eb2e8f9f7 426 */
<> 144:ef7eb2e8f9f7 427 HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 428 {
<> 144:ef7eb2e8f9f7 429 /* Read DEPCTLn register */
<> 144:ef7eb2e8f9f7 430 if (ep->is_in == 1)
<> 144:ef7eb2e8f9f7 431 {
<> 144:ef7eb2e8f9f7 432 USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1 << (ep->num))));
<> 144:ef7eb2e8f9f7 433 USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1 << (ep->num))));
<> 144:ef7eb2e8f9f7 434 USBx_INEP(ep->num)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP;
<> 144:ef7eb2e8f9f7 435 }
<> 144:ef7eb2e8f9f7 436 else
<> 144:ef7eb2e8f9f7 437 {
<> 144:ef7eb2e8f9f7 438 USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1 << (ep->num)) << 16));
<> 144:ef7eb2e8f9f7 439 USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1 << (ep->num)) << 16));
<> 144:ef7eb2e8f9f7 440 USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP;
<> 144:ef7eb2e8f9f7 441 }
<> 144:ef7eb2e8f9f7 442 return HAL_OK;
<> 144:ef7eb2e8f9f7 443 }
<> 144:ef7eb2e8f9f7 444
<> 144:ef7eb2e8f9f7 445 /**
<> 144:ef7eb2e8f9f7 446 * @brief USB_EPStartXfer : setup and starts a transfer over an EP
<> 144:ef7eb2e8f9f7 447 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 448 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 449 * @retval HAL status
<> 144:ef7eb2e8f9f7 450 */
<> 144:ef7eb2e8f9f7 451 HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 452 {
<> 144:ef7eb2e8f9f7 453 uint16_t pktcnt = 0;
<> 144:ef7eb2e8f9f7 454
<> 144:ef7eb2e8f9f7 455 /* IN endpoint */
<> 144:ef7eb2e8f9f7 456 if (ep->is_in == 1)
<> 144:ef7eb2e8f9f7 457 {
<> 144:ef7eb2e8f9f7 458 /* Zero Length Packet? */
<> 144:ef7eb2e8f9f7 459 if (ep->xfer_len == 0)
<> 144:ef7eb2e8f9f7 460 {
<> 144:ef7eb2e8f9f7 461 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
<> 144:ef7eb2e8f9f7 462 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1 << 19)) ;
<> 144:ef7eb2e8f9f7 463 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
<> 144:ef7eb2e8f9f7 464 }
<> 144:ef7eb2e8f9f7 465 else
<> 144:ef7eb2e8f9f7 466 {
<> 144:ef7eb2e8f9f7 467 /* Program the transfer size and packet count
<> 144:ef7eb2e8f9f7 468 * as follows: xfersize = N * maxpacket +
<> 144:ef7eb2e8f9f7 469 * short_packet pktcnt = N + (short_packet
<> 144:ef7eb2e8f9f7 470 * exist ? 1 : 0)
<> 144:ef7eb2e8f9f7 471 */
<> 144:ef7eb2e8f9f7 472 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
<> 144:ef7eb2e8f9f7 473 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
<> 144:ef7eb2e8f9f7 474 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (((ep->xfer_len + ep->maxpacket -1)/ ep->maxpacket) << 19)) ;
<> 144:ef7eb2e8f9f7 475 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len);
<> 144:ef7eb2e8f9f7 476
<> 144:ef7eb2e8f9f7 477 if (ep->type == EP_TYPE_ISOC)
<> 144:ef7eb2e8f9f7 478 {
<> 144:ef7eb2e8f9f7 479 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT);
<> 144:ef7eb2e8f9f7 480 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1 << 29));
<> 144:ef7eb2e8f9f7 481 }
<> 144:ef7eb2e8f9f7 482 }
<> 144:ef7eb2e8f9f7 483
<> 144:ef7eb2e8f9f7 484 if (ep->type != EP_TYPE_ISOC)
<> 144:ef7eb2e8f9f7 485 {
<> 144:ef7eb2e8f9f7 486 /* Enable the Tx FIFO Empty Interrupt for this EP */
<> 144:ef7eb2e8f9f7 487 if (ep->xfer_len > 0)
<> 144:ef7eb2e8f9f7 488 {
<> 144:ef7eb2e8f9f7 489 USBx_DEVICE->DIEPEMPMSK |= 1 << ep->num;
<> 144:ef7eb2e8f9f7 490 }
<> 144:ef7eb2e8f9f7 491 }
<> 144:ef7eb2e8f9f7 492
<> 144:ef7eb2e8f9f7 493 if (ep->type == EP_TYPE_ISOC)
<> 144:ef7eb2e8f9f7 494 {
<> 144:ef7eb2e8f9f7 495 if ((USBx_DEVICE->DSTS & ( 1 << 8 )) == 0)
<> 144:ef7eb2e8f9f7 496 {
<> 144:ef7eb2e8f9f7 497 USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM;
<> 144:ef7eb2e8f9f7 498 }
<> 144:ef7eb2e8f9f7 499 else
<> 144:ef7eb2e8f9f7 500 {
<> 144:ef7eb2e8f9f7 501 USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM;
<> 144:ef7eb2e8f9f7 502 }
<> 144:ef7eb2e8f9f7 503 }
<> 144:ef7eb2e8f9f7 504
<> 144:ef7eb2e8f9f7 505 /* EP enable, IN data in FIFO */
<> 144:ef7eb2e8f9f7 506 USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA);
<> 144:ef7eb2e8f9f7 507
<> 144:ef7eb2e8f9f7 508 if (ep->type == EP_TYPE_ISOC)
<> 144:ef7eb2e8f9f7 509 {
<> 144:ef7eb2e8f9f7 510 USB_WritePacket(USBx, ep->xfer_buff, ep->num, ep->xfer_len);
<> 144:ef7eb2e8f9f7 511 }
<> 144:ef7eb2e8f9f7 512 }
<> 144:ef7eb2e8f9f7 513 else /* OUT endpoint */
<> 144:ef7eb2e8f9f7 514 {
<> 144:ef7eb2e8f9f7 515 /* Program the transfer size and packet count as follows:
<> 144:ef7eb2e8f9f7 516 * pktcnt = N
<> 144:ef7eb2e8f9f7 517 * xfersize = N * maxpacket
<> 144:ef7eb2e8f9f7 518 */
<> 144:ef7eb2e8f9f7 519 USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ);
<> 144:ef7eb2e8f9f7 520 USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT);
<> 144:ef7eb2e8f9f7 521
<> 144:ef7eb2e8f9f7 522 if (ep->xfer_len == 0)
<> 144:ef7eb2e8f9f7 523 {
<> 144:ef7eb2e8f9f7 524 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->maxpacket);
<> 144:ef7eb2e8f9f7 525 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19));
<> 144:ef7eb2e8f9f7 526 }
<> 144:ef7eb2e8f9f7 527 else
<> 144:ef7eb2e8f9f7 528 {
<> 144:ef7eb2e8f9f7 529 pktcnt = (ep->xfer_len + ep->maxpacket -1)/ ep->maxpacket;
<> 144:ef7eb2e8f9f7 530 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (pktcnt << 19));
<> 144:ef7eb2e8f9f7 531 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket * pktcnt));
<> 144:ef7eb2e8f9f7 532 }
<> 144:ef7eb2e8f9f7 533
<> 144:ef7eb2e8f9f7 534 if (ep->type == EP_TYPE_ISOC)
<> 144:ef7eb2e8f9f7 535 {
<> 144:ef7eb2e8f9f7 536 if ((USBx_DEVICE->DSTS & ( 1 << 8 )) == 0)
<> 144:ef7eb2e8f9f7 537 {
<> 144:ef7eb2e8f9f7 538 USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_SODDFRM;
<> 144:ef7eb2e8f9f7 539 }
<> 144:ef7eb2e8f9f7 540 else
<> 144:ef7eb2e8f9f7 541 {
<> 144:ef7eb2e8f9f7 542 USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM;
<> 144:ef7eb2e8f9f7 543 }
<> 144:ef7eb2e8f9f7 544 }
<> 144:ef7eb2e8f9f7 545 /* EP enable */
<> 144:ef7eb2e8f9f7 546 USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA);
<> 144:ef7eb2e8f9f7 547 }
<> 144:ef7eb2e8f9f7 548
<> 144:ef7eb2e8f9f7 549 return HAL_OK;
<> 144:ef7eb2e8f9f7 550 }
<> 144:ef7eb2e8f9f7 551
<> 144:ef7eb2e8f9f7 552 /**
<> 144:ef7eb2e8f9f7 553 * @brief USB_EP0StartXfer : setup and starts a transfer over the EP 0
<> 144:ef7eb2e8f9f7 554 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 555 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 556 * @retval HAL status
<> 144:ef7eb2e8f9f7 557 */
<> 144:ef7eb2e8f9f7 558 HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 559 {
<> 144:ef7eb2e8f9f7 560 /* IN endpoint */
<> 144:ef7eb2e8f9f7 561 if (ep->is_in == 1)
<> 144:ef7eb2e8f9f7 562 {
<> 144:ef7eb2e8f9f7 563 /* Zero Length Packet? */
<> 144:ef7eb2e8f9f7 564 if (ep->xfer_len == 0)
<> 144:ef7eb2e8f9f7 565 {
<> 144:ef7eb2e8f9f7 566 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
<> 144:ef7eb2e8f9f7 567 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1 << 19));
<> 144:ef7eb2e8f9f7 568 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
<> 144:ef7eb2e8f9f7 569 }
<> 144:ef7eb2e8f9f7 570 else
<> 144:ef7eb2e8f9f7 571 {
<> 144:ef7eb2e8f9f7 572 /* Program the transfer size and packet count
<> 144:ef7eb2e8f9f7 573 * as follows: xfersize = N * maxpacket +
<> 144:ef7eb2e8f9f7 574 * short_packet pktcnt = N + (short_packet
<> 144:ef7eb2e8f9f7 575 * exist ? 1 : 0)
<> 144:ef7eb2e8f9f7 576 */
<> 144:ef7eb2e8f9f7 577 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);
<> 144:ef7eb2e8f9f7 578 USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);
<> 144:ef7eb2e8f9f7 579
<> 144:ef7eb2e8f9f7 580 if(ep->xfer_len > ep->maxpacket)
<> 144:ef7eb2e8f9f7 581 {
<> 144:ef7eb2e8f9f7 582 ep->xfer_len = ep->maxpacket;
<> 144:ef7eb2e8f9f7 583 }
<> 144:ef7eb2e8f9f7 584 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1 << 19));
<> 144:ef7eb2e8f9f7 585 USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len);
<> 144:ef7eb2e8f9f7 586 }
<> 144:ef7eb2e8f9f7 587
<> 144:ef7eb2e8f9f7 588 /* Enable the Tx FIFO Empty Interrupt for this EP */
<> 144:ef7eb2e8f9f7 589 if (ep->xfer_len > 0)
<> 144:ef7eb2e8f9f7 590 {
<> 144:ef7eb2e8f9f7 591 USBx_DEVICE->DIEPEMPMSK |= 1 << (ep->num);
<> 144:ef7eb2e8f9f7 592 }
<> 144:ef7eb2e8f9f7 593
<> 144:ef7eb2e8f9f7 594 /* EP enable, IN data in FIFO */
<> 144:ef7eb2e8f9f7 595 USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA);
<> 144:ef7eb2e8f9f7 596 }
<> 144:ef7eb2e8f9f7 597 else /* OUT endpoint */
<> 144:ef7eb2e8f9f7 598 {
<> 144:ef7eb2e8f9f7 599 /* Program the transfer size and packet count as follows:
<> 144:ef7eb2e8f9f7 600 * pktcnt = N
<> 144:ef7eb2e8f9f7 601 * xfersize = N * maxpacket
<> 144:ef7eb2e8f9f7 602 */
<> 144:ef7eb2e8f9f7 603 USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ);
<> 144:ef7eb2e8f9f7 604 USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT);
<> 144:ef7eb2e8f9f7 605
<> 144:ef7eb2e8f9f7 606 if (ep->xfer_len > 0)
<> 144:ef7eb2e8f9f7 607 {
<> 144:ef7eb2e8f9f7 608 ep->xfer_len = ep->maxpacket;
<> 144:ef7eb2e8f9f7 609 }
<> 144:ef7eb2e8f9f7 610
<> 144:ef7eb2e8f9f7 611 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19));
<> 144:ef7eb2e8f9f7 612 USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket));
<> 144:ef7eb2e8f9f7 613
<> 144:ef7eb2e8f9f7 614 /* EP enable */
<> 144:ef7eb2e8f9f7 615 USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA);
<> 144:ef7eb2e8f9f7 616 }
<> 144:ef7eb2e8f9f7 617
<> 144:ef7eb2e8f9f7 618 return HAL_OK;
<> 144:ef7eb2e8f9f7 619 }
<> 144:ef7eb2e8f9f7 620
<> 144:ef7eb2e8f9f7 621 /**
<> 144:ef7eb2e8f9f7 622 * @brief USB_WritePacket : Writes a packet into the Tx FIFO associated
<> 144:ef7eb2e8f9f7 623 * with the EP/channel
<> 144:ef7eb2e8f9f7 624 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 625 * @param src : pointer to source buffer
<> 144:ef7eb2e8f9f7 626 * @param ch_ep_num : endpoint or host channel number
<> 144:ef7eb2e8f9f7 627 * @param len : Number of bytes to write
<> 144:ef7eb2e8f9f7 628 * @retval HAL status
<> 144:ef7eb2e8f9f7 629 */
<> 144:ef7eb2e8f9f7 630 HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len)
<> 144:ef7eb2e8f9f7 631 {
<> 144:ef7eb2e8f9f7 632 uint32_t count32b = 0 , index = 0;
<> 144:ef7eb2e8f9f7 633
<> 144:ef7eb2e8f9f7 634 count32b = (len + 3) / 4;
<> 144:ef7eb2e8f9f7 635 for (index = 0; index < count32b; index++, src += 4)
<> 144:ef7eb2e8f9f7 636 {
<> 144:ef7eb2e8f9f7 637 USBx_DFIFO(ch_ep_num) = *((__packed uint32_t *)src);
<> 144:ef7eb2e8f9f7 638 }
<> 144:ef7eb2e8f9f7 639 return HAL_OK;
<> 144:ef7eb2e8f9f7 640 }
<> 144:ef7eb2e8f9f7 641
<> 144:ef7eb2e8f9f7 642 /**
<> 144:ef7eb2e8f9f7 643 * @brief USB_ReadPacket : read a packet from the Tx FIFO associated
<> 144:ef7eb2e8f9f7 644 * with the EP/channel
<> 144:ef7eb2e8f9f7 645 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 646 * @param dest : destination pointer
<> 144:ef7eb2e8f9f7 647 * @param len : Number of bytes to read
<> 144:ef7eb2e8f9f7 648 * @retval pointer to destination buffer
<> 144:ef7eb2e8f9f7 649 */
<> 144:ef7eb2e8f9f7 650 void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len)
<> 144:ef7eb2e8f9f7 651 {
<> 144:ef7eb2e8f9f7 652 uint32_t index = 0;
<> 144:ef7eb2e8f9f7 653 uint32_t count32b = (len + 3) / 4;
<> 144:ef7eb2e8f9f7 654
<> 144:ef7eb2e8f9f7 655 for ( index = 0; index < count32b; index++, dest += 4 )
<> 144:ef7eb2e8f9f7 656 {
<> 144:ef7eb2e8f9f7 657 *(__packed uint32_t *)dest = USBx_DFIFO(0);
<> 144:ef7eb2e8f9f7 658
<> 144:ef7eb2e8f9f7 659 }
<> 144:ef7eb2e8f9f7 660 return ((void *)dest);
<> 144:ef7eb2e8f9f7 661 }
<> 144:ef7eb2e8f9f7 662
<> 144:ef7eb2e8f9f7 663 /**
<> 144:ef7eb2e8f9f7 664 * @brief USB_EPSetStall : set a stall condition over an EP
<> 144:ef7eb2e8f9f7 665 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 666 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 667 * @retval HAL status
<> 144:ef7eb2e8f9f7 668 */
<> 144:ef7eb2e8f9f7 669 HAL_StatusTypeDef USB_EPSetStall(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 670 {
<> 144:ef7eb2e8f9f7 671 if (ep->is_in == 1)
<> 144:ef7eb2e8f9f7 672 {
<> 144:ef7eb2e8f9f7 673 if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_EPENA) == 0)
<> 144:ef7eb2e8f9f7 674 {
<> 144:ef7eb2e8f9f7 675 USBx_INEP(ep->num)->DIEPCTL &= ~(USB_OTG_DIEPCTL_EPDIS);
<> 144:ef7eb2e8f9f7 676 }
<> 144:ef7eb2e8f9f7 677 USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_STALL;
<> 144:ef7eb2e8f9f7 678 }
<> 144:ef7eb2e8f9f7 679 else
<> 144:ef7eb2e8f9f7 680 {
<> 144:ef7eb2e8f9f7 681 if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_EPENA) == 0)
<> 144:ef7eb2e8f9f7 682 {
<> 144:ef7eb2e8f9f7 683 USBx_OUTEP(ep->num)->DOEPCTL &= ~(USB_OTG_DOEPCTL_EPDIS);
<> 144:ef7eb2e8f9f7 684 }
<> 144:ef7eb2e8f9f7 685 USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_STALL;
<> 144:ef7eb2e8f9f7 686 }
<> 144:ef7eb2e8f9f7 687 return HAL_OK;
<> 144:ef7eb2e8f9f7 688 }
<> 144:ef7eb2e8f9f7 689
<> 144:ef7eb2e8f9f7 690 /**
<> 144:ef7eb2e8f9f7 691 * @brief USB_EPClearStall : Clear a stall condition over an EP
<> 144:ef7eb2e8f9f7 692 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 693 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 694 * @retval HAL status
<> 144:ef7eb2e8f9f7 695 */
<> 144:ef7eb2e8f9f7 696 HAL_StatusTypeDef USB_EPClearStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 697 {
<> 144:ef7eb2e8f9f7 698 if (ep->is_in == 1)
<> 144:ef7eb2e8f9f7 699 {
<> 144:ef7eb2e8f9f7 700 USBx_INEP(ep->num)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL;
<> 144:ef7eb2e8f9f7 701 if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK)
<> 144:ef7eb2e8f9f7 702 {
<> 144:ef7eb2e8f9f7 703 USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; /* DATA0 */
<> 144:ef7eb2e8f9f7 704 }
<> 144:ef7eb2e8f9f7 705 }
<> 144:ef7eb2e8f9f7 706 else
<> 144:ef7eb2e8f9f7 707 {
<> 144:ef7eb2e8f9f7 708 USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL;
<> 144:ef7eb2e8f9f7 709 if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK)
<> 144:ef7eb2e8f9f7 710 {
<> 144:ef7eb2e8f9f7 711 USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; /* DATA0 */
<> 144:ef7eb2e8f9f7 712 }
<> 144:ef7eb2e8f9f7 713 }
<> 144:ef7eb2e8f9f7 714 return HAL_OK;
<> 144:ef7eb2e8f9f7 715 }
<> 144:ef7eb2e8f9f7 716
<> 144:ef7eb2e8f9f7 717 /**
<> 144:ef7eb2e8f9f7 718 * @brief USB_StopDevice : Stop the usb device mode
<> 144:ef7eb2e8f9f7 719 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 720 * @retval HAL status
<> 144:ef7eb2e8f9f7 721 */
<> 144:ef7eb2e8f9f7 722 HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 723 {
<> 144:ef7eb2e8f9f7 724 uint32_t index = 0;
<> 144:ef7eb2e8f9f7 725
<> 144:ef7eb2e8f9f7 726 /* Clear Pending interrupt */
<> 144:ef7eb2e8f9f7 727 for (index = 0; index < 15 ; index++)
<> 144:ef7eb2e8f9f7 728 {
<> 144:ef7eb2e8f9f7 729 USBx_INEP(index)->DIEPINT = 0xFF;
<> 144:ef7eb2e8f9f7 730 USBx_OUTEP(index)->DOEPINT = 0xFF;
<> 144:ef7eb2e8f9f7 731 }
<> 144:ef7eb2e8f9f7 732 USBx_DEVICE->DAINT = 0xFFFFFFFF;
<> 144:ef7eb2e8f9f7 733
<> 144:ef7eb2e8f9f7 734 /* Clear interrupt masks */
<> 144:ef7eb2e8f9f7 735 USBx_DEVICE->DIEPMSK = 0;
<> 144:ef7eb2e8f9f7 736 USBx_DEVICE->DOEPMSK = 0;
<> 144:ef7eb2e8f9f7 737 USBx_DEVICE->DAINTMSK = 0;
<> 144:ef7eb2e8f9f7 738
<> 144:ef7eb2e8f9f7 739 /* Flush the FIFO */
<> 144:ef7eb2e8f9f7 740 USB_FlushRxFifo(USBx);
<> 144:ef7eb2e8f9f7 741 USB_FlushTxFifo(USBx , 0x10 );
<> 144:ef7eb2e8f9f7 742
<> 144:ef7eb2e8f9f7 743 return HAL_OK;
<> 144:ef7eb2e8f9f7 744 }
<> 144:ef7eb2e8f9f7 745
<> 144:ef7eb2e8f9f7 746 /**
<> 144:ef7eb2e8f9f7 747 * @brief USB_SetDevAddress : Stop the usb device mode
<> 144:ef7eb2e8f9f7 748 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 749 * @param address : new device address to be assigned
<> 144:ef7eb2e8f9f7 750 * This parameter can be a value from 0 to 255
<> 144:ef7eb2e8f9f7 751 * @retval HAL status
<> 144:ef7eb2e8f9f7 752 */
<> 144:ef7eb2e8f9f7 753 HAL_StatusTypeDef USB_SetDevAddress (USB_OTG_GlobalTypeDef *USBx, uint8_t address)
<> 144:ef7eb2e8f9f7 754 {
<> 144:ef7eb2e8f9f7 755 USBx_DEVICE->DCFG &= ~ (USB_OTG_DCFG_DAD);
<> 144:ef7eb2e8f9f7 756 USBx_DEVICE->DCFG |= (address << 4) & USB_OTG_DCFG_DAD;
<> 144:ef7eb2e8f9f7 757
<> 144:ef7eb2e8f9f7 758 return HAL_OK;
<> 144:ef7eb2e8f9f7 759 }
<> 144:ef7eb2e8f9f7 760
<> 144:ef7eb2e8f9f7 761 /**
<> 144:ef7eb2e8f9f7 762 * @brief USB_DevConnect : Connect the USB device by enabling the pull-up/pull-down
<> 144:ef7eb2e8f9f7 763 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 764 * @retval HAL status
<> 144:ef7eb2e8f9f7 765 */
<> 144:ef7eb2e8f9f7 766 HAL_StatusTypeDef USB_DevConnect (USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 767 {
<> 144:ef7eb2e8f9f7 768 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS ;
<> 144:ef7eb2e8f9f7 769 HAL_Delay(3);
<> 144:ef7eb2e8f9f7 770
<> 144:ef7eb2e8f9f7 771 return HAL_OK;
<> 144:ef7eb2e8f9f7 772 }
<> 144:ef7eb2e8f9f7 773
<> 144:ef7eb2e8f9f7 774 /**
<> 144:ef7eb2e8f9f7 775 * @brief USB_DevDisconnect : Disconnect the USB device by disabling the pull-up/pull-down
<> 144:ef7eb2e8f9f7 776 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 777 * @retval HAL status
<> 144:ef7eb2e8f9f7 778 */
<> 144:ef7eb2e8f9f7 779 HAL_StatusTypeDef USB_DevDisconnect (USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 780 {
<> 144:ef7eb2e8f9f7 781 USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS;
<> 144:ef7eb2e8f9f7 782 HAL_Delay(3);
<> 144:ef7eb2e8f9f7 783
<> 144:ef7eb2e8f9f7 784 return HAL_OK;
<> 144:ef7eb2e8f9f7 785 }
<> 144:ef7eb2e8f9f7 786
<> 144:ef7eb2e8f9f7 787 /**
<> 144:ef7eb2e8f9f7 788 * @brief USB_ReadInterrupts: return the global USB interrupt status
<> 144:ef7eb2e8f9f7 789 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 790 * @retval HAL status
<> 144:ef7eb2e8f9f7 791 */
<> 144:ef7eb2e8f9f7 792 uint32_t USB_ReadInterrupts (USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 793 {
<> 144:ef7eb2e8f9f7 794 uint32_t tmpreg = 0;
<> 144:ef7eb2e8f9f7 795
<> 144:ef7eb2e8f9f7 796 tmpreg = USBx->GINTSTS;
<> 144:ef7eb2e8f9f7 797 tmpreg &= USBx->GINTMSK;
<> 144:ef7eb2e8f9f7 798 return tmpreg;
<> 144:ef7eb2e8f9f7 799 }
<> 144:ef7eb2e8f9f7 800
<> 144:ef7eb2e8f9f7 801 /**
<> 144:ef7eb2e8f9f7 802 * @brief USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status
<> 144:ef7eb2e8f9f7 803 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 804 * @retval HAL status
<> 144:ef7eb2e8f9f7 805 */
<> 144:ef7eb2e8f9f7 806 uint32_t USB_ReadDevAllOutEpInterrupt (USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 807 {
<> 144:ef7eb2e8f9f7 808 uint32_t tmpreg = 0;
<> 144:ef7eb2e8f9f7 809 tmpreg = USBx_DEVICE->DAINT;
<> 144:ef7eb2e8f9f7 810 tmpreg &= USBx_DEVICE->DAINTMSK;
<> 144:ef7eb2e8f9f7 811 return ((tmpreg & 0xffff0000) >> 16);
<> 144:ef7eb2e8f9f7 812 }
<> 144:ef7eb2e8f9f7 813
<> 144:ef7eb2e8f9f7 814 /**
<> 144:ef7eb2e8f9f7 815 * @brief USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status
<> 144:ef7eb2e8f9f7 816 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 817 * @retval HAL status
<> 144:ef7eb2e8f9f7 818 */
<> 144:ef7eb2e8f9f7 819 uint32_t USB_ReadDevAllInEpInterrupt (USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 820 {
<> 144:ef7eb2e8f9f7 821 uint32_t tmpreg = 0;
<> 144:ef7eb2e8f9f7 822 tmpreg = USBx_DEVICE->DAINT;
<> 144:ef7eb2e8f9f7 823 tmpreg &= USBx_DEVICE->DAINTMSK;
<> 144:ef7eb2e8f9f7 824 return ((tmpreg & 0xFFFF));
<> 144:ef7eb2e8f9f7 825 }
<> 144:ef7eb2e8f9f7 826
<> 144:ef7eb2e8f9f7 827 /**
<> 144:ef7eb2e8f9f7 828 * @brief Returns Device OUT EP Interrupt register
<> 144:ef7eb2e8f9f7 829 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 830 * @param epnum : endpoint number
<> 144:ef7eb2e8f9f7 831 * This parameter can be a value from 0 to 15
<> 144:ef7eb2e8f9f7 832 * @retval Device OUT EP Interrupt register
<> 144:ef7eb2e8f9f7 833 */
<> 144:ef7eb2e8f9f7 834 uint32_t USB_ReadDevOutEPInterrupt (USB_OTG_GlobalTypeDef *USBx , uint8_t epnum)
<> 144:ef7eb2e8f9f7 835 {
<> 144:ef7eb2e8f9f7 836 uint32_t tmpreg = 0;
<> 144:ef7eb2e8f9f7 837 tmpreg = USBx_OUTEP(epnum)->DOEPINT;
<> 144:ef7eb2e8f9f7 838 tmpreg &= USBx_DEVICE->DOEPMSK;
<> 144:ef7eb2e8f9f7 839 return tmpreg;
<> 144:ef7eb2e8f9f7 840 }
<> 144:ef7eb2e8f9f7 841
<> 144:ef7eb2e8f9f7 842 /**
<> 144:ef7eb2e8f9f7 843 * @brief Returns Device IN EP Interrupt register
<> 144:ef7eb2e8f9f7 844 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 845 * @param epnum : endpoint number
<> 144:ef7eb2e8f9f7 846 * This parameter can be a value from 0 to 15
<> 144:ef7eb2e8f9f7 847 * @retval Device IN EP Interrupt register
<> 144:ef7eb2e8f9f7 848 */
<> 144:ef7eb2e8f9f7 849 uint32_t USB_ReadDevInEPInterrupt (USB_OTG_GlobalTypeDef *USBx , uint8_t epnum)
<> 144:ef7eb2e8f9f7 850 {
<> 144:ef7eb2e8f9f7 851 uint32_t tmpreg = 0, msk = 0, emp = 0;
<> 144:ef7eb2e8f9f7 852
<> 144:ef7eb2e8f9f7 853 msk = USBx_DEVICE->DIEPMSK;
<> 144:ef7eb2e8f9f7 854 emp = USBx_DEVICE->DIEPEMPMSK;
<> 144:ef7eb2e8f9f7 855 msk |= ((emp >> epnum) & 0x1) << 7;
<> 144:ef7eb2e8f9f7 856 tmpreg = USBx_INEP(epnum)->DIEPINT & msk;
<> 144:ef7eb2e8f9f7 857 return tmpreg;
<> 144:ef7eb2e8f9f7 858 }
<> 144:ef7eb2e8f9f7 859
<> 144:ef7eb2e8f9f7 860 /**
<> 144:ef7eb2e8f9f7 861 * @brief USB_ClearInterrupts: clear a USB interrupt
<> 144:ef7eb2e8f9f7 862 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 863 * @param interrupt : interrupt flag
<> 144:ef7eb2e8f9f7 864 * @retval None
<> 144:ef7eb2e8f9f7 865 */
<> 144:ef7eb2e8f9f7 866 void USB_ClearInterrupts (USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt)
<> 144:ef7eb2e8f9f7 867 {
<> 144:ef7eb2e8f9f7 868 USBx->GINTSTS |= interrupt;
<> 144:ef7eb2e8f9f7 869 }
<> 144:ef7eb2e8f9f7 870
<> 144:ef7eb2e8f9f7 871 /**
<> 144:ef7eb2e8f9f7 872 * @brief Returns USB core mode
<> 144:ef7eb2e8f9f7 873 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 874 * @retval return core mode : Host or Device
<> 144:ef7eb2e8f9f7 875 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 876 * 0 : Host
<> 144:ef7eb2e8f9f7 877 * 1 : Device
<> 144:ef7eb2e8f9f7 878 */
<> 144:ef7eb2e8f9f7 879 uint32_t USB_GetMode(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 880 {
<> 144:ef7eb2e8f9f7 881 return ((USBx->GINTSTS ) & 0x1);
<> 144:ef7eb2e8f9f7 882 }
<> 144:ef7eb2e8f9f7 883
<> 144:ef7eb2e8f9f7 884 /**
<> 144:ef7eb2e8f9f7 885 * @brief Activate EP0 for Setup transactions
<> 144:ef7eb2e8f9f7 886 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 887 * @retval HAL status
<> 144:ef7eb2e8f9f7 888 */
<> 144:ef7eb2e8f9f7 889 HAL_StatusTypeDef USB_ActivateSetup (USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 890 {
<> 144:ef7eb2e8f9f7 891 /* Set the MPS of the IN EP based on the enumeration speed */
<> 144:ef7eb2e8f9f7 892 USBx_INEP(0)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ;
<> 144:ef7eb2e8f9f7 893
<> 144:ef7eb2e8f9f7 894 if((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ)
<> 144:ef7eb2e8f9f7 895 {
<> 144:ef7eb2e8f9f7 896 USBx_INEP(0)->DIEPCTL |= 3;
<> 144:ef7eb2e8f9f7 897 }
<> 144:ef7eb2e8f9f7 898 USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK;
<> 144:ef7eb2e8f9f7 899
<> 144:ef7eb2e8f9f7 900 return HAL_OK;
<> 144:ef7eb2e8f9f7 901 }
<> 144:ef7eb2e8f9f7 902
<> 144:ef7eb2e8f9f7 903 /**
<> 144:ef7eb2e8f9f7 904 * @brief Prepare the EP0 to start the first control setup
<> 144:ef7eb2e8f9f7 905 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 906 * @param psetup : pointer to setup packet
<> 144:ef7eb2e8f9f7 907 * @retval HAL status
<> 144:ef7eb2e8f9f7 908 */
<> 144:ef7eb2e8f9f7 909 HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t *psetup)
<> 144:ef7eb2e8f9f7 910 {
<> 144:ef7eb2e8f9f7 911 USBx_OUTEP(0)->DOEPTSIZ = 0;
<> 144:ef7eb2e8f9f7 912 USBx_OUTEP(0)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19));
<> 144:ef7eb2e8f9f7 913 USBx_OUTEP(0)->DOEPTSIZ |= (3 * 8);
<> 144:ef7eb2e8f9f7 914 USBx_OUTEP(0)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_STUPCNT;
<> 144:ef7eb2e8f9f7 915
<> 144:ef7eb2e8f9f7 916 return HAL_OK;
<> 144:ef7eb2e8f9f7 917 }
<> 144:ef7eb2e8f9f7 918
<> 144:ef7eb2e8f9f7 919 /**
<> 144:ef7eb2e8f9f7 920 * @brief USB_HostInit : Initializes the USB OTG controller registers
<> 144:ef7eb2e8f9f7 921 * for Host mode
<> 144:ef7eb2e8f9f7 922 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 923 * @param cfg : pointer to a USB_OTG_CfgTypeDef structure that contains
<> 144:ef7eb2e8f9f7 924 * the configuration information for the specified USBx peripheral.
<> 144:ef7eb2e8f9f7 925 * @retval HAL status
<> 144:ef7eb2e8f9f7 926 */
<> 144:ef7eb2e8f9f7 927 HAL_StatusTypeDef USB_HostInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
<> 144:ef7eb2e8f9f7 928 {
<> 144:ef7eb2e8f9f7 929 uint32_t index = 0;
<> 144:ef7eb2e8f9f7 930
<> 144:ef7eb2e8f9f7 931 /* Restart the Phy Clock */
<> 144:ef7eb2e8f9f7 932 USBx_PCGCCTL = 0;
<> 144:ef7eb2e8f9f7 933
<> 144:ef7eb2e8f9f7 934 /* no VBUS sensing*/
<> 144:ef7eb2e8f9f7 935 USBx->GCCFG &=~ (USB_OTG_GCCFG_VBUSASEN);
<> 144:ef7eb2e8f9f7 936 USBx->GCCFG &=~ (USB_OTG_GCCFG_VBUSBSEN);
<> 144:ef7eb2e8f9f7 937
<> 144:ef7eb2e8f9f7 938 /* Disable the FS/LS support mode only */
<> 144:ef7eb2e8f9f7 939 if((cfg.speed == USB_OTG_SPEED_FULL)&&
<> 144:ef7eb2e8f9f7 940 (USBx != USB_OTG_FS))
<> 144:ef7eb2e8f9f7 941 {
<> 144:ef7eb2e8f9f7 942 USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS;
<> 144:ef7eb2e8f9f7 943 }
<> 144:ef7eb2e8f9f7 944 else
<> 144:ef7eb2e8f9f7 945 {
<> 144:ef7eb2e8f9f7 946 USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS);
<> 144:ef7eb2e8f9f7 947 }
<> 144:ef7eb2e8f9f7 948
<> 144:ef7eb2e8f9f7 949 /* Make sure the FIFOs are flushed. */
<> 144:ef7eb2e8f9f7 950 USB_FlushTxFifo(USBx, 0x10 ); /* all Tx FIFOs */
<> 144:ef7eb2e8f9f7 951 USB_FlushRxFifo(USBx);
<> 144:ef7eb2e8f9f7 952
<> 144:ef7eb2e8f9f7 953 /* Clear all pending HC Interrupts */
<> 144:ef7eb2e8f9f7 954 for (index = 0; index < cfg.Host_channels; index++)
<> 144:ef7eb2e8f9f7 955 {
<> 144:ef7eb2e8f9f7 956 USBx_HC(index)->HCINT = 0xFFFFFFFF;
<> 144:ef7eb2e8f9f7 957 USBx_HC(index)->HCINTMSK = 0;
<> 144:ef7eb2e8f9f7 958 }
<> 144:ef7eb2e8f9f7 959
<> 144:ef7eb2e8f9f7 960 /* Enable VBUS driving */
<> 144:ef7eb2e8f9f7 961 USB_DriveVbus(USBx, 1);
<> 144:ef7eb2e8f9f7 962
<> 144:ef7eb2e8f9f7 963 HAL_Delay(200);
<> 144:ef7eb2e8f9f7 964
<> 144:ef7eb2e8f9f7 965 /* Disable all interrupts. */
<> 144:ef7eb2e8f9f7 966 USBx->GINTMSK = 0;
<> 144:ef7eb2e8f9f7 967
<> 144:ef7eb2e8f9f7 968 /* Clear any pending interrupts */
<> 144:ef7eb2e8f9f7 969 USBx->GINTSTS = 0xFFFFFFFF;
<> 144:ef7eb2e8f9f7 970
<> 144:ef7eb2e8f9f7 971 if(USBx == USB_OTG_FS)
<> 144:ef7eb2e8f9f7 972 {
<> 144:ef7eb2e8f9f7 973 /* set Rx FIFO size */
<> 144:ef7eb2e8f9f7 974 USBx->GRXFSIZ = (uint32_t )0x80;
<> 144:ef7eb2e8f9f7 975 USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t )(((0x60 << 16)& USB_OTG_NPTXFD) | 0x80);
<> 144:ef7eb2e8f9f7 976 USBx->HPTXFSIZ = (uint32_t )(((0x40 << 16)& USB_OTG_HPTXFSIZ_PTXFD) | 0xE0);
<> 144:ef7eb2e8f9f7 977 }
<> 144:ef7eb2e8f9f7 978
<> 144:ef7eb2e8f9f7 979 /* Enable the common interrupts */
<> 144:ef7eb2e8f9f7 980 USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM;
<> 144:ef7eb2e8f9f7 981
<> 144:ef7eb2e8f9f7 982 /* Enable interrupts matching to the Host mode ONLY */
<> 144:ef7eb2e8f9f7 983 USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM |\
<> 144:ef7eb2e8f9f7 984 USB_OTG_GINTMSK_SOFM |USB_OTG_GINTSTS_DISCINT|\
<> 144:ef7eb2e8f9f7 985 USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM);
<> 144:ef7eb2e8f9f7 986
<> 144:ef7eb2e8f9f7 987 return HAL_OK;
<> 144:ef7eb2e8f9f7 988 }
<> 144:ef7eb2e8f9f7 989
<> 144:ef7eb2e8f9f7 990 /**
<> 144:ef7eb2e8f9f7 991 * @brief USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the
<> 144:ef7eb2e8f9f7 992 * HCFG register on the PHY type and set the right frame interval
<> 144:ef7eb2e8f9f7 993 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 994 * @param freq : clock frequency
<> 144:ef7eb2e8f9f7 995 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 996 * HCFG_48_MHZ : Full Speed 48 MHz Clock
<> 144:ef7eb2e8f9f7 997 * HCFG_6_MHZ : Low Speed 6 MHz Clock
<> 144:ef7eb2e8f9f7 998 * @retval HAL status
<> 144:ef7eb2e8f9f7 999 */
<> 144:ef7eb2e8f9f7 1000 HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx , uint8_t freq)
<> 144:ef7eb2e8f9f7 1001 {
<> 144:ef7eb2e8f9f7 1002 USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSPCS);
<> 144:ef7eb2e8f9f7 1003 USBx_HOST->HCFG |= (freq & USB_OTG_HCFG_FSLSPCS);
<> 144:ef7eb2e8f9f7 1004
<> 144:ef7eb2e8f9f7 1005 if (freq == HCFG_48_MHZ)
<> 144:ef7eb2e8f9f7 1006 {
<> 144:ef7eb2e8f9f7 1007 USBx_HOST->HFIR = (uint32_t)48000;
<> 144:ef7eb2e8f9f7 1008 }
<> 144:ef7eb2e8f9f7 1009 else if (freq == HCFG_6_MHZ)
<> 144:ef7eb2e8f9f7 1010 {
<> 144:ef7eb2e8f9f7 1011 USBx_HOST->HFIR = (uint32_t)6000;
<> 144:ef7eb2e8f9f7 1012 }
<> 144:ef7eb2e8f9f7 1013 return HAL_OK;
<> 144:ef7eb2e8f9f7 1014 }
<> 144:ef7eb2e8f9f7 1015
<> 144:ef7eb2e8f9f7 1016 /**
<> 144:ef7eb2e8f9f7 1017 * @brief USB_OTG_ResetPort : Reset Host Port
<> 144:ef7eb2e8f9f7 1018 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1019 * @retval HAL status
<> 144:ef7eb2e8f9f7 1020 * @note : (1)The application must wait at least 10 ms
<> 144:ef7eb2e8f9f7 1021 * before clearing the reset bit.
<> 144:ef7eb2e8f9f7 1022 */
<> 144:ef7eb2e8f9f7 1023 HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 1024 {
<> 144:ef7eb2e8f9f7 1025 __IO uint32_t hprt0 = 0;
<> 144:ef7eb2e8f9f7 1026
<> 144:ef7eb2e8f9f7 1027 hprt0 = USBx_HPRT0;
<> 144:ef7eb2e8f9f7 1028
<> 144:ef7eb2e8f9f7 1029 hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
<> 144:ef7eb2e8f9f7 1030 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
<> 144:ef7eb2e8f9f7 1031
<> 144:ef7eb2e8f9f7 1032 USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0);
<> 144:ef7eb2e8f9f7 1033 HAL_Delay (10); /* See Note #1 */
<> 144:ef7eb2e8f9f7 1034 USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0);
<> 144:ef7eb2e8f9f7 1035 return HAL_OK;
<> 144:ef7eb2e8f9f7 1036 }
<> 144:ef7eb2e8f9f7 1037
<> 144:ef7eb2e8f9f7 1038 /**
<> 144:ef7eb2e8f9f7 1039 * @brief USB_DriveVbus : activate or de-activate vbus
<> 144:ef7eb2e8f9f7 1040 * @param state : VBUS state
<> 144:ef7eb2e8f9f7 1041 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 1042 * 0 : VBUS Active
<> 144:ef7eb2e8f9f7 1043 * 1 : VBUS Inactive
<> 144:ef7eb2e8f9f7 1044 * @retval HAL status
<> 144:ef7eb2e8f9f7 1045 */
<> 144:ef7eb2e8f9f7 1046 HAL_StatusTypeDef USB_DriveVbus (USB_OTG_GlobalTypeDef *USBx, uint8_t state)
<> 144:ef7eb2e8f9f7 1047 {
<> 144:ef7eb2e8f9f7 1048 __IO uint32_t hprt0 = 0;
<> 144:ef7eb2e8f9f7 1049
<> 144:ef7eb2e8f9f7 1050 hprt0 = USBx_HPRT0;
<> 144:ef7eb2e8f9f7 1051 hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\
<> 144:ef7eb2e8f9f7 1052 USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG );
<> 144:ef7eb2e8f9f7 1053
<> 144:ef7eb2e8f9f7 1054 if (((hprt0 & USB_OTG_HPRT_PPWR) == 0 ) && (state == 1 ))
<> 144:ef7eb2e8f9f7 1055 {
<> 144:ef7eb2e8f9f7 1056 USBx_HPRT0 = (USB_OTG_HPRT_PPWR | hprt0);
<> 144:ef7eb2e8f9f7 1057 }
<> 144:ef7eb2e8f9f7 1058 if (((hprt0 & USB_OTG_HPRT_PPWR) == USB_OTG_HPRT_PPWR) && (state == 0 ))
<> 144:ef7eb2e8f9f7 1059 {
<> 144:ef7eb2e8f9f7 1060 USBx_HPRT0 = ((~USB_OTG_HPRT_PPWR) & hprt0);
<> 144:ef7eb2e8f9f7 1061 }
<> 144:ef7eb2e8f9f7 1062 return HAL_OK;
<> 144:ef7eb2e8f9f7 1063 }
<> 144:ef7eb2e8f9f7 1064
<> 144:ef7eb2e8f9f7 1065 /**
<> 144:ef7eb2e8f9f7 1066 * @brief Return Host Core speed
<> 144:ef7eb2e8f9f7 1067 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1068 * @retval speed : Host speed
<> 144:ef7eb2e8f9f7 1069 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 1070 * @arg USB_OTG_SPEED_FULL: Full speed mode
<> 144:ef7eb2e8f9f7 1071 * @arg USB_OTG_SPEED_LOW: Low speed mode
<> 144:ef7eb2e8f9f7 1072 */
<> 144:ef7eb2e8f9f7 1073 uint32_t USB_GetHostSpeed (USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 1074 {
<> 144:ef7eb2e8f9f7 1075 __IO uint32_t hprt0 = 0;
<> 144:ef7eb2e8f9f7 1076
<> 144:ef7eb2e8f9f7 1077 hprt0 = USBx_HPRT0;
<> 144:ef7eb2e8f9f7 1078 return ((hprt0 & USB_OTG_HPRT_PSPD) >> 17);
<> 144:ef7eb2e8f9f7 1079 }
<> 144:ef7eb2e8f9f7 1080
<> 144:ef7eb2e8f9f7 1081 /**
<> 144:ef7eb2e8f9f7 1082 * @brief Return Host Current Frame number
<> 144:ef7eb2e8f9f7 1083 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1084 * @retval current frame number
<> 144:ef7eb2e8f9f7 1085 */
<> 144:ef7eb2e8f9f7 1086 uint32_t USB_GetCurrentFrame (USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 1087 {
<> 144:ef7eb2e8f9f7 1088 return (USBx_HOST->HFNUM & USB_OTG_HFNUM_FRNUM);
<> 144:ef7eb2e8f9f7 1089 }
<> 144:ef7eb2e8f9f7 1090
<> 144:ef7eb2e8f9f7 1091 /**
<> 144:ef7eb2e8f9f7 1092 * @brief Initialize a host channel
<> 144:ef7eb2e8f9f7 1093 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1094 * @param ch_num : Channel number
<> 144:ef7eb2e8f9f7 1095 * This parameter can be a value from 1 to 15
<> 144:ef7eb2e8f9f7 1096 * @param epnum : Endpoint number
<> 144:ef7eb2e8f9f7 1097 * This parameter can be a value from 1 to 15
<> 144:ef7eb2e8f9f7 1098 * @param dev_address : Current device address
<> 144:ef7eb2e8f9f7 1099 * This parameter can be a value from 0 to 255
<> 144:ef7eb2e8f9f7 1100 * @param speed : Current device speed
<> 144:ef7eb2e8f9f7 1101 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 1102 * @arg USB_OTG_SPEED_FULL: Full speed mode
<> 144:ef7eb2e8f9f7 1103 * @arg USB_OTG_SPEED_LOW: Low speed mode
<> 144:ef7eb2e8f9f7 1104 * @param ep_type : Endpoint Type
<> 144:ef7eb2e8f9f7 1105 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 1106 * @arg EP_TYPE_CTRL: Control type
<> 144:ef7eb2e8f9f7 1107 * @arg EP_TYPE_ISOC: Isochronous type
<> 144:ef7eb2e8f9f7 1108 * @arg EP_TYPE_BULK: Bulk type
<> 144:ef7eb2e8f9f7 1109 * @arg EP_TYPE_INTR: Interrupt type
<> 144:ef7eb2e8f9f7 1110 * @param mps : Max Packet Size
<> 144:ef7eb2e8f9f7 1111 * This parameter can be a value from 0 to32K
<> 144:ef7eb2e8f9f7 1112 * @retval HAL state
<> 144:ef7eb2e8f9f7 1113 */
<> 144:ef7eb2e8f9f7 1114 HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx,
<> 144:ef7eb2e8f9f7 1115 uint8_t ch_num,
<> 144:ef7eb2e8f9f7 1116 uint8_t epnum,
<> 144:ef7eb2e8f9f7 1117 uint8_t dev_address,
<> 144:ef7eb2e8f9f7 1118 uint8_t speed,
<> 144:ef7eb2e8f9f7 1119 uint8_t ep_type,
<> 144:ef7eb2e8f9f7 1120 uint16_t mps)
<> 144:ef7eb2e8f9f7 1121 {
<> 144:ef7eb2e8f9f7 1122 /* Clear old interrupt conditions for this host channel. */
<> 144:ef7eb2e8f9f7 1123 USBx_HC(ch_num)->HCINT = 0xFFFFFFFF;
<> 144:ef7eb2e8f9f7 1124
<> 144:ef7eb2e8f9f7 1125 /* Enable channel interrupts required for this transfer. */
<> 144:ef7eb2e8f9f7 1126 switch (ep_type)
<> 144:ef7eb2e8f9f7 1127 {
<> 144:ef7eb2e8f9f7 1128 case EP_TYPE_CTRL:
<> 144:ef7eb2e8f9f7 1129 case EP_TYPE_BULK:
<> 144:ef7eb2e8f9f7 1130 USBx_HC(ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM |\
<> 144:ef7eb2e8f9f7 1131 USB_OTG_HCINTMSK_STALLM |\
<> 144:ef7eb2e8f9f7 1132 USB_OTG_HCINTMSK_TXERRM |\
<> 144:ef7eb2e8f9f7 1133 USB_OTG_HCINTMSK_DTERRM |\
<> 144:ef7eb2e8f9f7 1134 USB_OTG_HCINTMSK_AHBERR |\
<> 144:ef7eb2e8f9f7 1135 USB_OTG_HCINTMSK_NAKM ;
<> 144:ef7eb2e8f9f7 1136
<> 144:ef7eb2e8f9f7 1137 if (epnum & 0x80)
<> 144:ef7eb2e8f9f7 1138 {
<> 144:ef7eb2e8f9f7 1139 USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;
<> 144:ef7eb2e8f9f7 1140 }
<> 144:ef7eb2e8f9f7 1141 break;
<> 144:ef7eb2e8f9f7 1142
<> 144:ef7eb2e8f9f7 1143 case EP_TYPE_INTR:
<> 144:ef7eb2e8f9f7 1144 USBx_HC(ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM |\
<> 144:ef7eb2e8f9f7 1145 USB_OTG_HCINTMSK_STALLM |\
<> 144:ef7eb2e8f9f7 1146 USB_OTG_HCINTMSK_TXERRM |\
<> 144:ef7eb2e8f9f7 1147 USB_OTG_HCINTMSK_DTERRM |\
<> 144:ef7eb2e8f9f7 1148 USB_OTG_HCINTMSK_NAKM |\
<> 144:ef7eb2e8f9f7 1149 USB_OTG_HCINTMSK_AHBERR |\
<> 144:ef7eb2e8f9f7 1150 USB_OTG_HCINTMSK_FRMORM ;
<> 144:ef7eb2e8f9f7 1151
<> 144:ef7eb2e8f9f7 1152 if (epnum & 0x80)
<> 144:ef7eb2e8f9f7 1153 {
<> 144:ef7eb2e8f9f7 1154 USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;
<> 144:ef7eb2e8f9f7 1155 }
<> 144:ef7eb2e8f9f7 1156
<> 144:ef7eb2e8f9f7 1157 break;
<> 144:ef7eb2e8f9f7 1158
<> 144:ef7eb2e8f9f7 1159 case EP_TYPE_ISOC:
<> 144:ef7eb2e8f9f7 1160 USBx_HC(ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM |\
<> 144:ef7eb2e8f9f7 1161 USB_OTG_HCINTMSK_ACKM |\
<> 144:ef7eb2e8f9f7 1162 USB_OTG_HCINTMSK_AHBERR |\
<> 144:ef7eb2e8f9f7 1163 USB_OTG_HCINTMSK_FRMORM ;
<> 144:ef7eb2e8f9f7 1164
<> 144:ef7eb2e8f9f7 1165 if (epnum & 0x80)
<> 144:ef7eb2e8f9f7 1166 {
<> 144:ef7eb2e8f9f7 1167 USBx_HC(ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_TXERRM | USB_OTG_HCINTMSK_BBERRM);
<> 144:ef7eb2e8f9f7 1168 }
<> 144:ef7eb2e8f9f7 1169 break;
<> 144:ef7eb2e8f9f7 1170 }
<> 144:ef7eb2e8f9f7 1171
<> 144:ef7eb2e8f9f7 1172 /* Enable the top level host channel interrupt. */
<> 144:ef7eb2e8f9f7 1173 USBx_HOST->HAINTMSK |= (1 << ch_num);
<> 144:ef7eb2e8f9f7 1174
<> 144:ef7eb2e8f9f7 1175 /* Make sure host channel interrupts are enabled. */
<> 144:ef7eb2e8f9f7 1176 USBx->GINTMSK |= USB_OTG_GINTMSK_HCIM;
<> 144:ef7eb2e8f9f7 1177
<> 144:ef7eb2e8f9f7 1178 /* Program the HCCHAR register */
<> 144:ef7eb2e8f9f7 1179 USBx_HC(ch_num)->HCCHAR = (((dev_address << 22) & USB_OTG_HCCHAR_DAD) |\
<> 144:ef7eb2e8f9f7 1180 (((epnum & 0x7F)<< 11) & USB_OTG_HCCHAR_EPNUM)|\
<> 144:ef7eb2e8f9f7 1181 ((((epnum & 0x80) == 0x80)<< 15) & USB_OTG_HCCHAR_EPDIR)|\
<> 144:ef7eb2e8f9f7 1182 (((speed == HPRT0_PRTSPD_LOW_SPEED)<< 17) & USB_OTG_HCCHAR_LSDEV)|\
<> 144:ef7eb2e8f9f7 1183 ((ep_type << 18) & USB_OTG_HCCHAR_EPTYP)|\
<> 144:ef7eb2e8f9f7 1184 (mps & USB_OTG_HCCHAR_MPSIZ));
<> 144:ef7eb2e8f9f7 1185
<> 144:ef7eb2e8f9f7 1186 if (ep_type == EP_TYPE_INTR)
<> 144:ef7eb2e8f9f7 1187 {
<> 144:ef7eb2e8f9f7 1188 USBx_HC(ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM ;
<> 144:ef7eb2e8f9f7 1189 }
<> 144:ef7eb2e8f9f7 1190
<> 144:ef7eb2e8f9f7 1191 return HAL_OK;
<> 144:ef7eb2e8f9f7 1192 }
<> 144:ef7eb2e8f9f7 1193
<> 144:ef7eb2e8f9f7 1194 /**
<> 144:ef7eb2e8f9f7 1195 * @brief Start a transfer over a host channel
<> 144:ef7eb2e8f9f7 1196 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1197 * @param hc : pointer to host channel structure
<> 144:ef7eb2e8f9f7 1198 * @retval HAL state
<> 144:ef7eb2e8f9f7 1199 */
<> 144:ef7eb2e8f9f7 1200 #if defined (__CC_ARM) /*!< ARM Compiler */
<> 144:ef7eb2e8f9f7 1201 #pragma O0
<> 144:ef7eb2e8f9f7 1202 #elif defined (__GNUC__) /*!< GNU Compiler */
<> 144:ef7eb2e8f9f7 1203 #pragma GCC optimize ("O0")
<> 144:ef7eb2e8f9f7 1204 #endif /* __CC_ARM */
<> 144:ef7eb2e8f9f7 1205 HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc)
<> 144:ef7eb2e8f9f7 1206 {
<> 144:ef7eb2e8f9f7 1207 uint8_t is_oddframe = 0;
<> 144:ef7eb2e8f9f7 1208 uint16_t len_words = 0;
<> 144:ef7eb2e8f9f7 1209 uint16_t num_packets = 0;
<> 144:ef7eb2e8f9f7 1210 uint16_t max_hc_pkt_count = 256;
<> 144:ef7eb2e8f9f7 1211 uint32_t tmpreg = 0;
<> 144:ef7eb2e8f9f7 1212
<> 144:ef7eb2e8f9f7 1213 /* Compute the expected number of packets associated to the transfer */
<> 144:ef7eb2e8f9f7 1214 if (hc->xfer_len > 0)
<> 144:ef7eb2e8f9f7 1215 {
<> 144:ef7eb2e8f9f7 1216 num_packets = (hc->xfer_len + hc->max_packet - 1) / hc->max_packet;
<> 144:ef7eb2e8f9f7 1217
<> 144:ef7eb2e8f9f7 1218 if (num_packets > max_hc_pkt_count)
<> 144:ef7eb2e8f9f7 1219 {
<> 144:ef7eb2e8f9f7 1220 num_packets = max_hc_pkt_count;
<> 144:ef7eb2e8f9f7 1221 hc->xfer_len = num_packets * hc->max_packet;
<> 144:ef7eb2e8f9f7 1222 }
<> 144:ef7eb2e8f9f7 1223 }
<> 144:ef7eb2e8f9f7 1224 else
<> 144:ef7eb2e8f9f7 1225 {
<> 144:ef7eb2e8f9f7 1226 num_packets = 1;
<> 144:ef7eb2e8f9f7 1227 }
<> 144:ef7eb2e8f9f7 1228 if (hc->ep_is_in)
<> 144:ef7eb2e8f9f7 1229 {
<> 144:ef7eb2e8f9f7 1230 hc->xfer_len = num_packets * hc->max_packet;
<> 144:ef7eb2e8f9f7 1231 }
<> 144:ef7eb2e8f9f7 1232
<> 144:ef7eb2e8f9f7 1233 /* Initialize the HCTSIZn register */
<> 144:ef7eb2e8f9f7 1234 USBx_HC(hc->ch_num)->HCTSIZ = (((hc->xfer_len) & USB_OTG_HCTSIZ_XFRSIZ)) |\
<> 144:ef7eb2e8f9f7 1235 ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) |\
<> 144:ef7eb2e8f9f7 1236 (((hc->data_pid) << 29) & USB_OTG_HCTSIZ_DPID);
<> 144:ef7eb2e8f9f7 1237
<> 144:ef7eb2e8f9f7 1238 is_oddframe = (USBx_HOST->HFNUM & 0x01) ? 0 : 1;
<> 144:ef7eb2e8f9f7 1239 USBx_HC(hc->ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM;
<> 144:ef7eb2e8f9f7 1240 USBx_HC(hc->ch_num)->HCCHAR |= (is_oddframe << 29);
<> 144:ef7eb2e8f9f7 1241
<> 144:ef7eb2e8f9f7 1242 /* Set host channel enable */
<> 144:ef7eb2e8f9f7 1243 tmpreg = USBx_HC(hc->ch_num)->HCCHAR;
<> 144:ef7eb2e8f9f7 1244 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
<> 144:ef7eb2e8f9f7 1245 tmpreg |= USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1246 USBx_HC(hc->ch_num)->HCCHAR = tmpreg;
<> 144:ef7eb2e8f9f7 1247
<> 144:ef7eb2e8f9f7 1248 if((hc->ep_is_in == 0) && (hc->xfer_len > 0))
<> 144:ef7eb2e8f9f7 1249 {
<> 144:ef7eb2e8f9f7 1250 switch(hc->ep_type)
<> 144:ef7eb2e8f9f7 1251 {
<> 144:ef7eb2e8f9f7 1252 /* Non periodic transfer */
<> 144:ef7eb2e8f9f7 1253 case EP_TYPE_CTRL:
<> 144:ef7eb2e8f9f7 1254 case EP_TYPE_BULK:
<> 144:ef7eb2e8f9f7 1255 len_words = (hc->xfer_len + 3) / 4;
<> 144:ef7eb2e8f9f7 1256
<> 144:ef7eb2e8f9f7 1257 /* check if there is enough space in FIFO space */
<> 144:ef7eb2e8f9f7 1258 if(len_words > (USBx->HNPTXSTS & 0xFFFF))
<> 144:ef7eb2e8f9f7 1259 {
<> 144:ef7eb2e8f9f7 1260 /* need to process data in nptxfempty interrupt */
<> 144:ef7eb2e8f9f7 1261 USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM;
<> 144:ef7eb2e8f9f7 1262 }
<> 144:ef7eb2e8f9f7 1263 break;
<> 144:ef7eb2e8f9f7 1264
<> 144:ef7eb2e8f9f7 1265 /* Periodic transfer */
<> 144:ef7eb2e8f9f7 1266 case EP_TYPE_INTR:
<> 144:ef7eb2e8f9f7 1267 case EP_TYPE_ISOC:
<> 144:ef7eb2e8f9f7 1268 len_words = (hc->xfer_len + 3) / 4;
<> 144:ef7eb2e8f9f7 1269 /* check if there is enough space in FIFO space */
<> 144:ef7eb2e8f9f7 1270 if(len_words > (USBx_HOST->HPTXSTS & 0xFFFF)) /* split the transfer */
<> 144:ef7eb2e8f9f7 1271 {
<> 144:ef7eb2e8f9f7 1272 /* need to process data in ptxfempty interrupt */
<> 144:ef7eb2e8f9f7 1273 USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM;
<> 144:ef7eb2e8f9f7 1274 }
<> 144:ef7eb2e8f9f7 1275 break;
<> 144:ef7eb2e8f9f7 1276
<> 144:ef7eb2e8f9f7 1277 default:
<> 144:ef7eb2e8f9f7 1278 break;
<> 144:ef7eb2e8f9f7 1279 }
<> 144:ef7eb2e8f9f7 1280
<> 144:ef7eb2e8f9f7 1281 /* Write packet into the Tx FIFO. */
<> 144:ef7eb2e8f9f7 1282 USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len);
<> 144:ef7eb2e8f9f7 1283 }
<> 144:ef7eb2e8f9f7 1284
<> 144:ef7eb2e8f9f7 1285 return HAL_OK;
<> 144:ef7eb2e8f9f7 1286 }
<> 144:ef7eb2e8f9f7 1287
<> 144:ef7eb2e8f9f7 1288 /**
<> 144:ef7eb2e8f9f7 1289 * @brief Read all host channel interrupts status
<> 144:ef7eb2e8f9f7 1290 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1291 * @retval HAL state
<> 144:ef7eb2e8f9f7 1292 */
<> 144:ef7eb2e8f9f7 1293 uint32_t USB_HC_ReadInterrupt (USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 1294 {
<> 144:ef7eb2e8f9f7 1295 return ((USBx_HOST->HAINT) & 0xFFFF);
<> 144:ef7eb2e8f9f7 1296 }
<> 144:ef7eb2e8f9f7 1297
<> 144:ef7eb2e8f9f7 1298 /**
<> 144:ef7eb2e8f9f7 1299 * @brief Halt a host channel
<> 144:ef7eb2e8f9f7 1300 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1301 * @param hc_num : Host Channel number
<> 144:ef7eb2e8f9f7 1302 * This parameter can be a value from 1 to 15
<> 144:ef7eb2e8f9f7 1303 * @retval HAL state
<> 144:ef7eb2e8f9f7 1304 */
<> 144:ef7eb2e8f9f7 1305 HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx , uint8_t hc_num)
<> 144:ef7eb2e8f9f7 1306 {
<> 144:ef7eb2e8f9f7 1307 uint32_t count = 0;
<> 144:ef7eb2e8f9f7 1308
<> 144:ef7eb2e8f9f7 1309 /* Check for space in the request queue to issue the halt. */
<> 144:ef7eb2e8f9f7 1310 if (((USBx_HC(hc_num)->HCCHAR) & (HCCHAR_CTRL << 18)) || ((USBx_HC(hc_num)->HCCHAR) & (HCCHAR_BULK << 18)))
<> 144:ef7eb2e8f9f7 1311 {
<> 144:ef7eb2e8f9f7 1312 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHDIS;
<> 144:ef7eb2e8f9f7 1313
<> 144:ef7eb2e8f9f7 1314 if ((USBx->HNPTXSTS & 0xFFFF) == 0)
<> 144:ef7eb2e8f9f7 1315 {
<> 144:ef7eb2e8f9f7 1316 USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1317 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1318 USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_EPDIR;
<> 144:ef7eb2e8f9f7 1319 do
<> 144:ef7eb2e8f9f7 1320 {
<> 144:ef7eb2e8f9f7 1321 if (++count > 1000)
<> 144:ef7eb2e8f9f7 1322 {
<> 144:ef7eb2e8f9f7 1323 break;
<> 144:ef7eb2e8f9f7 1324 }
<> 144:ef7eb2e8f9f7 1325 }
<> 144:ef7eb2e8f9f7 1326 while ((USBx_HC(hc_num)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA);
<> 144:ef7eb2e8f9f7 1327 }
<> 144:ef7eb2e8f9f7 1328 else
<> 144:ef7eb2e8f9f7 1329 {
<> 144:ef7eb2e8f9f7 1330 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1331 }
<> 144:ef7eb2e8f9f7 1332 }
<> 144:ef7eb2e8f9f7 1333 else
<> 144:ef7eb2e8f9f7 1334 {
<> 144:ef7eb2e8f9f7 1335 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHDIS;
<> 144:ef7eb2e8f9f7 1336
<> 144:ef7eb2e8f9f7 1337 if ((USBx_HOST->HPTXSTS & 0xFFFF) == 0)
<> 144:ef7eb2e8f9f7 1338 {
<> 144:ef7eb2e8f9f7 1339 USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1340 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1341 USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_EPDIR;
<> 144:ef7eb2e8f9f7 1342 do
<> 144:ef7eb2e8f9f7 1343 {
<> 144:ef7eb2e8f9f7 1344 if (++count > 1000)
<> 144:ef7eb2e8f9f7 1345 {
<> 144:ef7eb2e8f9f7 1346 break;
<> 144:ef7eb2e8f9f7 1347 }
<> 144:ef7eb2e8f9f7 1348 }
<> 144:ef7eb2e8f9f7 1349 while ((USBx_HC(hc_num)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA);
<> 144:ef7eb2e8f9f7 1350 }
<> 144:ef7eb2e8f9f7 1351 else
<> 144:ef7eb2e8f9f7 1352 {
<> 144:ef7eb2e8f9f7 1353 USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1354 }
<> 144:ef7eb2e8f9f7 1355 }
<> 144:ef7eb2e8f9f7 1356
<> 144:ef7eb2e8f9f7 1357 return HAL_OK;
<> 144:ef7eb2e8f9f7 1358 }
<> 144:ef7eb2e8f9f7 1359
<> 144:ef7eb2e8f9f7 1360 /**
<> 144:ef7eb2e8f9f7 1361 * @brief Initiate Do Ping protocol
<> 144:ef7eb2e8f9f7 1362 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1363 * @param hc_num : Host Channel number
<> 144:ef7eb2e8f9f7 1364 * This parameter can be a value from 1 to 15
<> 144:ef7eb2e8f9f7 1365 * @retval HAL state
<> 144:ef7eb2e8f9f7 1366 */
<> 144:ef7eb2e8f9f7 1367 HAL_StatusTypeDef USB_DoPing(USB_OTG_GlobalTypeDef *USBx , uint8_t ch_num)
<> 144:ef7eb2e8f9f7 1368 {
<> 144:ef7eb2e8f9f7 1369 uint8_t num_packets = 1;
<> 144:ef7eb2e8f9f7 1370 uint32_t tmpreg = 0;
<> 144:ef7eb2e8f9f7 1371
<> 144:ef7eb2e8f9f7 1372 USBx_HC(ch_num)->HCTSIZ = ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) |\
<> 144:ef7eb2e8f9f7 1373 USB_OTG_HCTSIZ_DOPING;
<> 144:ef7eb2e8f9f7 1374
<> 144:ef7eb2e8f9f7 1375 /* Set host channel enable */
<> 144:ef7eb2e8f9f7 1376 tmpreg = USBx_HC(ch_num)->HCCHAR;
<> 144:ef7eb2e8f9f7 1377 tmpreg &= ~USB_OTG_HCCHAR_CHDIS;
<> 144:ef7eb2e8f9f7 1378 tmpreg |= USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1379 USBx_HC(ch_num)->HCCHAR = tmpreg;
<> 144:ef7eb2e8f9f7 1380
<> 144:ef7eb2e8f9f7 1381 return HAL_OK;
<> 144:ef7eb2e8f9f7 1382 }
<> 144:ef7eb2e8f9f7 1383
<> 144:ef7eb2e8f9f7 1384 /**
<> 144:ef7eb2e8f9f7 1385 * @brief Stop Host Core
<> 144:ef7eb2e8f9f7 1386 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1387 * @retval HAL state
<> 144:ef7eb2e8f9f7 1388 */
<> 144:ef7eb2e8f9f7 1389 HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 1390 {
<> 144:ef7eb2e8f9f7 1391 uint8_t index;
<> 144:ef7eb2e8f9f7 1392 uint32_t count = 0;
<> 144:ef7eb2e8f9f7 1393 uint32_t value = 0;
<> 144:ef7eb2e8f9f7 1394
<> 144:ef7eb2e8f9f7 1395 USB_DisableGlobalInt(USBx);
<> 144:ef7eb2e8f9f7 1396
<> 144:ef7eb2e8f9f7 1397 /* Flush FIFO */
<> 144:ef7eb2e8f9f7 1398 USB_FlushTxFifo(USBx, 0x10);
<> 144:ef7eb2e8f9f7 1399 USB_FlushRxFifo(USBx);
<> 144:ef7eb2e8f9f7 1400
<> 144:ef7eb2e8f9f7 1401 /* Flush out any leftover queued requests. */
<> 144:ef7eb2e8f9f7 1402 for (index = 0; index <= 15; index++)
<> 144:ef7eb2e8f9f7 1403 {
<> 144:ef7eb2e8f9f7 1404 value = USBx_HC(index)->HCCHAR;
<> 144:ef7eb2e8f9f7 1405 value |= USB_OTG_HCCHAR_CHDIS;
<> 144:ef7eb2e8f9f7 1406 value &= ~USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1407 value &= ~USB_OTG_HCCHAR_EPDIR;
<> 144:ef7eb2e8f9f7 1408 USBx_HC(index)->HCCHAR = value;
<> 144:ef7eb2e8f9f7 1409 }
<> 144:ef7eb2e8f9f7 1410
<> 144:ef7eb2e8f9f7 1411 /* Halt all channels to put them into a known state. */
<> 144:ef7eb2e8f9f7 1412 for (index = 0; index <= 15; index++)
<> 144:ef7eb2e8f9f7 1413 {
<> 144:ef7eb2e8f9f7 1414 value = USBx_HC(index)->HCCHAR ;
<> 144:ef7eb2e8f9f7 1415 value |= USB_OTG_HCCHAR_CHDIS;
<> 144:ef7eb2e8f9f7 1416 value |= USB_OTG_HCCHAR_CHENA;
<> 144:ef7eb2e8f9f7 1417 value &= ~USB_OTG_HCCHAR_EPDIR;
<> 144:ef7eb2e8f9f7 1418 USBx_HC(index)->HCCHAR = value;
<> 144:ef7eb2e8f9f7 1419
<> 144:ef7eb2e8f9f7 1420 do
<> 144:ef7eb2e8f9f7 1421 {
<> 144:ef7eb2e8f9f7 1422 if (++count > 1000)
<> 144:ef7eb2e8f9f7 1423 {
<> 144:ef7eb2e8f9f7 1424 break;
<> 144:ef7eb2e8f9f7 1425 }
<> 144:ef7eb2e8f9f7 1426 }
<> 144:ef7eb2e8f9f7 1427 while ((USBx_HC(index)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA);
<> 144:ef7eb2e8f9f7 1428 }
<> 144:ef7eb2e8f9f7 1429
<> 144:ef7eb2e8f9f7 1430 /* Clear any pending Host interrupts */
<> 144:ef7eb2e8f9f7 1431 USBx_HOST->HAINT = 0xFFFFFFFF;
<> 144:ef7eb2e8f9f7 1432 USBx->GINTSTS = 0xFFFFFFFF;
<> 144:ef7eb2e8f9f7 1433 USB_EnableGlobalInt(USBx);
<> 144:ef7eb2e8f9f7 1434
<> 144:ef7eb2e8f9f7 1435 return HAL_OK;
<> 144:ef7eb2e8f9f7 1436 }
<> 144:ef7eb2e8f9f7 1437
<> 144:ef7eb2e8f9f7 1438 /**
<> 144:ef7eb2e8f9f7 1439 * @brief USB_ActivateRemoteWakeup : active remote wakeup signalling
<> 144:ef7eb2e8f9f7 1440 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1441 * @retval HAL status
<> 144:ef7eb2e8f9f7 1442 */
<> 144:ef7eb2e8f9f7 1443 HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 1444 {
<> 144:ef7eb2e8f9f7 1445 if((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)
<> 144:ef7eb2e8f9f7 1446 {
<> 144:ef7eb2e8f9f7 1447 /* active Remote wakeup signalling */
<> 144:ef7eb2e8f9f7 1448 USBx_DEVICE->DCTL |= USB_OTG_DCTL_RWUSIG;
<> 144:ef7eb2e8f9f7 1449 }
<> 144:ef7eb2e8f9f7 1450 return HAL_OK;
<> 144:ef7eb2e8f9f7 1451 }
<> 144:ef7eb2e8f9f7 1452
<> 144:ef7eb2e8f9f7 1453 /**
<> 144:ef7eb2e8f9f7 1454 * @brief USB_DeActivateRemoteWakeup : de-active remote wakeup signalling
<> 144:ef7eb2e8f9f7 1455 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1456 * @retval HAL status
<> 144:ef7eb2e8f9f7 1457 */
<> 144:ef7eb2e8f9f7 1458 HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 1459 {
<> 144:ef7eb2e8f9f7 1460 /* active Remote wakeup signalling */
<> 144:ef7eb2e8f9f7 1461 USBx_DEVICE->DCTL &= ~(USB_OTG_DCTL_RWUSIG);
<> 144:ef7eb2e8f9f7 1462 return HAL_OK;
<> 144:ef7eb2e8f9f7 1463 }
<> 144:ef7eb2e8f9f7 1464
<> 144:ef7eb2e8f9f7 1465 #endif /* USB_OTG_FS */
<> 144:ef7eb2e8f9f7 1466
<> 144:ef7eb2e8f9f7 1467 /*==============================================================================
<> 144:ef7eb2e8f9f7 1468 USB Device FS peripheral available on STM32F102xx and STM32F103xx devices
<> 144:ef7eb2e8f9f7 1469 ==============================================================================*/
<> 144:ef7eb2e8f9f7 1470 #if defined (USB)
<> 144:ef7eb2e8f9f7 1471 /**
<> 144:ef7eb2e8f9f7 1472 * @brief Initializes the USB Core
<> 144:ef7eb2e8f9f7 1473 * @param USBx: USB Instance
<> 144:ef7eb2e8f9f7 1474 * @param cfg : pointer to a USB_CfgTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1475 * the configuration information for the specified USBx peripheral.
<> 144:ef7eb2e8f9f7 1476 * @retval HAL status
<> 144:ef7eb2e8f9f7 1477 */
<> 144:ef7eb2e8f9f7 1478 HAL_StatusTypeDef USB_CoreInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg)
<> 144:ef7eb2e8f9f7 1479 {
<> 144:ef7eb2e8f9f7 1480 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 1481 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 1482 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 1483 */
<> 144:ef7eb2e8f9f7 1484 return HAL_OK;
<> 144:ef7eb2e8f9f7 1485 }
<> 144:ef7eb2e8f9f7 1486
<> 144:ef7eb2e8f9f7 1487 /**
<> 144:ef7eb2e8f9f7 1488 * @brief USB_EnableGlobalInt
<> 144:ef7eb2e8f9f7 1489 * Enables the controller's Global Int in the AHB Config reg
<> 144:ef7eb2e8f9f7 1490 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1491 * @retval HAL status
<> 144:ef7eb2e8f9f7 1492 */
<> 144:ef7eb2e8f9f7 1493 HAL_StatusTypeDef USB_EnableGlobalInt(USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 1494 {
<> 144:ef7eb2e8f9f7 1495 uint32_t winterruptmask = 0;
<> 144:ef7eb2e8f9f7 1496
<> 144:ef7eb2e8f9f7 1497 /* Set winterruptmask variable */
<> 144:ef7eb2e8f9f7 1498 winterruptmask = USB_CNTR_CTRM | USB_CNTR_WKUPM | USB_CNTR_SUSPM | USB_CNTR_ERRM \
<> 144:ef7eb2e8f9f7 1499 | USB_CNTR_ESOFM | USB_CNTR_RESETM;
<> 144:ef7eb2e8f9f7 1500
<> 144:ef7eb2e8f9f7 1501 /* Set interrupt mask */
<> 144:ef7eb2e8f9f7 1502 USBx->CNTR |= winterruptmask;
<> 144:ef7eb2e8f9f7 1503
<> 144:ef7eb2e8f9f7 1504 return HAL_OK;
<> 144:ef7eb2e8f9f7 1505 }
<> 144:ef7eb2e8f9f7 1506
<> 144:ef7eb2e8f9f7 1507 /**
<> 144:ef7eb2e8f9f7 1508 * @brief USB_DisableGlobalInt
<> 144:ef7eb2e8f9f7 1509 * Disable the controller's Global Int in the AHB Config reg
<> 144:ef7eb2e8f9f7 1510 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1511 * @retval HAL status
<> 144:ef7eb2e8f9f7 1512 */
<> 144:ef7eb2e8f9f7 1513 HAL_StatusTypeDef USB_DisableGlobalInt(USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 1514 {
<> 144:ef7eb2e8f9f7 1515 uint32_t winterruptmask = 0;
<> 144:ef7eb2e8f9f7 1516
<> 144:ef7eb2e8f9f7 1517 /* Set winterruptmask variable */
<> 144:ef7eb2e8f9f7 1518 winterruptmask = USB_CNTR_CTRM | USB_CNTR_WKUPM | USB_CNTR_SUSPM | USB_CNTR_ERRM \
<> 144:ef7eb2e8f9f7 1519 | USB_CNTR_ESOFM | USB_CNTR_RESETM;
<> 144:ef7eb2e8f9f7 1520
<> 144:ef7eb2e8f9f7 1521 /* Clear interrupt mask */
<> 144:ef7eb2e8f9f7 1522 USBx->CNTR &= ~winterruptmask;
<> 144:ef7eb2e8f9f7 1523
<> 144:ef7eb2e8f9f7 1524 return HAL_OK;
<> 144:ef7eb2e8f9f7 1525 }
<> 144:ef7eb2e8f9f7 1526
<> 144:ef7eb2e8f9f7 1527 /**
<> 144:ef7eb2e8f9f7 1528 * @brief USB_SetCurrentMode : Set functional mode
<> 144:ef7eb2e8f9f7 1529 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1530 * @param mode : current core mode
<> 144:ef7eb2e8f9f7 1531 * This parameter can be one of the these values:
<> 144:ef7eb2e8f9f7 1532 * @arg USB_DEVICE_MODE: Peripheral mode mode
<> 144:ef7eb2e8f9f7 1533 * @retval HAL status
<> 144:ef7eb2e8f9f7 1534 */
<> 144:ef7eb2e8f9f7 1535 HAL_StatusTypeDef USB_SetCurrentMode(USB_TypeDef *USBx , USB_ModeTypeDef mode)
<> 144:ef7eb2e8f9f7 1536 {
<> 144:ef7eb2e8f9f7 1537 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 1538 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 1539 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 1540 */
<> 144:ef7eb2e8f9f7 1541 return HAL_OK;
<> 144:ef7eb2e8f9f7 1542 }
<> 144:ef7eb2e8f9f7 1543
<> 144:ef7eb2e8f9f7 1544 /**
<> 144:ef7eb2e8f9f7 1545 * @brief USB_DevInit : Initializes the USB controller registers
<> 144:ef7eb2e8f9f7 1546 * for device mode
<> 144:ef7eb2e8f9f7 1547 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1548 * @param cfg : pointer to a USB_CfgTypeDef structure that contains
<> 144:ef7eb2e8f9f7 1549 * the configuration information for the specified USBx peripheral.
<> 144:ef7eb2e8f9f7 1550 * @retval HAL status
<> 144:ef7eb2e8f9f7 1551 */
<> 144:ef7eb2e8f9f7 1552 HAL_StatusTypeDef USB_DevInit (USB_TypeDef *USBx, USB_CfgTypeDef cfg)
<> 144:ef7eb2e8f9f7 1553 {
<> 144:ef7eb2e8f9f7 1554 /* Init Device */
<> 144:ef7eb2e8f9f7 1555 /*CNTR_FRES = 1*/
<> 144:ef7eb2e8f9f7 1556 USBx->CNTR = USB_CNTR_FRES;
<> 144:ef7eb2e8f9f7 1557
<> 144:ef7eb2e8f9f7 1558 /*CNTR_FRES = 0*/
<> 144:ef7eb2e8f9f7 1559 USBx->CNTR = 0;
<> 144:ef7eb2e8f9f7 1560
<> 144:ef7eb2e8f9f7 1561 /*Clear pending interrupts*/
<> 144:ef7eb2e8f9f7 1562 USBx->ISTR = 0;
<> 144:ef7eb2e8f9f7 1563
<> 144:ef7eb2e8f9f7 1564 /*Set Btable Address*/
<> 144:ef7eb2e8f9f7 1565 USBx->BTABLE = BTABLE_ADDRESS;
<> 144:ef7eb2e8f9f7 1566
<> 144:ef7eb2e8f9f7 1567 return HAL_OK;
<> 144:ef7eb2e8f9f7 1568 }
<> 144:ef7eb2e8f9f7 1569
<> 144:ef7eb2e8f9f7 1570 /**
<> 144:ef7eb2e8f9f7 1571 * @brief USB_FlushTxFifo : Flush a Tx FIFO
<> 144:ef7eb2e8f9f7 1572 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1573 * @param num : FIFO number
<> 144:ef7eb2e8f9f7 1574 * This parameter can be a value from 1 to 15
<> 144:ef7eb2e8f9f7 1575 15 means Flush all Tx FIFOs
<> 144:ef7eb2e8f9f7 1576 * @retval HAL status
<> 144:ef7eb2e8f9f7 1577 */
<> 144:ef7eb2e8f9f7 1578 HAL_StatusTypeDef USB_FlushTxFifo (USB_TypeDef *USBx, uint32_t num )
<> 144:ef7eb2e8f9f7 1579 {
<> 144:ef7eb2e8f9f7 1580 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 1581 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 1582 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 1583 */
<> 144:ef7eb2e8f9f7 1584 return HAL_OK;
<> 144:ef7eb2e8f9f7 1585 }
<> 144:ef7eb2e8f9f7 1586
<> 144:ef7eb2e8f9f7 1587 /**
<> 144:ef7eb2e8f9f7 1588 * @brief USB_FlushRxFifo : Flush Rx FIFO
<> 144:ef7eb2e8f9f7 1589 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1590 * @retval HAL status
<> 144:ef7eb2e8f9f7 1591 */
<> 144:ef7eb2e8f9f7 1592 HAL_StatusTypeDef USB_FlushRxFifo(USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 1593 {
<> 144:ef7eb2e8f9f7 1594 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 1595 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 1596 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 1597 */
<> 144:ef7eb2e8f9f7 1598 return HAL_OK;
<> 144:ef7eb2e8f9f7 1599 }
<> 144:ef7eb2e8f9f7 1600
<> 144:ef7eb2e8f9f7 1601 /**
<> 144:ef7eb2e8f9f7 1602 * @brief Activate and configure an endpoint
<> 144:ef7eb2e8f9f7 1603 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1604 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 1605 * @retval HAL status
<> 144:ef7eb2e8f9f7 1606 */
<> 144:ef7eb2e8f9f7 1607 HAL_StatusTypeDef USB_ActivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 1608 {
<> 144:ef7eb2e8f9f7 1609 /* initialize Endpoint */
<> 144:ef7eb2e8f9f7 1610 switch (ep->type)
<> 144:ef7eb2e8f9f7 1611 {
<> 144:ef7eb2e8f9f7 1612 case EP_TYPE_CTRL:
<> 144:ef7eb2e8f9f7 1613 PCD_SET_EPTYPE(USBx, ep->num, USB_EP_CONTROL);
<> 144:ef7eb2e8f9f7 1614 break;
<> 144:ef7eb2e8f9f7 1615 case EP_TYPE_BULK:
<> 144:ef7eb2e8f9f7 1616 PCD_SET_EPTYPE(USBx, ep->num, USB_EP_BULK);
<> 144:ef7eb2e8f9f7 1617 break;
<> 144:ef7eb2e8f9f7 1618 case EP_TYPE_INTR:
<> 144:ef7eb2e8f9f7 1619 PCD_SET_EPTYPE(USBx, ep->num, USB_EP_INTERRUPT);
<> 144:ef7eb2e8f9f7 1620 break;
<> 144:ef7eb2e8f9f7 1621 case EP_TYPE_ISOC:
<> 144:ef7eb2e8f9f7 1622 PCD_SET_EPTYPE(USBx, ep->num, USB_EP_ISOCHRONOUS);
<> 144:ef7eb2e8f9f7 1623 break;
<> 144:ef7eb2e8f9f7 1624 default:
<> 144:ef7eb2e8f9f7 1625 break;
<> 144:ef7eb2e8f9f7 1626 }
<> 144:ef7eb2e8f9f7 1627
<> 144:ef7eb2e8f9f7 1628 PCD_SET_EP_ADDRESS(USBx, ep->num, ep->num);
<> 144:ef7eb2e8f9f7 1629
<> 144:ef7eb2e8f9f7 1630 if (ep->doublebuffer == 0)
<> 144:ef7eb2e8f9f7 1631 {
<> 144:ef7eb2e8f9f7 1632 if (ep->is_in)
<> 144:ef7eb2e8f9f7 1633 {
<> 144:ef7eb2e8f9f7 1634 /*Set the endpoint Transmit buffer address */
<> 144:ef7eb2e8f9f7 1635 PCD_SET_EP_TX_ADDRESS(USBx, ep->num, ep->pmaadress);
<> 144:ef7eb2e8f9f7 1636 PCD_CLEAR_TX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1637 /* Configure NAK status for the Endpoint*/
<> 144:ef7eb2e8f9f7 1638 PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK);
<> 144:ef7eb2e8f9f7 1639 }
<> 144:ef7eb2e8f9f7 1640 else
<> 144:ef7eb2e8f9f7 1641 {
<> 144:ef7eb2e8f9f7 1642 /*Set the endpoint Receive buffer address */
<> 144:ef7eb2e8f9f7 1643 PCD_SET_EP_RX_ADDRESS(USBx, ep->num, ep->pmaadress);
<> 144:ef7eb2e8f9f7 1644 /*Set the endpoint Receive buffer counter*/
<> 144:ef7eb2e8f9f7 1645 PCD_SET_EP_RX_CNT(USBx, ep->num, ep->maxpacket);
<> 144:ef7eb2e8f9f7 1646 PCD_CLEAR_RX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1647 /* Configure VALID status for the Endpoint*/
<> 144:ef7eb2e8f9f7 1648 PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);
<> 144:ef7eb2e8f9f7 1649 }
<> 144:ef7eb2e8f9f7 1650 }
<> 144:ef7eb2e8f9f7 1651 /*Double Buffer*/
<> 144:ef7eb2e8f9f7 1652 else
<> 144:ef7eb2e8f9f7 1653 {
<> 144:ef7eb2e8f9f7 1654 /*Set the endpoint as double buffered*/
<> 144:ef7eb2e8f9f7 1655 PCD_SET_EP_DBUF(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1656 /*Set buffer address for double buffered mode*/
<> 144:ef7eb2e8f9f7 1657 PCD_SET_EP_DBUF_ADDR(USBx, ep->num,ep->pmaaddr0, ep->pmaaddr1);
<> 144:ef7eb2e8f9f7 1658
<> 144:ef7eb2e8f9f7 1659 if (ep->is_in==0)
<> 144:ef7eb2e8f9f7 1660 {
<> 144:ef7eb2e8f9f7 1661 /* Clear the data toggle bits for the endpoint IN/OUT*/
<> 144:ef7eb2e8f9f7 1662 PCD_CLEAR_RX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1663 PCD_CLEAR_TX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1664
<> 144:ef7eb2e8f9f7 1665 /* Reset value of the data toggle bits for the endpoint out*/
<> 144:ef7eb2e8f9f7 1666 PCD_TX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1667
<> 144:ef7eb2e8f9f7 1668 PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);
<> 144:ef7eb2e8f9f7 1669 PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);
<> 144:ef7eb2e8f9f7 1670 }
<> 144:ef7eb2e8f9f7 1671 else
<> 144:ef7eb2e8f9f7 1672 {
<> 144:ef7eb2e8f9f7 1673 /* Clear the data toggle bits for the endpoint IN/OUT*/
<> 144:ef7eb2e8f9f7 1674 PCD_CLEAR_RX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1675 PCD_CLEAR_TX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1676 PCD_RX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1677 /* Configure DISABLE status for the Endpoint*/
<> 144:ef7eb2e8f9f7 1678 PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);
<> 144:ef7eb2e8f9f7 1679 PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);
<> 144:ef7eb2e8f9f7 1680 }
<> 144:ef7eb2e8f9f7 1681 }
<> 144:ef7eb2e8f9f7 1682
<> 144:ef7eb2e8f9f7 1683 return HAL_OK;
<> 144:ef7eb2e8f9f7 1684 }
<> 144:ef7eb2e8f9f7 1685
<> 144:ef7eb2e8f9f7 1686 /**
<> 144:ef7eb2e8f9f7 1687 * @brief De-activate and de-initialize an endpoint
<> 144:ef7eb2e8f9f7 1688 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1689 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 1690 * @retval HAL status
<> 144:ef7eb2e8f9f7 1691 */
<> 144:ef7eb2e8f9f7 1692 HAL_StatusTypeDef USB_DeactivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 1693 {
<> 144:ef7eb2e8f9f7 1694 if (ep->doublebuffer == 0)
<> 144:ef7eb2e8f9f7 1695 {
<> 144:ef7eb2e8f9f7 1696 if (ep->is_in)
<> 144:ef7eb2e8f9f7 1697 {
<> 144:ef7eb2e8f9f7 1698 PCD_CLEAR_TX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1699 /* Configure DISABLE status for the Endpoint*/
<> 144:ef7eb2e8f9f7 1700 PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);
<> 144:ef7eb2e8f9f7 1701 }
<> 144:ef7eb2e8f9f7 1702 else
<> 144:ef7eb2e8f9f7 1703 {
<> 144:ef7eb2e8f9f7 1704 PCD_CLEAR_RX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1705 /* Configure DISABLE status for the Endpoint*/
<> 144:ef7eb2e8f9f7 1706 PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);
<> 144:ef7eb2e8f9f7 1707 }
<> 144:ef7eb2e8f9f7 1708 }
<> 144:ef7eb2e8f9f7 1709 /*Double Buffer*/
<> 144:ef7eb2e8f9f7 1710 else
<> 144:ef7eb2e8f9f7 1711 {
<> 144:ef7eb2e8f9f7 1712 if (ep->is_in==0)
<> 144:ef7eb2e8f9f7 1713 {
<> 144:ef7eb2e8f9f7 1714 /* Clear the data toggle bits for the endpoint IN/OUT*/
<> 144:ef7eb2e8f9f7 1715 PCD_CLEAR_RX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1716 PCD_CLEAR_TX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1717
<> 144:ef7eb2e8f9f7 1718 /* Reset value of the data toggle bits for the endpoint out*/
<> 144:ef7eb2e8f9f7 1719 PCD_TX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1720
<> 144:ef7eb2e8f9f7 1721 PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);
<> 144:ef7eb2e8f9f7 1722 PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);
<> 144:ef7eb2e8f9f7 1723 }
<> 144:ef7eb2e8f9f7 1724 else
<> 144:ef7eb2e8f9f7 1725 {
<> 144:ef7eb2e8f9f7 1726 /* Clear the data toggle bits for the endpoint IN/OUT*/
<> 144:ef7eb2e8f9f7 1727 PCD_CLEAR_RX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1728 PCD_CLEAR_TX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1729 PCD_RX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1730 /* Configure DISABLE status for the Endpoint*/
<> 144:ef7eb2e8f9f7 1731 PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);
<> 144:ef7eb2e8f9f7 1732 PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);
<> 144:ef7eb2e8f9f7 1733 }
<> 144:ef7eb2e8f9f7 1734 }
<> 144:ef7eb2e8f9f7 1735
<> 144:ef7eb2e8f9f7 1736 return HAL_OK;
<> 144:ef7eb2e8f9f7 1737 }
<> 144:ef7eb2e8f9f7 1738
<> 144:ef7eb2e8f9f7 1739 /**
<> 144:ef7eb2e8f9f7 1740 * @brief USB_EPStartXfer : setup and starts a transfer over an EP
<> 144:ef7eb2e8f9f7 1741 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1742 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 1743 * @retval HAL status
<> 144:ef7eb2e8f9f7 1744 */
<> 144:ef7eb2e8f9f7 1745 HAL_StatusTypeDef USB_EPStartXfer(USB_TypeDef *USBx , USB_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 1746 {
<> 144:ef7eb2e8f9f7 1747 uint16_t pmabuffer = 0;
<> 144:ef7eb2e8f9f7 1748 uint32_t len = ep->xfer_len;
<> 144:ef7eb2e8f9f7 1749
<> 144:ef7eb2e8f9f7 1750 /* IN endpoint */
<> 144:ef7eb2e8f9f7 1751 if (ep->is_in == 1)
<> 144:ef7eb2e8f9f7 1752 {
<> 144:ef7eb2e8f9f7 1753 /*Multi packet transfer*/
<> 144:ef7eb2e8f9f7 1754 if (ep->xfer_len > ep->maxpacket)
<> 144:ef7eb2e8f9f7 1755 {
<> 144:ef7eb2e8f9f7 1756 len=ep->maxpacket;
<> 144:ef7eb2e8f9f7 1757 ep->xfer_len-=len;
<> 144:ef7eb2e8f9f7 1758 }
<> 144:ef7eb2e8f9f7 1759 else
<> 144:ef7eb2e8f9f7 1760 {
<> 144:ef7eb2e8f9f7 1761 len=ep->xfer_len;
<> 144:ef7eb2e8f9f7 1762 ep->xfer_len =0;
<> 144:ef7eb2e8f9f7 1763 }
<> 144:ef7eb2e8f9f7 1764
<> 144:ef7eb2e8f9f7 1765 /* configure and validate Tx endpoint */
<> 144:ef7eb2e8f9f7 1766 if (ep->doublebuffer == 0)
<> 144:ef7eb2e8f9f7 1767 {
<> 144:ef7eb2e8f9f7 1768 USB_WritePMA(USBx, ep->xfer_buff, ep->pmaadress, len);
<> 144:ef7eb2e8f9f7 1769 PCD_SET_EP_TX_CNT(USBx, ep->num, len);
<> 144:ef7eb2e8f9f7 1770 }
<> 144:ef7eb2e8f9f7 1771 else
<> 144:ef7eb2e8f9f7 1772 {
<> 144:ef7eb2e8f9f7 1773 /* Write the data to the USB endpoint */
<> 144:ef7eb2e8f9f7 1774 if (PCD_GET_ENDPOINT(USBx, ep->num)& USB_EP_DTOG_TX)
<> 144:ef7eb2e8f9f7 1775 {
<> 144:ef7eb2e8f9f7 1776 /* Set the Double buffer counter for pmabuffer1 */
<> 144:ef7eb2e8f9f7 1777 PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len);
<> 144:ef7eb2e8f9f7 1778 pmabuffer = ep->pmaaddr1;
<> 144:ef7eb2e8f9f7 1779 }
<> 144:ef7eb2e8f9f7 1780 else
<> 144:ef7eb2e8f9f7 1781 {
<> 144:ef7eb2e8f9f7 1782 /* Set the Double buffer counter for pmabuffer0 */
<> 144:ef7eb2e8f9f7 1783 PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len);
<> 144:ef7eb2e8f9f7 1784 pmabuffer = ep->pmaaddr0;
<> 144:ef7eb2e8f9f7 1785 }
<> 144:ef7eb2e8f9f7 1786 USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, len);
<> 144:ef7eb2e8f9f7 1787 PCD_FreeUserBuffer(USBx, ep->num, ep->is_in);
<> 144:ef7eb2e8f9f7 1788 }
<> 144:ef7eb2e8f9f7 1789
<> 144:ef7eb2e8f9f7 1790 PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_VALID);
<> 144:ef7eb2e8f9f7 1791 }
<> 144:ef7eb2e8f9f7 1792 else /* OUT endpoint */
<> 144:ef7eb2e8f9f7 1793 {
<> 144:ef7eb2e8f9f7 1794 /* Multi packet transfer*/
<> 144:ef7eb2e8f9f7 1795 if (ep->xfer_len > ep->maxpacket)
<> 144:ef7eb2e8f9f7 1796 {
<> 144:ef7eb2e8f9f7 1797 len=ep->maxpacket;
<> 144:ef7eb2e8f9f7 1798 ep->xfer_len-=len;
<> 144:ef7eb2e8f9f7 1799 }
<> 144:ef7eb2e8f9f7 1800 else
<> 144:ef7eb2e8f9f7 1801 {
<> 144:ef7eb2e8f9f7 1802 len=ep->xfer_len;
<> 144:ef7eb2e8f9f7 1803 ep->xfer_len =0;
<> 144:ef7eb2e8f9f7 1804 }
<> 144:ef7eb2e8f9f7 1805
<> 144:ef7eb2e8f9f7 1806 /* configure and validate Rx endpoint */
<> 144:ef7eb2e8f9f7 1807 if (ep->doublebuffer == 0)
<> 144:ef7eb2e8f9f7 1808 {
<> 144:ef7eb2e8f9f7 1809 /*Set RX buffer count*/
<> 144:ef7eb2e8f9f7 1810 PCD_SET_EP_RX_CNT(USBx, ep->num, len);
<> 144:ef7eb2e8f9f7 1811 }
<> 144:ef7eb2e8f9f7 1812 else
<> 144:ef7eb2e8f9f7 1813 {
<> 144:ef7eb2e8f9f7 1814 /*Set the Double buffer counter*/
<> 144:ef7eb2e8f9f7 1815 PCD_SET_EP_DBUF_CNT(USBx, ep->num, ep->is_in, len);
<> 144:ef7eb2e8f9f7 1816 }
<> 144:ef7eb2e8f9f7 1817
<> 144:ef7eb2e8f9f7 1818 PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);
<> 144:ef7eb2e8f9f7 1819 }
<> 144:ef7eb2e8f9f7 1820
<> 144:ef7eb2e8f9f7 1821 return HAL_OK;
<> 144:ef7eb2e8f9f7 1822 }
<> 144:ef7eb2e8f9f7 1823
<> 144:ef7eb2e8f9f7 1824 /**
<> 144:ef7eb2e8f9f7 1825 * @brief USB_WritePacket : Writes a packet into the Tx FIFO associated
<> 144:ef7eb2e8f9f7 1826 * with the EP/channel
<> 144:ef7eb2e8f9f7 1827 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1828 * @param src : pointer to source buffer
<> 144:ef7eb2e8f9f7 1829 * @param ch_ep_num : endpoint or host channel number
<> 144:ef7eb2e8f9f7 1830 * @param len : Number of bytes to write
<> 144:ef7eb2e8f9f7 1831 * @retval HAL status
<> 144:ef7eb2e8f9f7 1832 */
<> 144:ef7eb2e8f9f7 1833 HAL_StatusTypeDef USB_WritePacket(USB_TypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len)
<> 144:ef7eb2e8f9f7 1834 {
<> 144:ef7eb2e8f9f7 1835 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 1836 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 1837 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 1838 */
<> 144:ef7eb2e8f9f7 1839 return HAL_OK;
<> 144:ef7eb2e8f9f7 1840 }
<> 144:ef7eb2e8f9f7 1841
<> 144:ef7eb2e8f9f7 1842 /**
<> 144:ef7eb2e8f9f7 1843 * @brief USB_ReadPacket : read a packet from the Tx FIFO associated
<> 144:ef7eb2e8f9f7 1844 * with the EP/channel
<> 144:ef7eb2e8f9f7 1845 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1846 * @param dest : destination pointer
<> 144:ef7eb2e8f9f7 1847 * @param len : Number of bytes to read
<> 144:ef7eb2e8f9f7 1848 * @retval pointer to destination buffer
<> 144:ef7eb2e8f9f7 1849 */
<> 144:ef7eb2e8f9f7 1850 void *USB_ReadPacket(USB_TypeDef *USBx, uint8_t *dest, uint16_t len)
<> 144:ef7eb2e8f9f7 1851 {
<> 144:ef7eb2e8f9f7 1852 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 1853 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 1854 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 1855 */
<> 144:ef7eb2e8f9f7 1856 return ((void *)NULL);
<> 144:ef7eb2e8f9f7 1857 }
<> 144:ef7eb2e8f9f7 1858
<> 144:ef7eb2e8f9f7 1859 /**
<> 144:ef7eb2e8f9f7 1860 * @brief USB_EPSetStall : set a stall condition over an EP
<> 144:ef7eb2e8f9f7 1861 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1862 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 1863 * @retval HAL status
<> 144:ef7eb2e8f9f7 1864 */
<> 144:ef7eb2e8f9f7 1865 HAL_StatusTypeDef USB_EPSetStall(USB_TypeDef *USBx , USB_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 1866 {
<> 144:ef7eb2e8f9f7 1867 if (ep->num == 0)
<> 144:ef7eb2e8f9f7 1868 {
<> 144:ef7eb2e8f9f7 1869 /* This macro sets STALL status for RX & TX*/
<> 144:ef7eb2e8f9f7 1870 PCD_SET_EP_TXRX_STATUS(USBx, ep->num, USB_EP_RX_STALL, USB_EP_TX_STALL);
<> 144:ef7eb2e8f9f7 1871 }
<> 144:ef7eb2e8f9f7 1872 else
<> 144:ef7eb2e8f9f7 1873 {
<> 144:ef7eb2e8f9f7 1874 if (ep->is_in)
<> 144:ef7eb2e8f9f7 1875 {
<> 144:ef7eb2e8f9f7 1876 PCD_SET_EP_TX_STATUS(USBx, ep->num , USB_EP_TX_STALL);
<> 144:ef7eb2e8f9f7 1877 }
<> 144:ef7eb2e8f9f7 1878 else
<> 144:ef7eb2e8f9f7 1879 {
<> 144:ef7eb2e8f9f7 1880 PCD_SET_EP_RX_STATUS(USBx, ep->num , USB_EP_RX_STALL);
<> 144:ef7eb2e8f9f7 1881 }
<> 144:ef7eb2e8f9f7 1882 }
<> 144:ef7eb2e8f9f7 1883 return HAL_OK;
<> 144:ef7eb2e8f9f7 1884 }
<> 144:ef7eb2e8f9f7 1885
<> 144:ef7eb2e8f9f7 1886 /**
<> 144:ef7eb2e8f9f7 1887 * @brief USB_EPClearStall : Clear a stall condition over an EP
<> 144:ef7eb2e8f9f7 1888 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1889 * @param ep: pointer to endpoint structure
<> 144:ef7eb2e8f9f7 1890 * @retval HAL status
<> 144:ef7eb2e8f9f7 1891 */
<> 144:ef7eb2e8f9f7 1892 HAL_StatusTypeDef USB_EPClearStall(USB_TypeDef *USBx, USB_EPTypeDef *ep)
<> 144:ef7eb2e8f9f7 1893 {
<> 144:ef7eb2e8f9f7 1894 if (ep->is_in)
<> 144:ef7eb2e8f9f7 1895 {
<> 144:ef7eb2e8f9f7 1896 PCD_CLEAR_TX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1897 PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_VALID);
<> 144:ef7eb2e8f9f7 1898 }
<> 144:ef7eb2e8f9f7 1899 else
<> 144:ef7eb2e8f9f7 1900 {
<> 144:ef7eb2e8f9f7 1901 PCD_CLEAR_RX_DTOG(USBx, ep->num);
<> 144:ef7eb2e8f9f7 1902 PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);
<> 144:ef7eb2e8f9f7 1903 }
<> 144:ef7eb2e8f9f7 1904 return HAL_OK;
<> 144:ef7eb2e8f9f7 1905 }
<> 144:ef7eb2e8f9f7 1906
<> 144:ef7eb2e8f9f7 1907 /**
<> 144:ef7eb2e8f9f7 1908 * @brief USB_StopDevice : Stop the usb device mode
<> 144:ef7eb2e8f9f7 1909 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1910 * @retval HAL status
<> 144:ef7eb2e8f9f7 1911 */
<> 144:ef7eb2e8f9f7 1912 HAL_StatusTypeDef USB_StopDevice(USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 1913 {
<> 144:ef7eb2e8f9f7 1914 /* disable all interrupts and force USB reset */
<> 144:ef7eb2e8f9f7 1915 USBx->CNTR = USB_CNTR_FRES;
<> 144:ef7eb2e8f9f7 1916
<> 144:ef7eb2e8f9f7 1917 /* clear interrupt status register */
<> 144:ef7eb2e8f9f7 1918 USBx->ISTR = 0;
<> 144:ef7eb2e8f9f7 1919
<> 144:ef7eb2e8f9f7 1920 /* switch-off device */
<> 144:ef7eb2e8f9f7 1921 USBx->CNTR = (USB_CNTR_FRES | USB_CNTR_PDWN);
<> 144:ef7eb2e8f9f7 1922
<> 144:ef7eb2e8f9f7 1923 return HAL_OK;
<> 144:ef7eb2e8f9f7 1924 }
<> 144:ef7eb2e8f9f7 1925
<> 144:ef7eb2e8f9f7 1926 /**
<> 144:ef7eb2e8f9f7 1927 * @brief USB_SetDevAddress : Stop the usb device mode
<> 144:ef7eb2e8f9f7 1928 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1929 * @param address : new device address to be assigned
<> 144:ef7eb2e8f9f7 1930 * This parameter can be a value from 0 to 255
<> 144:ef7eb2e8f9f7 1931 * @retval HAL status
<> 144:ef7eb2e8f9f7 1932 */
<> 144:ef7eb2e8f9f7 1933 HAL_StatusTypeDef USB_SetDevAddress (USB_TypeDef *USBx, uint8_t address)
<> 144:ef7eb2e8f9f7 1934 {
<> 144:ef7eb2e8f9f7 1935 if(address == 0)
<> 144:ef7eb2e8f9f7 1936 {
<> 144:ef7eb2e8f9f7 1937 /* set device address and enable function */
<> 144:ef7eb2e8f9f7 1938 USBx->DADDR = USB_DADDR_EF;
<> 144:ef7eb2e8f9f7 1939 }
<> 144:ef7eb2e8f9f7 1940
<> 144:ef7eb2e8f9f7 1941 return HAL_OK;
<> 144:ef7eb2e8f9f7 1942 }
<> 144:ef7eb2e8f9f7 1943
<> 144:ef7eb2e8f9f7 1944 /**
<> 144:ef7eb2e8f9f7 1945 * @brief USB_DevConnect : Connect the USB device by enabling the pull-up/pull-down
<> 144:ef7eb2e8f9f7 1946 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1947 * @retval HAL status
<> 144:ef7eb2e8f9f7 1948 */
<> 144:ef7eb2e8f9f7 1949 HAL_StatusTypeDef USB_DevConnect (USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 1950 {
<> 144:ef7eb2e8f9f7 1951 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 1952 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 1953 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 1954 */
<> 144:ef7eb2e8f9f7 1955 return HAL_OK;
<> 144:ef7eb2e8f9f7 1956 }
<> 144:ef7eb2e8f9f7 1957
<> 144:ef7eb2e8f9f7 1958 /**
<> 144:ef7eb2e8f9f7 1959 * @brief USB_DevDisconnect : Disconnect the USB device by disabling the pull-up/pull-down
<> 144:ef7eb2e8f9f7 1960 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1961 * @retval HAL status
<> 144:ef7eb2e8f9f7 1962 */
<> 144:ef7eb2e8f9f7 1963 HAL_StatusTypeDef USB_DevDisconnect (USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 1964 {
<> 144:ef7eb2e8f9f7 1965 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 1966 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 1967 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 1968 */
<> 144:ef7eb2e8f9f7 1969 return HAL_OK;
<> 144:ef7eb2e8f9f7 1970 }
<> 144:ef7eb2e8f9f7 1971
<> 144:ef7eb2e8f9f7 1972 /**
<> 144:ef7eb2e8f9f7 1973 * @brief USB_ReadInterrupts: return the global USB interrupt status
<> 144:ef7eb2e8f9f7 1974 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1975 * @retval HAL status
<> 144:ef7eb2e8f9f7 1976 */
<> 144:ef7eb2e8f9f7 1977 uint32_t USB_ReadInterrupts (USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 1978 {
<> 144:ef7eb2e8f9f7 1979 uint32_t tmpreg = 0;
<> 144:ef7eb2e8f9f7 1980
<> 144:ef7eb2e8f9f7 1981 tmpreg = USBx->ISTR;
<> 144:ef7eb2e8f9f7 1982 return tmpreg;
<> 144:ef7eb2e8f9f7 1983 }
<> 144:ef7eb2e8f9f7 1984
<> 144:ef7eb2e8f9f7 1985 /**
<> 144:ef7eb2e8f9f7 1986 * @brief USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status
<> 144:ef7eb2e8f9f7 1987 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 1988 * @retval HAL status
<> 144:ef7eb2e8f9f7 1989 */
<> 144:ef7eb2e8f9f7 1990 uint32_t USB_ReadDevAllOutEpInterrupt (USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 1991 {
<> 144:ef7eb2e8f9f7 1992 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 1993 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 1994 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 1995 */
<> 144:ef7eb2e8f9f7 1996 return (0);
<> 144:ef7eb2e8f9f7 1997 }
<> 144:ef7eb2e8f9f7 1998
<> 144:ef7eb2e8f9f7 1999 /**
<> 144:ef7eb2e8f9f7 2000 * @brief USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status
<> 144:ef7eb2e8f9f7 2001 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 2002 * @retval HAL status
<> 144:ef7eb2e8f9f7 2003 */
<> 144:ef7eb2e8f9f7 2004 uint32_t USB_ReadDevAllInEpInterrupt (USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 2005 {
<> 144:ef7eb2e8f9f7 2006 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 2007 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 2008 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 2009 */
<> 144:ef7eb2e8f9f7 2010 return (0);
<> 144:ef7eb2e8f9f7 2011 }
<> 144:ef7eb2e8f9f7 2012
<> 144:ef7eb2e8f9f7 2013 /**
<> 144:ef7eb2e8f9f7 2014 * @brief Returns Device OUT EP Interrupt register
<> 144:ef7eb2e8f9f7 2015 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 2016 * @param epnum : endpoint number
<> 144:ef7eb2e8f9f7 2017 * This parameter can be a value from 0 to 15
<> 144:ef7eb2e8f9f7 2018 * @retval Device OUT EP Interrupt register
<> 144:ef7eb2e8f9f7 2019 */
<> 144:ef7eb2e8f9f7 2020 uint32_t USB_ReadDevOutEPInterrupt (USB_TypeDef *USBx , uint8_t epnum)
<> 144:ef7eb2e8f9f7 2021 {
<> 144:ef7eb2e8f9f7 2022 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 2023 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 2024 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 2025 */
<> 144:ef7eb2e8f9f7 2026 return (0);
<> 144:ef7eb2e8f9f7 2027 }
<> 144:ef7eb2e8f9f7 2028
<> 144:ef7eb2e8f9f7 2029 /**
<> 144:ef7eb2e8f9f7 2030 * @brief Returns Device IN EP Interrupt register
<> 144:ef7eb2e8f9f7 2031 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 2032 * @param epnum : endpoint number
<> 144:ef7eb2e8f9f7 2033 * This parameter can be a value from 0 to 15
<> 144:ef7eb2e8f9f7 2034 * @retval Device IN EP Interrupt register
<> 144:ef7eb2e8f9f7 2035 */
<> 144:ef7eb2e8f9f7 2036 uint32_t USB_ReadDevInEPInterrupt (USB_TypeDef *USBx , uint8_t epnum)
<> 144:ef7eb2e8f9f7 2037 {
<> 144:ef7eb2e8f9f7 2038 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 2039 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 2040 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 2041 */
<> 144:ef7eb2e8f9f7 2042 return (0);
<> 144:ef7eb2e8f9f7 2043 }
<> 144:ef7eb2e8f9f7 2044
<> 144:ef7eb2e8f9f7 2045 /**
<> 144:ef7eb2e8f9f7 2046 * @brief USB_ClearInterrupts: clear a USB interrupt
<> 144:ef7eb2e8f9f7 2047 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 2048 * @param interrupt : interrupt flag
<> 144:ef7eb2e8f9f7 2049 * @retval None
<> 144:ef7eb2e8f9f7 2050 */
<> 144:ef7eb2e8f9f7 2051 void USB_ClearInterrupts (USB_TypeDef *USBx, uint32_t interrupt)
<> 144:ef7eb2e8f9f7 2052 {
<> 144:ef7eb2e8f9f7 2053 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 2054 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 2055 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 2056 */
<> 144:ef7eb2e8f9f7 2057 }
<> 144:ef7eb2e8f9f7 2058
<> 144:ef7eb2e8f9f7 2059 /**
<> 144:ef7eb2e8f9f7 2060 * @brief Prepare the EP0 to start the first control setup
<> 144:ef7eb2e8f9f7 2061 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 2062 * @param psetup : pointer to setup packet
<> 144:ef7eb2e8f9f7 2063 * @retval HAL status
<> 144:ef7eb2e8f9f7 2064 */
<> 144:ef7eb2e8f9f7 2065 HAL_StatusTypeDef USB_EP0_OutStart(USB_TypeDef *USBx, uint8_t *psetup)
<> 144:ef7eb2e8f9f7 2066 {
<> 144:ef7eb2e8f9f7 2067 /* NOTE : - This function is not required by USB Device FS peripheral, it is used
<> 144:ef7eb2e8f9f7 2068 only by USB OTG FS peripheral.
<> 144:ef7eb2e8f9f7 2069 - This function is added to ensure compatibility across platforms.
<> 144:ef7eb2e8f9f7 2070 */
<> 144:ef7eb2e8f9f7 2071 return HAL_OK;
<> 144:ef7eb2e8f9f7 2072 }
<> 144:ef7eb2e8f9f7 2073
<> 144:ef7eb2e8f9f7 2074 /**
<> 144:ef7eb2e8f9f7 2075 * @brief USB_ActivateRemoteWakeup : active remote wakeup signalling
<> 144:ef7eb2e8f9f7 2076 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 2077 * @retval HAL status
<> 144:ef7eb2e8f9f7 2078 */
<> 144:ef7eb2e8f9f7 2079 HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 2080 {
<> 144:ef7eb2e8f9f7 2081 USBx->CNTR |= USB_CNTR_RESUME;
<> 144:ef7eb2e8f9f7 2082
<> 144:ef7eb2e8f9f7 2083 return HAL_OK;
<> 144:ef7eb2e8f9f7 2084 }
<> 144:ef7eb2e8f9f7 2085
<> 144:ef7eb2e8f9f7 2086 /**
<> 144:ef7eb2e8f9f7 2087 * @brief USB_DeActivateRemoteWakeup : de-active remote wakeup signalling
<> 144:ef7eb2e8f9f7 2088 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 2089 * @retval HAL status
<> 144:ef7eb2e8f9f7 2090 */
<> 144:ef7eb2e8f9f7 2091 HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_TypeDef *USBx)
<> 144:ef7eb2e8f9f7 2092 {
<> 144:ef7eb2e8f9f7 2093 USBx->CNTR &= ~(USB_CNTR_RESUME);
<> 144:ef7eb2e8f9f7 2094 return HAL_OK;
<> 144:ef7eb2e8f9f7 2095 }
<> 144:ef7eb2e8f9f7 2096
<> 144:ef7eb2e8f9f7 2097 /**
<> 144:ef7eb2e8f9f7 2098 * @brief Copy a buffer from user memory area to packet memory area (PMA)
<> 144:ef7eb2e8f9f7 2099 * @param USBx : pointer to USB register.
<> 144:ef7eb2e8f9f7 2100 * @param pbUsrBuf : pointer to user memory area.
<> 144:ef7eb2e8f9f7 2101 * @param wPMABufAddr : address into PMA.
<> 144:ef7eb2e8f9f7 2102 * @param wNBytes : number of bytes to be copied.
<> 144:ef7eb2e8f9f7 2103 * @retval None
<> 144:ef7eb2e8f9f7 2104 */
<> 144:ef7eb2e8f9f7 2105 void USB_WritePMA(USB_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
<> 144:ef7eb2e8f9f7 2106 {
<> 144:ef7eb2e8f9f7 2107 uint32_t nbytes = (wNBytes + 1) >> 1; /* nbytes = (wNBytes + 1) / 2 */
<> 144:ef7eb2e8f9f7 2108 uint32_t index = 0, temp1 = 0, temp2 = 0;
<> 144:ef7eb2e8f9f7 2109 uint16_t *pdwVal = NULL;
<> 144:ef7eb2e8f9f7 2110
<> 144:ef7eb2e8f9f7 2111 pdwVal = (uint16_t *)(wPMABufAddr * 2 + (uint32_t)USBx + 0x400);
<> 144:ef7eb2e8f9f7 2112 for (index = nbytes; index != 0; index--)
<> 144:ef7eb2e8f9f7 2113 {
<> 144:ef7eb2e8f9f7 2114 temp1 = (uint16_t) * pbUsrBuf;
<> 144:ef7eb2e8f9f7 2115 pbUsrBuf++;
<> 144:ef7eb2e8f9f7 2116 temp2 = temp1 | (uint16_t) * pbUsrBuf << 8;
<> 144:ef7eb2e8f9f7 2117 *pdwVal++ = temp2;
<> 144:ef7eb2e8f9f7 2118 pdwVal++;
<> 144:ef7eb2e8f9f7 2119 pbUsrBuf++;
<> 144:ef7eb2e8f9f7 2120 }
<> 144:ef7eb2e8f9f7 2121 }
<> 144:ef7eb2e8f9f7 2122
<> 144:ef7eb2e8f9f7 2123 /**
<> 144:ef7eb2e8f9f7 2124 * @brief Copy a buffer from user memory area to packet memory area (PMA)
<> 144:ef7eb2e8f9f7 2125 * @param USBx : pointer to USB register.
<> 144:ef7eb2e8f9f7 2126 * @param pbUsrBuf : pointer to user memory area.
<> 144:ef7eb2e8f9f7 2127 * @param wPMABufAddr : address into PMA.
<> 144:ef7eb2e8f9f7 2128 * @param wNBytes : number of bytes to be copied.
<> 144:ef7eb2e8f9f7 2129 * @retval None
<> 144:ef7eb2e8f9f7 2130 */
<> 144:ef7eb2e8f9f7 2131 void USB_ReadPMA(USB_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
<> 144:ef7eb2e8f9f7 2132 {
<> 144:ef7eb2e8f9f7 2133 uint32_t nbytes = (wNBytes + 1) >> 1;/* /2*/
<> 144:ef7eb2e8f9f7 2134 uint32_t index = 0;
<> 144:ef7eb2e8f9f7 2135 uint32_t *pdwVal = NULL;
<> 144:ef7eb2e8f9f7 2136
<> 144:ef7eb2e8f9f7 2137 pdwVal = (uint32_t *)(wPMABufAddr * 2 + (uint32_t)USBx + 0x400);
<> 144:ef7eb2e8f9f7 2138 for (index = nbytes; index != 0; index--)
<> 144:ef7eb2e8f9f7 2139 {
<> 144:ef7eb2e8f9f7 2140 *(uint16_t*)pbUsrBuf++ = *pdwVal++;
<> 144:ef7eb2e8f9f7 2141 pbUsrBuf++;
<> 144:ef7eb2e8f9f7 2142 }
<> 144:ef7eb2e8f9f7 2143 }
<> 144:ef7eb2e8f9f7 2144
<> 144:ef7eb2e8f9f7 2145 #endif /* USB */
<> 144:ef7eb2e8f9f7 2146
<> 144:ef7eb2e8f9f7 2147 /**
<> 144:ef7eb2e8f9f7 2148 * @}
<> 144:ef7eb2e8f9f7 2149 */
<> 144:ef7eb2e8f9f7 2150 /**
<> 144:ef7eb2e8f9f7 2151 * @}
<> 144:ef7eb2e8f9f7 2152 */
<> 144:ef7eb2e8f9f7 2153
<> 144:ef7eb2e8f9f7 2154 #if defined (USB_OTG_FS)
<> 144:ef7eb2e8f9f7 2155 /** @addtogroup USB_LL_Private_Functions
<> 144:ef7eb2e8f9f7 2156 * @{
<> 144:ef7eb2e8f9f7 2157 */
<> 144:ef7eb2e8f9f7 2158 /**
<> 144:ef7eb2e8f9f7 2159 * @brief Reset the USB Core (needed after USB clock settings change)
<> 144:ef7eb2e8f9f7 2160 * @param USBx : Selected device
<> 144:ef7eb2e8f9f7 2161 * @retval HAL status
<> 144:ef7eb2e8f9f7 2162 */
<> 144:ef7eb2e8f9f7 2163 static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx)
<> 144:ef7eb2e8f9f7 2164 {
<> 144:ef7eb2e8f9f7 2165 uint32_t count = 0;
<> 144:ef7eb2e8f9f7 2166
<> 144:ef7eb2e8f9f7 2167 /* Wait for AHB master IDLE state. */
<> 144:ef7eb2e8f9f7 2168 do
<> 144:ef7eb2e8f9f7 2169 {
<> 144:ef7eb2e8f9f7 2170 if (++count > 200000)
<> 144:ef7eb2e8f9f7 2171 {
<> 144:ef7eb2e8f9f7 2172 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2173 }
<> 144:ef7eb2e8f9f7 2174 }
<> 144:ef7eb2e8f9f7 2175 while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0);
<> 144:ef7eb2e8f9f7 2176
<> 144:ef7eb2e8f9f7 2177 /* Core Soft Reset */
<> 144:ef7eb2e8f9f7 2178 count = 0;
<> 144:ef7eb2e8f9f7 2179 USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST;
<> 144:ef7eb2e8f9f7 2180
<> 144:ef7eb2e8f9f7 2181 do
<> 144:ef7eb2e8f9f7 2182 {
<> 144:ef7eb2e8f9f7 2183 if (++count > 200000)
<> 144:ef7eb2e8f9f7 2184 {
<> 144:ef7eb2e8f9f7 2185 return HAL_TIMEOUT;
<> 144:ef7eb2e8f9f7 2186 }
<> 144:ef7eb2e8f9f7 2187 }
<> 144:ef7eb2e8f9f7 2188 while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST);
<> 144:ef7eb2e8f9f7 2189
<> 144:ef7eb2e8f9f7 2190 return HAL_OK;
<> 144:ef7eb2e8f9f7 2191 }
<> 144:ef7eb2e8f9f7 2192 /**
<> 144:ef7eb2e8f9f7 2193 * @}
<> 144:ef7eb2e8f9f7 2194 */
<> 144:ef7eb2e8f9f7 2195 #endif /* USB_OTG_FS */
<> 144:ef7eb2e8f9f7 2196
<> 144:ef7eb2e8f9f7 2197 #endif /* STM32F102x6 || STM32F102xB || */
<> 144:ef7eb2e8f9f7 2198 /* STM32F103x6 || STM32F103xB || */
<> 144:ef7eb2e8f9f7 2199 /* STM32F103xE || STM32F103xG || */
<> 144:ef7eb2e8f9f7 2200 /* STM32F105xC || STM32F107xC */
<> 144:ef7eb2e8f9f7 2201
<> 144:ef7eb2e8f9f7 2202 #endif /* defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) */
<> 144:ef7eb2e8f9f7 2203
<> 144:ef7eb2e8f9f7 2204 /**
<> 144:ef7eb2e8f9f7 2205 * @}
<> 144:ef7eb2e8f9f7 2206 */
<> 144:ef7eb2e8f9f7 2207
<> 144:ef7eb2e8f9f7 2208 /**
<> 144:ef7eb2e8f9f7 2209 * @}
<> 144:ef7eb2e8f9f7 2210 */
<> 144:ef7eb2e8f9f7 2211 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/