mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Sat Feb 08 19:45:06 2014 +0000
Revision:
87:085cde657901
Child:
106:ced8cbb51063
Synchronized with git revision 9272cdeb45ec7e6077641536509413da8fd2ebc2

Full URL: https://github.com/mbedmicro/mbed/commit/9272cdeb45ec7e6077641536509413da8fd2ebc2/

Add NUCLEO_F401RE, improvements

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 87:085cde657901 1 /**
mbed_official 87:085cde657901 2 ******************************************************************************
mbed_official 87:085cde657901 3 * @file stm32f4xx_hal_pcd.c
mbed_official 87:085cde657901 4 * @author MCD Application Team
mbed_official 87:085cde657901 5 * @version V1.0.0RC2
mbed_official 87:085cde657901 6 * @date 04-February-2014
mbed_official 87:085cde657901 7 * @brief PCD HAL module driver.
mbed_official 87:085cde657901 8 * This file provides firmware functions to manage the following
mbed_official 87:085cde657901 9 * functionalities of the USB Peripheral Controller:
mbed_official 87:085cde657901 10 * + Initialization and de-initialization functions
mbed_official 87:085cde657901 11 * + IO operation functions
mbed_official 87:085cde657901 12 * + Peripheral Control functions
mbed_official 87:085cde657901 13 * + Peripheral State functions
mbed_official 87:085cde657901 14 *
mbed_official 87:085cde657901 15 @verbatim
mbed_official 87:085cde657901 16 ==============================================================================
mbed_official 87:085cde657901 17 ##### How to use this driver #####
mbed_official 87:085cde657901 18 ==============================================================================
mbed_official 87:085cde657901 19 [..]
mbed_official 87:085cde657901 20 The PCD HAL driver can be used as follows:
mbed_official 87:085cde657901 21
mbed_official 87:085cde657901 22 (#) Declare a PCD_HandleTypeDef handle structure, for example:
mbed_official 87:085cde657901 23 PCD_HandleTypeDef hpcd;
mbed_official 87:085cde657901 24
mbed_official 87:085cde657901 25 (#) Fill parameters of Init structure in HCD handle
mbed_official 87:085cde657901 26
mbed_official 87:085cde657901 27 (#) Call HAL_PCD_Init() API to initialize the HCD peripheral (Core, Device core, ...)
mbed_official 87:085cde657901 28
mbed_official 87:085cde657901 29 (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API:
mbed_official 87:085cde657901 30 (##) Enable the PCD/USB Low Level interface clock using
mbed_official 87:085cde657901 31 (+++) __OTGFS-OTG_CLK_ENABLE()/__OTGHS-OTG_CLK_ENABLE();
mbed_official 87:085cde657901 32 (+++) __OTGHSULPI_CLK_ENABLE(); (For High Speed Mode)
mbed_official 87:085cde657901 33
mbed_official 87:085cde657901 34 (##) Initialize the related GPIO clocks
mbed_official 87:085cde657901 35 (##) Configure PCD pin-out
mbed_official 87:085cde657901 36 (##) Configure PCD NVIC interrupt
mbed_official 87:085cde657901 37
mbed_official 87:085cde657901 38 (#)Associate the Upper USB device stack to the HAL PCD Driver:
mbed_official 87:085cde657901 39 (##) hpcd.pData = pdev;
mbed_official 87:085cde657901 40
mbed_official 87:085cde657901 41 (#)Enable HCD transmission and reception:
mbed_official 87:085cde657901 42 (##) HAL_PCD_Start();
mbed_official 87:085cde657901 43
mbed_official 87:085cde657901 44 @endverbatim
mbed_official 87:085cde657901 45 ******************************************************************************
mbed_official 87:085cde657901 46 * @attention
mbed_official 87:085cde657901 47 *
mbed_official 87:085cde657901 48 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 87:085cde657901 49 *
mbed_official 87:085cde657901 50 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 87:085cde657901 51 * are permitted provided that the following conditions are met:
mbed_official 87:085cde657901 52 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 87:085cde657901 53 * this list of conditions and the following disclaimer.
mbed_official 87:085cde657901 54 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 87:085cde657901 55 * this list of conditions and the following disclaimer in the documentation
mbed_official 87:085cde657901 56 * and/or other materials provided with the distribution.
mbed_official 87:085cde657901 57 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 87:085cde657901 58 * may be used to endorse or promote products derived from this software
mbed_official 87:085cde657901 59 * without specific prior written permission.
mbed_official 87:085cde657901 60 *
mbed_official 87:085cde657901 61 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 87:085cde657901 62 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 87:085cde657901 63 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 87:085cde657901 64 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 87:085cde657901 65 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 87:085cde657901 66 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 87:085cde657901 67 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 87:085cde657901 68 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 87:085cde657901 69 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 87:085cde657901 70 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 87:085cde657901 71 *
mbed_official 87:085cde657901 72 ******************************************************************************
mbed_official 87:085cde657901 73 */
mbed_official 87:085cde657901 74
mbed_official 87:085cde657901 75 /* Includes ------------------------------------------------------------------*/
mbed_official 87:085cde657901 76 #include "stm32f4xx_hal.h"
mbed_official 87:085cde657901 77
mbed_official 87:085cde657901 78 /** @addtogroup STM32F4xx_HAL_Driver
mbed_official 87:085cde657901 79 * @{
mbed_official 87:085cde657901 80 */
mbed_official 87:085cde657901 81
mbed_official 87:085cde657901 82 /** @defgroup PCD
mbed_official 87:085cde657901 83 * @brief PCD HAL module driver
mbed_official 87:085cde657901 84 * @{
mbed_official 87:085cde657901 85 */
mbed_official 87:085cde657901 86
mbed_official 87:085cde657901 87 #ifdef HAL_PCD_MODULE_ENABLED
mbed_official 87:085cde657901 88
mbed_official 87:085cde657901 89 /* Private typedef -----------------------------------------------------------*/
mbed_official 87:085cde657901 90 /* Private define ------------------------------------------------------------*/
mbed_official 87:085cde657901 91 /* Private macro -------------------------------------------------------------*/
mbed_official 87:085cde657901 92 #define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b))
mbed_official 87:085cde657901 93 #define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b))
mbed_official 87:085cde657901 94 /* Private variables ---------------------------------------------------------*/
mbed_official 87:085cde657901 95 /* Private function prototypes -----------------------------------------------*/
mbed_official 87:085cde657901 96 static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum);
mbed_official 87:085cde657901 97 /* Private functions ---------------------------------------------------------*/
mbed_official 87:085cde657901 98
mbed_official 87:085cde657901 99 /** @defgroup PCD_Private_Functions
mbed_official 87:085cde657901 100 * @{
mbed_official 87:085cde657901 101 */
mbed_official 87:085cde657901 102
mbed_official 87:085cde657901 103 /** @defgroup PCD_Group1 Initialization and de-initialization functions
mbed_official 87:085cde657901 104 * @brief Initialization and Configuration functions
mbed_official 87:085cde657901 105 *
mbed_official 87:085cde657901 106 @verbatim
mbed_official 87:085cde657901 107 ===============================================================================
mbed_official 87:085cde657901 108 ##### Initialization and de-initialization functions #####
mbed_official 87:085cde657901 109 ===============================================================================
mbed_official 87:085cde657901 110 [..] This section provides functions allowing to:
mbed_official 87:085cde657901 111
mbed_official 87:085cde657901 112 @endverbatim
mbed_official 87:085cde657901 113 * @{
mbed_official 87:085cde657901 114 */
mbed_official 87:085cde657901 115
mbed_official 87:085cde657901 116 /**
mbed_official 87:085cde657901 117 * @brief Initializes the PCD according to the specified
mbed_official 87:085cde657901 118 * parameters in the PCD_InitTypeDef and create the associated handle.
mbed_official 87:085cde657901 119 * @param hpcd: PCD handle
mbed_official 87:085cde657901 120 * @retval HAL status
mbed_official 87:085cde657901 121 */
mbed_official 87:085cde657901 122 HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 123 {
mbed_official 87:085cde657901 124 uint32_t i = 0;
mbed_official 87:085cde657901 125
mbed_official 87:085cde657901 126 /* Check the PCD handle allocation */
mbed_official 87:085cde657901 127 if(hpcd == NULL)
mbed_official 87:085cde657901 128 {
mbed_official 87:085cde657901 129 return HAL_ERROR;
mbed_official 87:085cde657901 130 }
mbed_official 87:085cde657901 131
mbed_official 87:085cde657901 132 /* Check the parameters */
mbed_official 87:085cde657901 133 assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance));
mbed_official 87:085cde657901 134
mbed_official 87:085cde657901 135 hpcd->State = PCD_BUSY;
mbed_official 87:085cde657901 136
mbed_official 87:085cde657901 137 /* Init the low level hardware : GPIO, CLOCK, NVIC... */
mbed_official 87:085cde657901 138 HAL_PCD_MspInit(hpcd);
mbed_official 87:085cde657901 139
mbed_official 87:085cde657901 140 /* Disable the Interrupts */
mbed_official 87:085cde657901 141 __HAL_PCD_DISABLE(hpcd);
mbed_official 87:085cde657901 142
mbed_official 87:085cde657901 143 /*Init the Core (common init.) */
mbed_official 87:085cde657901 144 USB_CoreInit(hpcd->Instance, hpcd->Init);
mbed_official 87:085cde657901 145
mbed_official 87:085cde657901 146 /* Force Device Mode*/
mbed_official 87:085cde657901 147 USB_SetCurrentMode(hpcd->Instance , USB_OTG_DEVICE_MODE);
mbed_official 87:085cde657901 148
mbed_official 87:085cde657901 149 /* Init endpoints structures */
mbed_official 87:085cde657901 150 for (i = 0; i < 15 ; i++)
mbed_official 87:085cde657901 151 {
mbed_official 87:085cde657901 152 /* Init ep structure */
mbed_official 87:085cde657901 153 hpcd->IN_ep[i].is_in = 1;
mbed_official 87:085cde657901 154 hpcd->IN_ep[i].num = i;
mbed_official 87:085cde657901 155 hpcd->IN_ep[i].tx_fifo_num = i;
mbed_official 87:085cde657901 156 /* Control until ep is actvated */
mbed_official 87:085cde657901 157 hpcd->IN_ep[i].type = EP_TYPE_CTRL;
mbed_official 87:085cde657901 158 hpcd->IN_ep[i].maxpacket = 0;
mbed_official 87:085cde657901 159 hpcd->IN_ep[i].xfer_buff = 0;
mbed_official 87:085cde657901 160 hpcd->IN_ep[i].xfer_len = 0;
mbed_official 87:085cde657901 161 }
mbed_official 87:085cde657901 162
mbed_official 87:085cde657901 163 for (i = 0; i < 15 ; i++)
mbed_official 87:085cde657901 164 {
mbed_official 87:085cde657901 165 hpcd->OUT_ep[i].is_in = 0;
mbed_official 87:085cde657901 166 hpcd->OUT_ep[i].num = i;
mbed_official 87:085cde657901 167 hpcd->IN_ep[i].tx_fifo_num = i;
mbed_official 87:085cde657901 168 /* Control until ep is activated */
mbed_official 87:085cde657901 169 hpcd->OUT_ep[i].type = EP_TYPE_CTRL;
mbed_official 87:085cde657901 170 hpcd->OUT_ep[i].maxpacket = 0;
mbed_official 87:085cde657901 171 hpcd->OUT_ep[i].xfer_buff = 0;
mbed_official 87:085cde657901 172 hpcd->OUT_ep[i].xfer_len = 0;
mbed_official 87:085cde657901 173
mbed_official 87:085cde657901 174 hpcd->Instance->DIEPTXF[i] = 0;
mbed_official 87:085cde657901 175 }
mbed_official 87:085cde657901 176
mbed_official 87:085cde657901 177 /* Init Device */
mbed_official 87:085cde657901 178 USB_DevInit(hpcd->Instance, hpcd->Init);
mbed_official 87:085cde657901 179
mbed_official 87:085cde657901 180 /* Enable the Interrupts */
mbed_official 87:085cde657901 181 __HAL_PCD_ENABLE(hpcd);
mbed_official 87:085cde657901 182
mbed_official 87:085cde657901 183 hpcd->State= PCD_READY;
mbed_official 87:085cde657901 184
mbed_official 87:085cde657901 185 return HAL_OK;
mbed_official 87:085cde657901 186 }
mbed_official 87:085cde657901 187
mbed_official 87:085cde657901 188 /**
mbed_official 87:085cde657901 189 * @brief DeInitializes the PCD peripheral
mbed_official 87:085cde657901 190 * @param hpcd: PCD handle
mbed_official 87:085cde657901 191 * @retval HAL status
mbed_official 87:085cde657901 192 */
mbed_official 87:085cde657901 193 HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 194 {
mbed_official 87:085cde657901 195 /* Check the PCD handle allocation */
mbed_official 87:085cde657901 196 if(hpcd == NULL)
mbed_official 87:085cde657901 197 {
mbed_official 87:085cde657901 198 return HAL_ERROR;
mbed_official 87:085cde657901 199 }
mbed_official 87:085cde657901 200
mbed_official 87:085cde657901 201 hpcd->State = PCD_BUSY;
mbed_official 87:085cde657901 202
mbed_official 87:085cde657901 203 /* DeInit the low level hardware */
mbed_official 87:085cde657901 204 HAL_PCD_MspDeInit(hpcd);
mbed_official 87:085cde657901 205
mbed_official 87:085cde657901 206 hpcd->State = PCD_READY;
mbed_official 87:085cde657901 207
mbed_official 87:085cde657901 208 return HAL_OK;
mbed_official 87:085cde657901 209 }
mbed_official 87:085cde657901 210
mbed_official 87:085cde657901 211 /**
mbed_official 87:085cde657901 212 * @brief Initializes the PCD MSP.
mbed_official 87:085cde657901 213 * @param hpcd: PCD handle
mbed_official 87:085cde657901 214 * @retval None
mbed_official 87:085cde657901 215 */
mbed_official 87:085cde657901 216 __weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 217 {
mbed_official 87:085cde657901 218 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 219 the HAL_PCD_MspInit could be implenetd in the user file
mbed_official 87:085cde657901 220 */
mbed_official 87:085cde657901 221 }
mbed_official 87:085cde657901 222
mbed_official 87:085cde657901 223 /**
mbed_official 87:085cde657901 224 * @brief DeInitializes PCD MSP.
mbed_official 87:085cde657901 225 * @param hpcd: PCD handle
mbed_official 87:085cde657901 226 * @retval None
mbed_official 87:085cde657901 227 */
mbed_official 87:085cde657901 228 __weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 229 {
mbed_official 87:085cde657901 230 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 231 the HAL_PCD_MspDeInit could be implenetd in the user file
mbed_official 87:085cde657901 232 */
mbed_official 87:085cde657901 233 }
mbed_official 87:085cde657901 234
mbed_official 87:085cde657901 235 /**
mbed_official 87:085cde657901 236 * @}
mbed_official 87:085cde657901 237 */
mbed_official 87:085cde657901 238
mbed_official 87:085cde657901 239 /** @defgroup PCD_Group2 IO operation functions
mbed_official 87:085cde657901 240 * @brief Data transfers functions
mbed_official 87:085cde657901 241 *
mbed_official 87:085cde657901 242 @verbatim
mbed_official 87:085cde657901 243 ===============================================================================
mbed_official 87:085cde657901 244 ##### IO operation functions #####
mbed_official 87:085cde657901 245 ===============================================================================
mbed_official 87:085cde657901 246 [..]
mbed_official 87:085cde657901 247 This subsection provides a set of functions allowing to manage the PCD data
mbed_official 87:085cde657901 248 transfers.
mbed_official 87:085cde657901 249
mbed_official 87:085cde657901 250 @endverbatim
mbed_official 87:085cde657901 251 * @{
mbed_official 87:085cde657901 252 */
mbed_official 87:085cde657901 253
mbed_official 87:085cde657901 254 /**
mbed_official 87:085cde657901 255 * @brief Start The USB OTG Device.
mbed_official 87:085cde657901 256 * @param hpcd: PCD handle
mbed_official 87:085cde657901 257 * @retval HAL status
mbed_official 87:085cde657901 258 */
mbed_official 87:085cde657901 259 HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 260 {
mbed_official 87:085cde657901 261 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 262 USB_DevConnect (hpcd->Instance);
mbed_official 87:085cde657901 263 __HAL_PCD_ENABLE(hpcd);
mbed_official 87:085cde657901 264 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 265 return HAL_OK;
mbed_official 87:085cde657901 266 }
mbed_official 87:085cde657901 267
mbed_official 87:085cde657901 268 /**
mbed_official 87:085cde657901 269 * @brief Stop The USB OTG Device.
mbed_official 87:085cde657901 270 * @param hpcd: PCD handle
mbed_official 87:085cde657901 271 * @retval HAL status
mbed_official 87:085cde657901 272 */
mbed_official 87:085cde657901 273 HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 274 {
mbed_official 87:085cde657901 275 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 276 __HAL_PCD_DISABLE(hpcd);
mbed_official 87:085cde657901 277 USB_StopDevice(hpcd->Instance);
mbed_official 87:085cde657901 278 USB_DevDisconnect (hpcd->Instance);
mbed_official 87:085cde657901 279 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 280 return HAL_OK;
mbed_official 87:085cde657901 281 }
mbed_official 87:085cde657901 282
mbed_official 87:085cde657901 283 /**
mbed_official 87:085cde657901 284 * @brief This function handles PCD interrupt request.
mbed_official 87:085cde657901 285 * @param hpcd: PCD handle
mbed_official 87:085cde657901 286 * @retval HAL status
mbed_official 87:085cde657901 287 */
mbed_official 87:085cde657901 288 void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 289 {
mbed_official 87:085cde657901 290 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
mbed_official 87:085cde657901 291 uint32_t i = 0, ep_intr = 0, epint = 0, epnum = 0;
mbed_official 87:085cde657901 292 uint32_t fifoemptymsk = 0, temp = 0;
mbed_official 87:085cde657901 293 USB_OTG_EPTypeDef *ep;
mbed_official 87:085cde657901 294
mbed_official 87:085cde657901 295 /* ensure that we are in device mode */
mbed_official 87:085cde657901 296 if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE)
mbed_official 87:085cde657901 297 {
mbed_official 87:085cde657901 298 /* avoid spurious interrupt */
mbed_official 87:085cde657901 299 if(__HAL_IS_INVALID_INTERRUPT(hpcd))
mbed_official 87:085cde657901 300 {
mbed_official 87:085cde657901 301 return;
mbed_official 87:085cde657901 302 }
mbed_official 87:085cde657901 303
mbed_official 87:085cde657901 304 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS))
mbed_official 87:085cde657901 305 {
mbed_official 87:085cde657901 306 /* incorrect mode, acknowledge the interrupt */
mbed_official 87:085cde657901 307 __HAL_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS);
mbed_official 87:085cde657901 308 }
mbed_official 87:085cde657901 309
mbed_official 87:085cde657901 310 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT))
mbed_official 87:085cde657901 311 {
mbed_official 87:085cde657901 312 epnum = 0;
mbed_official 87:085cde657901 313
mbed_official 87:085cde657901 314 /* Read in the device interrupt bits */
mbed_official 87:085cde657901 315 ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance);
mbed_official 87:085cde657901 316
mbed_official 87:085cde657901 317 while ( ep_intr )
mbed_official 87:085cde657901 318 {
mbed_official 87:085cde657901 319 if (ep_intr & 0x1)
mbed_official 87:085cde657901 320 {
mbed_official 87:085cde657901 321 epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, epnum);
mbed_official 87:085cde657901 322
mbed_official 87:085cde657901 323 if(( epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC)
mbed_official 87:085cde657901 324 {
mbed_official 87:085cde657901 325 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC);
mbed_official 87:085cde657901 326
mbed_official 87:085cde657901 327 if(hpcd->Init.dma_enable == 1)
mbed_official 87:085cde657901 328 {
mbed_official 87:085cde657901 329 hpcd->OUT_ep[epnum].xfer_count = hpcd->OUT_ep[epnum].maxpacket- (USBx_OUTEP(epnum)->DOEPTSIZ & USB_OTG_DOEPTSIZ_XFRSIZ);
mbed_official 87:085cde657901 330 hpcd->OUT_ep[epnum].xfer_buff += hpcd->OUT_ep[epnum].maxpacket;
mbed_official 87:085cde657901 331 }
mbed_official 87:085cde657901 332
mbed_official 87:085cde657901 333 HAL_PCD_DataOutStageCallback(hpcd, epnum);
mbed_official 87:085cde657901 334 if(hpcd->Init.dma_enable == 1)
mbed_official 87:085cde657901 335 {
mbed_official 87:085cde657901 336 if((epnum == 0) && (hpcd->OUT_ep[epnum].xfer_len == 0))
mbed_official 87:085cde657901 337 {
mbed_official 87:085cde657901 338 /* this is ZLP, so prepare EP0 for next setup */
mbed_official 87:085cde657901 339 USB_EP0_OutStart(hpcd->Instance, 1, (uint8_t *)hpcd->Setup);
mbed_official 87:085cde657901 340 }
mbed_official 87:085cde657901 341 }
mbed_official 87:085cde657901 342 }
mbed_official 87:085cde657901 343
mbed_official 87:085cde657901 344 if(( epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP)
mbed_official 87:085cde657901 345 {
mbed_official 87:085cde657901 346 /* Inform the upper layer that a setup packet is available */
mbed_official 87:085cde657901 347 HAL_PCD_SetupStageCallback(hpcd);
mbed_official 87:085cde657901 348 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP);
mbed_official 87:085cde657901 349 }
mbed_official 87:085cde657901 350
mbed_official 87:085cde657901 351 if(( epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS)
mbed_official 87:085cde657901 352 {
mbed_official 87:085cde657901 353 CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS);
mbed_official 87:085cde657901 354 }
mbed_official 87:085cde657901 355 }
mbed_official 87:085cde657901 356 epnum++;
mbed_official 87:085cde657901 357 ep_intr >>= 1;
mbed_official 87:085cde657901 358 }
mbed_official 87:085cde657901 359 }
mbed_official 87:085cde657901 360
mbed_official 87:085cde657901 361 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT))
mbed_official 87:085cde657901 362 {
mbed_official 87:085cde657901 363 /* Read in the device interrupt bits */
mbed_official 87:085cde657901 364 ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance);
mbed_official 87:085cde657901 365
mbed_official 87:085cde657901 366 epnum = 0;
mbed_official 87:085cde657901 367
mbed_official 87:085cde657901 368 while ( ep_intr )
mbed_official 87:085cde657901 369 {
mbed_official 87:085cde657901 370 if (ep_intr & 0x1) /* In ITR */
mbed_official 87:085cde657901 371 {
mbed_official 87:085cde657901 372 epint = USB_ReadDevInEPInterrupt(hpcd->Instance, epnum);
mbed_official 87:085cde657901 373
mbed_official 87:085cde657901 374 if(( epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC)
mbed_official 87:085cde657901 375 {
mbed_official 87:085cde657901 376 fifoemptymsk = 0x1 << epnum;
mbed_official 87:085cde657901 377 USBx_DEVICE->DIEPEMPMSK = ~fifoemptymsk;
mbed_official 87:085cde657901 378
mbed_official 87:085cde657901 379 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC);
mbed_official 87:085cde657901 380
mbed_official 87:085cde657901 381 if (hpcd->Init.dma_enable == 1)
mbed_official 87:085cde657901 382 {
mbed_official 87:085cde657901 383 hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket;
mbed_official 87:085cde657901 384 }
mbed_official 87:085cde657901 385
mbed_official 87:085cde657901 386 HAL_PCD_DataInStageCallback(hpcd, epnum);
mbed_official 87:085cde657901 387
mbed_official 87:085cde657901 388 if (hpcd->Init.dma_enable == 1)
mbed_official 87:085cde657901 389 {
mbed_official 87:085cde657901 390 /* this is ZLP, so prepare EP0 for next setup */
mbed_official 87:085cde657901 391 if((epnum == 0) && (hpcd->IN_ep[epnum].xfer_len == 0))
mbed_official 87:085cde657901 392 {
mbed_official 87:085cde657901 393 /* prepare to rx more setup packets */
mbed_official 87:085cde657901 394 USB_EP0_OutStart(hpcd->Instance, 1, (uint8_t *)hpcd->Setup);
mbed_official 87:085cde657901 395 }
mbed_official 87:085cde657901 396 }
mbed_official 87:085cde657901 397 }
mbed_official 87:085cde657901 398 if(( epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC)
mbed_official 87:085cde657901 399 {
mbed_official 87:085cde657901 400 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC);
mbed_official 87:085cde657901 401 }
mbed_official 87:085cde657901 402 if(( epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE)
mbed_official 87:085cde657901 403 {
mbed_official 87:085cde657901 404 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE);
mbed_official 87:085cde657901 405 }
mbed_official 87:085cde657901 406 if(( epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE)
mbed_official 87:085cde657901 407 {
mbed_official 87:085cde657901 408 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE);
mbed_official 87:085cde657901 409 }
mbed_official 87:085cde657901 410 if(( epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD)
mbed_official 87:085cde657901 411 {
mbed_official 87:085cde657901 412 CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD);
mbed_official 87:085cde657901 413 }
mbed_official 87:085cde657901 414 if(( epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE)
mbed_official 87:085cde657901 415 {
mbed_official 87:085cde657901 416 fifoemptymsk = 0x1 << epnum;
mbed_official 87:085cde657901 417 USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
mbed_official 87:085cde657901 418 PCD_WriteEmptyTxFifo(hpcd , epnum);
mbed_official 87:085cde657901 419 }
mbed_official 87:085cde657901 420 }
mbed_official 87:085cde657901 421 epnum++;
mbed_official 87:085cde657901 422 ep_intr >>= 1;
mbed_official 87:085cde657901 423 }
mbed_official 87:085cde657901 424 }
mbed_official 87:085cde657901 425
mbed_official 87:085cde657901 426 /* Handle Suspend Interrupt */
mbed_official 87:085cde657901 427 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP))
mbed_official 87:085cde657901 428 {
mbed_official 87:085cde657901 429
mbed_official 87:085cde657901 430 HAL_PCD_SuspendCallback(hpcd);
mbed_official 87:085cde657901 431
mbed_official 87:085cde657901 432 if( (hpcd->Init.low_power_enable) && \
mbed_official 87:085cde657901 433 ( (USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS))
mbed_official 87:085cde657901 434 {
mbed_official 87:085cde657901 435 /* un-gate USB Core clock */
mbed_official 87:085cde657901 436 USBx_PCGCCTL |= (USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK);
mbed_official 87:085cde657901 437
mbed_official 87:085cde657901 438 /* Request to enter Sleep mode after exit from current ISR */
mbed_official 87:085cde657901 439 SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk);
mbed_official 87:085cde657901 440 }
mbed_official 87:085cde657901 441 __HAL_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP);
mbed_official 87:085cde657901 442 }
mbed_official 87:085cde657901 443
mbed_official 87:085cde657901 444 /* Handle Resume Interrupt */
mbed_official 87:085cde657901 445 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT))
mbed_official 87:085cde657901 446 {
mbed_official 87:085cde657901 447 if( hpcd->Init.low_power_enable)
mbed_official 87:085cde657901 448 {
mbed_official 87:085cde657901 449 /* un-gate USB Core clock */
mbed_official 87:085cde657901 450 USBx_PCGCCTL &= ~(USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK);
mbed_official 87:085cde657901 451 }
mbed_official 87:085cde657901 452
mbed_official 87:085cde657901 453 /* Clear the Remote Wake-up Signaling */
mbed_official 87:085cde657901 454 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
mbed_official 87:085cde657901 455
mbed_official 87:085cde657901 456 HAL_PCD_ResumeCallback(hpcd);
mbed_official 87:085cde657901 457
mbed_official 87:085cde657901 458 __HAL_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT);
mbed_official 87:085cde657901 459 }
mbed_official 87:085cde657901 460
mbed_official 87:085cde657901 461 /* Handle Reset Interrupt */
mbed_official 87:085cde657901 462 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST))
mbed_official 87:085cde657901 463 {
mbed_official 87:085cde657901 464 USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;
mbed_official 87:085cde657901 465 USB_FlushTxFifo(hpcd->Instance , 0 );
mbed_official 87:085cde657901 466
mbed_official 87:085cde657901 467 for (i = 0; i < hpcd->Init.dev_endpoints ; i++)
mbed_official 87:085cde657901 468 {
mbed_official 87:085cde657901 469 USBx_INEP(i)->DIEPINT = 0xFF;
mbed_official 87:085cde657901 470 USBx_OUTEP(i)->DOEPINT = 0xFF;
mbed_official 87:085cde657901 471 }
mbed_official 87:085cde657901 472 USBx_DEVICE->DAINT = 0xFFFFFFFF;
mbed_official 87:085cde657901 473 USBx_DEVICE->DAINTMSK |= 0x10001;
mbed_official 87:085cde657901 474
mbed_official 87:085cde657901 475 if(hpcd->Init.use_dedicated_ep1)
mbed_official 87:085cde657901 476 {
mbed_official 87:085cde657901 477 USBx_DEVICE->DOUTEP1MSK |= (USB_OTG_DOEPMSK_STUPM | USB_OTG_DOEPMSK_XFRCM | USB_OTG_DOEPMSK_EPDM);
mbed_official 87:085cde657901 478 USBx_DEVICE->DINEP1MSK |= (USB_OTG_DIEPMSK_TOM | USB_OTG_DIEPMSK_XFRCM | USB_OTG_DIEPMSK_EPDM);
mbed_official 87:085cde657901 479 }
mbed_official 87:085cde657901 480 else
mbed_official 87:085cde657901 481 {
mbed_official 87:085cde657901 482 USBx_DEVICE->DOEPMSK |= (USB_OTG_DOEPMSK_STUPM | USB_OTG_DOEPMSK_XFRCM | USB_OTG_DOEPMSK_EPDM);
mbed_official 87:085cde657901 483 USBx_DEVICE->DIEPMSK |= (USB_OTG_DIEPMSK_TOM | USB_OTG_DIEPMSK_XFRCM | USB_OTG_DIEPMSK_EPDM);
mbed_official 87:085cde657901 484 }
mbed_official 87:085cde657901 485
mbed_official 87:085cde657901 486 /* Set Default Address to 0 */
mbed_official 87:085cde657901 487 USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD;
mbed_official 87:085cde657901 488
mbed_official 87:085cde657901 489 /* setup EP0 to receive SETUP packets */
mbed_official 87:085cde657901 490 USB_EP0_OutStart(hpcd->Instance, hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup);
mbed_official 87:085cde657901 491
mbed_official 87:085cde657901 492 HAL_PCD_ResetCallback(hpcd);
mbed_official 87:085cde657901 493
mbed_official 87:085cde657901 494 __HAL_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST);
mbed_official 87:085cde657901 495 }
mbed_official 87:085cde657901 496
mbed_official 87:085cde657901 497 /* Handle Enumeration done Interrupt */
mbed_official 87:085cde657901 498 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE))
mbed_official 87:085cde657901 499 {
mbed_official 87:085cde657901 500 USB_ActivateSetup(hpcd->Instance);
mbed_official 87:085cde657901 501 hpcd->Instance->GUSBCFG &= ~USB_OTG_GUSBCFG_TRDT;
mbed_official 87:085cde657901 502
mbed_official 87:085cde657901 503 if ( USB_GetDevSpeed(hpcd->Instance) == USB_OTG_SPEED_HIGH)
mbed_official 87:085cde657901 504 {
mbed_official 87:085cde657901 505 hpcd->Init.speed = USB_OTG_SPEED_HIGH;
mbed_official 87:085cde657901 506 hpcd->Init.ep0_mps = USB_OTG_HS_MAX_PACKET_SIZE ;
mbed_official 87:085cde657901 507 hpcd->Instance->GUSBCFG |= (USB_OTG_GUSBCFG_TRDT_0 | USB_OTG_GUSBCFG_TRDT_3);
mbed_official 87:085cde657901 508 }
mbed_official 87:085cde657901 509 else
mbed_official 87:085cde657901 510 {
mbed_official 87:085cde657901 511 hpcd->Init.speed = USB_OTG_SPEED_FULL;
mbed_official 87:085cde657901 512 hpcd->Init.ep0_mps = USB_OTG_FS_MAX_PACKET_SIZE ;
mbed_official 87:085cde657901 513 hpcd->Instance->GUSBCFG |= (USB_OTG_GUSBCFG_TRDT_0 | USB_OTG_GUSBCFG_TRDT_2);
mbed_official 87:085cde657901 514 }
mbed_official 87:085cde657901 515 __HAL_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE);
mbed_official 87:085cde657901 516 }
mbed_official 87:085cde657901 517
mbed_official 87:085cde657901 518
mbed_official 87:085cde657901 519 /* Handle RxQLevel Interrupt */
mbed_official 87:085cde657901 520 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL))
mbed_official 87:085cde657901 521 {
mbed_official 87:085cde657901 522 USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
mbed_official 87:085cde657901 523 temp = USBx->GRXSTSP;
mbed_official 87:085cde657901 524 ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM];
mbed_official 87:085cde657901 525
mbed_official 87:085cde657901 526 if(((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT)
mbed_official 87:085cde657901 527 {
mbed_official 87:085cde657901 528 if((temp & USB_OTG_GRXSTSP_BCNT) != 0)
mbed_official 87:085cde657901 529 {
mbed_official 87:085cde657901 530 USB_ReadPacket(USBx, ep->xfer_buff, (temp & USB_OTG_GRXSTSP_BCNT) >> 4);
mbed_official 87:085cde657901 531 ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
mbed_official 87:085cde657901 532 ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
mbed_official 87:085cde657901 533 }
mbed_official 87:085cde657901 534 }
mbed_official 87:085cde657901 535 else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT)
mbed_official 87:085cde657901 536 {
mbed_official 87:085cde657901 537 USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8);
mbed_official 87:085cde657901 538 ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
mbed_official 87:085cde657901 539 }
mbed_official 87:085cde657901 540 USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
mbed_official 87:085cde657901 541 }
mbed_official 87:085cde657901 542
mbed_official 87:085cde657901 543 /* Handle SOF Interrupt */
mbed_official 87:085cde657901 544 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF))
mbed_official 87:085cde657901 545 {
mbed_official 87:085cde657901 546 HAL_PCD_SOFCallback(hpcd);
mbed_official 87:085cde657901 547 __HAL_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF);
mbed_official 87:085cde657901 548 }
mbed_official 87:085cde657901 549
mbed_official 87:085cde657901 550 /* Handle Incomplete ISO IN Interrupt */
mbed_official 87:085cde657901 551 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR))
mbed_official 87:085cde657901 552 {
mbed_official 87:085cde657901 553 HAL_PCD_ISOINIncompleteCallback(hpcd, epnum);
mbed_official 87:085cde657901 554 __HAL_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR);
mbed_official 87:085cde657901 555 }
mbed_official 87:085cde657901 556
mbed_official 87:085cde657901 557 /* Handle Incomplete ISO OUT Interrupt */
mbed_official 87:085cde657901 558 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
mbed_official 87:085cde657901 559 {
mbed_official 87:085cde657901 560 HAL_PCD_ISOOUTIncompleteCallback(hpcd, epnum);
mbed_official 87:085cde657901 561 __HAL_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
mbed_official 87:085cde657901 562 }
mbed_official 87:085cde657901 563
mbed_official 87:085cde657901 564 /* Handle Connection event Interrupt */
mbed_official 87:085cde657901 565 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT))
mbed_official 87:085cde657901 566 {
mbed_official 87:085cde657901 567 HAL_PCD_ConnectCallback(hpcd);
mbed_official 87:085cde657901 568 __HAL_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT);
mbed_official 87:085cde657901 569 }
mbed_official 87:085cde657901 570
mbed_official 87:085cde657901 571 /* Handle Disconnection event Interrupt */
mbed_official 87:085cde657901 572 if(__HAL_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT))
mbed_official 87:085cde657901 573 {
mbed_official 87:085cde657901 574 temp = hpcd->Instance->GOTGINT;
mbed_official 87:085cde657901 575
mbed_official 87:085cde657901 576 if((temp & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET)
mbed_official 87:085cde657901 577 {
mbed_official 87:085cde657901 578 HAL_PCD_DisconnectCallback(hpcd);
mbed_official 87:085cde657901 579 }
mbed_official 87:085cde657901 580 hpcd->Instance->GOTGINT |= temp;
mbed_official 87:085cde657901 581 }
mbed_official 87:085cde657901 582 }
mbed_official 87:085cde657901 583 }
mbed_official 87:085cde657901 584
mbed_official 87:085cde657901 585 /**
mbed_official 87:085cde657901 586 * @brief Data out stage callbacks
mbed_official 87:085cde657901 587 * @param hpcd: PCD handle
mbed_official 87:085cde657901 588 * @retval None
mbed_official 87:085cde657901 589 */
mbed_official 87:085cde657901 590 __weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 87:085cde657901 591 {
mbed_official 87:085cde657901 592 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 593 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 594 */
mbed_official 87:085cde657901 595 }
mbed_official 87:085cde657901 596
mbed_official 87:085cde657901 597 /**
mbed_official 87:085cde657901 598 * @brief Data IN stage callbacks
mbed_official 87:085cde657901 599 * @param hpcd: PCD handle
mbed_official 87:085cde657901 600 * @retval None
mbed_official 87:085cde657901 601 */
mbed_official 87:085cde657901 602 __weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 87:085cde657901 603 {
mbed_official 87:085cde657901 604 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 605 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 606 */
mbed_official 87:085cde657901 607 }
mbed_official 87:085cde657901 608 /**
mbed_official 87:085cde657901 609 * @brief Setup stage callback
mbed_official 87:085cde657901 610 * @param hpcd: ppp handle
mbed_official 87:085cde657901 611 * @retval None
mbed_official 87:085cde657901 612 */
mbed_official 87:085cde657901 613 __weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 614 {
mbed_official 87:085cde657901 615 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 616 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 617 */
mbed_official 87:085cde657901 618 }
mbed_official 87:085cde657901 619
mbed_official 87:085cde657901 620 /**
mbed_official 87:085cde657901 621 * @brief USB Start Of Frame callbacks
mbed_official 87:085cde657901 622 * @param hpcd: PCD handle
mbed_official 87:085cde657901 623 * @retval None
mbed_official 87:085cde657901 624 */
mbed_official 87:085cde657901 625 __weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 626 {
mbed_official 87:085cde657901 627 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 628 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 629 */
mbed_official 87:085cde657901 630 }
mbed_official 87:085cde657901 631
mbed_official 87:085cde657901 632 /**
mbed_official 87:085cde657901 633 * @brief USB Reset callbacks
mbed_official 87:085cde657901 634 * @param hpcd: PCD handle
mbed_official 87:085cde657901 635 * @retval None
mbed_official 87:085cde657901 636 */
mbed_official 87:085cde657901 637 __weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 638 {
mbed_official 87:085cde657901 639 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 640 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 641 */
mbed_official 87:085cde657901 642 }
mbed_official 87:085cde657901 643
mbed_official 87:085cde657901 644 /**
mbed_official 87:085cde657901 645 * @brief Suspend event callbacks
mbed_official 87:085cde657901 646 * @param hpcd: PCD handle
mbed_official 87:085cde657901 647 * @retval None
mbed_official 87:085cde657901 648 */
mbed_official 87:085cde657901 649 __weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 650 {
mbed_official 87:085cde657901 651 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 652 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 653 */
mbed_official 87:085cde657901 654 }
mbed_official 87:085cde657901 655
mbed_official 87:085cde657901 656 /**
mbed_official 87:085cde657901 657 * @brief Resume event callbacks
mbed_official 87:085cde657901 658 * @param hpcd: PCD handle
mbed_official 87:085cde657901 659 * @retval None
mbed_official 87:085cde657901 660 */
mbed_official 87:085cde657901 661 __weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 662 {
mbed_official 87:085cde657901 663 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 664 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 665 */
mbed_official 87:085cde657901 666 }
mbed_official 87:085cde657901 667
mbed_official 87:085cde657901 668 /**
mbed_official 87:085cde657901 669 * @brief Incomplete ISO OUT callbacks
mbed_official 87:085cde657901 670 * @param hpcd: PCD handle
mbed_official 87:085cde657901 671 * @retval None
mbed_official 87:085cde657901 672 */
mbed_official 87:085cde657901 673 __weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 87:085cde657901 674 {
mbed_official 87:085cde657901 675 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 676 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 677 */
mbed_official 87:085cde657901 678 }
mbed_official 87:085cde657901 679
mbed_official 87:085cde657901 680 /**
mbed_official 87:085cde657901 681 * @brief Incomplete ISO IN callbacks
mbed_official 87:085cde657901 682 * @param hpcd: PCD handle
mbed_official 87:085cde657901 683 * @retval None
mbed_official 87:085cde657901 684 */
mbed_official 87:085cde657901 685 __weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 87:085cde657901 686 {
mbed_official 87:085cde657901 687 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 688 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 689 */
mbed_official 87:085cde657901 690 }
mbed_official 87:085cde657901 691
mbed_official 87:085cde657901 692 /**
mbed_official 87:085cde657901 693 * @brief Connection event callbacks
mbed_official 87:085cde657901 694 * @param hpcd: PCD handle
mbed_official 87:085cde657901 695 * @retval None
mbed_official 87:085cde657901 696 */
mbed_official 87:085cde657901 697 __weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 698 {
mbed_official 87:085cde657901 699 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 700 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 701 */
mbed_official 87:085cde657901 702 }
mbed_official 87:085cde657901 703
mbed_official 87:085cde657901 704 /**
mbed_official 87:085cde657901 705 * @brief Disconnection event callbacks
mbed_official 87:085cde657901 706 * @param hpcd: ppp handle
mbed_official 87:085cde657901 707 * @retval None
mbed_official 87:085cde657901 708 */
mbed_official 87:085cde657901 709 __weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 710 {
mbed_official 87:085cde657901 711 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 87:085cde657901 712 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 87:085cde657901 713 */
mbed_official 87:085cde657901 714 }
mbed_official 87:085cde657901 715
mbed_official 87:085cde657901 716 /**
mbed_official 87:085cde657901 717 * @}
mbed_official 87:085cde657901 718 */
mbed_official 87:085cde657901 719
mbed_official 87:085cde657901 720 /** @defgroup PCD_Group3 Peripheral Control functions
mbed_official 87:085cde657901 721 * @brief management functions
mbed_official 87:085cde657901 722 *
mbed_official 87:085cde657901 723 @verbatim
mbed_official 87:085cde657901 724 ===============================================================================
mbed_official 87:085cde657901 725 ##### Peripheral Control functions #####
mbed_official 87:085cde657901 726 ===============================================================================
mbed_official 87:085cde657901 727 [..]
mbed_official 87:085cde657901 728 This subsection provides a set of functions allowing to control the PCD data
mbed_official 87:085cde657901 729 transfers.
mbed_official 87:085cde657901 730
mbed_official 87:085cde657901 731 @endverbatim
mbed_official 87:085cde657901 732 * @{
mbed_official 87:085cde657901 733 */
mbed_official 87:085cde657901 734
mbed_official 87:085cde657901 735 /**
mbed_official 87:085cde657901 736 * @brief Send an amount of data in blocking mode
mbed_official 87:085cde657901 737 * @param hpcd: PCD handle
mbed_official 87:085cde657901 738 * @param pData: pointer to data buffer
mbed_official 87:085cde657901 739 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 740 * @retval HAL status
mbed_official 87:085cde657901 741 */
mbed_official 87:085cde657901 742 HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 743 {
mbed_official 87:085cde657901 744 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 745 USB_DevConnect(hpcd->Instance);
mbed_official 87:085cde657901 746 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 747 return HAL_OK;
mbed_official 87:085cde657901 748 }
mbed_official 87:085cde657901 749
mbed_official 87:085cde657901 750 /**
mbed_official 87:085cde657901 751 * @brief Send an amount of data in blocking mode
mbed_official 87:085cde657901 752 * @param hpcd: PCD handle
mbed_official 87:085cde657901 753 * @param pData: pointer to data buffer
mbed_official 87:085cde657901 754 * @param Size: amount of data to be sent
mbed_official 87:085cde657901 755 * @retval HAL status
mbed_official 87:085cde657901 756 */
mbed_official 87:085cde657901 757 HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 758 {
mbed_official 87:085cde657901 759 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 760 USB_DevDisconnect(hpcd->Instance);
mbed_official 87:085cde657901 761 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 762 return HAL_OK;
mbed_official 87:085cde657901 763 }
mbed_official 87:085cde657901 764
mbed_official 87:085cde657901 765 /**
mbed_official 87:085cde657901 766 * @brief Set the USB Device address
mbed_official 87:085cde657901 767 * @param hpcd: PCD handle
mbed_official 87:085cde657901 768 * @param address: new device address
mbed_official 87:085cde657901 769 * @retval HAL status
mbed_official 87:085cde657901 770 */
mbed_official 87:085cde657901 771 HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address)
mbed_official 87:085cde657901 772 {
mbed_official 87:085cde657901 773 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 774 USB_SetDevAddress(hpcd->Instance, address);
mbed_official 87:085cde657901 775 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 776 return HAL_OK;
mbed_official 87:085cde657901 777 }
mbed_official 87:085cde657901 778 /**
mbed_official 87:085cde657901 779 * @brief Open and configure an endpoint
mbed_official 87:085cde657901 780 * @param hpcd: PCD handle
mbed_official 87:085cde657901 781 * @param ep_addr: endpoint address
mbed_official 87:085cde657901 782 * @param ep_mps: endpoint max packert size
mbed_official 87:085cde657901 783 * @param ep_type: endpoint type
mbed_official 87:085cde657901 784 * @retval HAL status
mbed_official 87:085cde657901 785 */
mbed_official 87:085cde657901 786 HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type)
mbed_official 87:085cde657901 787 {
mbed_official 87:085cde657901 788 HAL_StatusTypeDef ret = HAL_OK;
mbed_official 87:085cde657901 789 USB_OTG_EPTypeDef *ep;
mbed_official 87:085cde657901 790
mbed_official 87:085cde657901 791 if ((ep_addr & 0x80) == 0x80)
mbed_official 87:085cde657901 792 {
mbed_official 87:085cde657901 793 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 87:085cde657901 794 }
mbed_official 87:085cde657901 795 else
mbed_official 87:085cde657901 796 {
mbed_official 87:085cde657901 797 ep = &hpcd->OUT_ep[ep_addr & 0x7F];
mbed_official 87:085cde657901 798 }
mbed_official 87:085cde657901 799 ep->num = ep_addr & 0x7F;
mbed_official 87:085cde657901 800
mbed_official 87:085cde657901 801 ep->is_in = (0x80 & ep_addr) != 0;
mbed_official 87:085cde657901 802 ep->maxpacket = ep_mps;
mbed_official 87:085cde657901 803 ep->type = ep_type;
mbed_official 87:085cde657901 804 if (ep->is_in)
mbed_official 87:085cde657901 805 {
mbed_official 87:085cde657901 806 /* Assign a Tx FIFO */
mbed_official 87:085cde657901 807 ep->tx_fifo_num = ep->num;
mbed_official 87:085cde657901 808 }
mbed_official 87:085cde657901 809 /* Set initial data PID. */
mbed_official 87:085cde657901 810 if (ep_type == EP_TYPE_BULK )
mbed_official 87:085cde657901 811 {
mbed_official 87:085cde657901 812 ep->data_pid_start = 0;
mbed_official 87:085cde657901 813 }
mbed_official 87:085cde657901 814
mbed_official 87:085cde657901 815 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 816 USB_ActivateEndpoint(hpcd->Instance , ep);
mbed_official 87:085cde657901 817 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 818 return ret;
mbed_official 87:085cde657901 819 }
mbed_official 87:085cde657901 820
mbed_official 87:085cde657901 821
mbed_official 87:085cde657901 822 /**
mbed_official 87:085cde657901 823 * @brief Deactivate an endpoint
mbed_official 87:085cde657901 824 * @param hpcd: PCD handle
mbed_official 87:085cde657901 825 * @param ep_addr: endpoint address
mbed_official 87:085cde657901 826 * @retval HAL status
mbed_official 87:085cde657901 827 */
mbed_official 87:085cde657901 828 HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 87:085cde657901 829 {
mbed_official 87:085cde657901 830 USB_OTG_EPTypeDef *ep;
mbed_official 87:085cde657901 831
mbed_official 87:085cde657901 832 if ((ep_addr & 0x80) == 0x80)
mbed_official 87:085cde657901 833 {
mbed_official 87:085cde657901 834 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 87:085cde657901 835 }
mbed_official 87:085cde657901 836 else
mbed_official 87:085cde657901 837 {
mbed_official 87:085cde657901 838 ep = &hpcd->OUT_ep[ep_addr & 0x7F];
mbed_official 87:085cde657901 839 }
mbed_official 87:085cde657901 840 ep->num = ep_addr & 0x7F;
mbed_official 87:085cde657901 841
mbed_official 87:085cde657901 842 ep->is_in = (0x80 & ep_addr) != 0;
mbed_official 87:085cde657901 843
mbed_official 87:085cde657901 844 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 845 USB_DeactivateEndpoint(hpcd->Instance , ep);
mbed_official 87:085cde657901 846 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 847 return HAL_OK;
mbed_official 87:085cde657901 848 }
mbed_official 87:085cde657901 849
mbed_official 87:085cde657901 850
mbed_official 87:085cde657901 851 /**
mbed_official 87:085cde657901 852 * @brief Receive an amount of data
mbed_official 87:085cde657901 853 * @param hpcd: PCD handle
mbed_official 87:085cde657901 854 * @param ep_addr: endpoint address
mbed_official 87:085cde657901 855 * @param pBuf: pointer to the reception buffer
mbed_official 87:085cde657901 856 * @param len: amount of data to be received
mbed_official 87:085cde657901 857 * @retval HAL status
mbed_official 87:085cde657901 858 */
mbed_official 87:085cde657901 859 HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
mbed_official 87:085cde657901 860 {
mbed_official 87:085cde657901 861
mbed_official 87:085cde657901 862 USB_OTG_EPTypeDef *ep;
mbed_official 87:085cde657901 863
mbed_official 87:085cde657901 864 ep = &hpcd->OUT_ep[ep_addr & 0x7F];
mbed_official 87:085cde657901 865
mbed_official 87:085cde657901 866 /*setup and start the Xfer */
mbed_official 87:085cde657901 867 ep->xfer_buff = pBuf;
mbed_official 87:085cde657901 868 ep->xfer_len = len;
mbed_official 87:085cde657901 869 ep->xfer_count = 0;
mbed_official 87:085cde657901 870 ep->is_in = 0;
mbed_official 87:085cde657901 871 ep->num = ep_addr & 0x7F;
mbed_official 87:085cde657901 872
mbed_official 87:085cde657901 873 if (hpcd->Init.dma_enable == 1)
mbed_official 87:085cde657901 874 {
mbed_official 87:085cde657901 875 ep->dma_addr = (uint32_t)pBuf;
mbed_official 87:085cde657901 876 }
mbed_official 87:085cde657901 877
mbed_official 87:085cde657901 878 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 879
mbed_official 87:085cde657901 880 if ((ep_addr & 0x7F) == 0 )
mbed_official 87:085cde657901 881 {
mbed_official 87:085cde657901 882 USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
mbed_official 87:085cde657901 883 }
mbed_official 87:085cde657901 884 else
mbed_official 87:085cde657901 885 {
mbed_official 87:085cde657901 886 USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
mbed_official 87:085cde657901 887 }
mbed_official 87:085cde657901 888 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 889
mbed_official 87:085cde657901 890 return HAL_OK;
mbed_official 87:085cde657901 891 }
mbed_official 87:085cde657901 892
mbed_official 87:085cde657901 893 /**
mbed_official 87:085cde657901 894 * @brief Get Received Data Size
mbed_official 87:085cde657901 895 * @param hpcd: PCD handle
mbed_official 87:085cde657901 896 * @param ep_addr: endpoint address
mbed_official 87:085cde657901 897 * @retval Data Size
mbed_official 87:085cde657901 898 */
mbed_official 87:085cde657901 899 uint16_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 87:085cde657901 900 {
mbed_official 87:085cde657901 901 return hpcd->OUT_ep[ep_addr & 0x7F].xfer_count;
mbed_official 87:085cde657901 902 }
mbed_official 87:085cde657901 903 /**
mbed_official 87:085cde657901 904 * @brief Send an amount of data
mbed_official 87:085cde657901 905 * @param hpcd: PCD handle
mbed_official 87:085cde657901 906 * @param ep_addr: endpoint address
mbed_official 87:085cde657901 907 * @param pBuf: pointer to the transmission buffer
mbed_official 87:085cde657901 908 * @param len: amount of data to be sent
mbed_official 87:085cde657901 909 * @retval HAL status
mbed_official 87:085cde657901 910 */
mbed_official 87:085cde657901 911 HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
mbed_official 87:085cde657901 912 {
mbed_official 87:085cde657901 913 USB_OTG_EPTypeDef *ep;
mbed_official 87:085cde657901 914
mbed_official 87:085cde657901 915 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 87:085cde657901 916
mbed_official 87:085cde657901 917 /*setup and start the Xfer */
mbed_official 87:085cde657901 918 ep->xfer_buff = pBuf;
mbed_official 87:085cde657901 919 ep->xfer_len = len;
mbed_official 87:085cde657901 920 ep->xfer_count = 0;
mbed_official 87:085cde657901 921 ep->is_in = 1;
mbed_official 87:085cde657901 922 ep->num = ep_addr & 0x7F;
mbed_official 87:085cde657901 923
mbed_official 87:085cde657901 924 if (hpcd->Init.dma_enable == 1)
mbed_official 87:085cde657901 925 {
mbed_official 87:085cde657901 926 ep->dma_addr = (uint32_t)pBuf;
mbed_official 87:085cde657901 927 }
mbed_official 87:085cde657901 928
mbed_official 87:085cde657901 929 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 930
mbed_official 87:085cde657901 931 if ((ep_addr & 0x7F) == 0 )
mbed_official 87:085cde657901 932 {
mbed_official 87:085cde657901 933 USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
mbed_official 87:085cde657901 934 }
mbed_official 87:085cde657901 935 else
mbed_official 87:085cde657901 936 {
mbed_official 87:085cde657901 937 USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
mbed_official 87:085cde657901 938 }
mbed_official 87:085cde657901 939
mbed_official 87:085cde657901 940 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 941
mbed_official 87:085cde657901 942 return HAL_OK;
mbed_official 87:085cde657901 943 }
mbed_official 87:085cde657901 944
mbed_official 87:085cde657901 945 /**
mbed_official 87:085cde657901 946 * @brief Set a STALL condition over an endpoint
mbed_official 87:085cde657901 947 * @param hpcd: PCD handle
mbed_official 87:085cde657901 948 * @param ep_addr: endpoint address
mbed_official 87:085cde657901 949 * @retval HAL status
mbed_official 87:085cde657901 950 */
mbed_official 87:085cde657901 951 HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 87:085cde657901 952 {
mbed_official 87:085cde657901 953 USB_OTG_EPTypeDef *ep;
mbed_official 87:085cde657901 954
mbed_official 87:085cde657901 955 if ((0x80 & ep_addr) == 0x80)
mbed_official 87:085cde657901 956 {
mbed_official 87:085cde657901 957 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 87:085cde657901 958 }
mbed_official 87:085cde657901 959 else
mbed_official 87:085cde657901 960 {
mbed_official 87:085cde657901 961 ep = &hpcd->OUT_ep[ep_addr];
mbed_official 87:085cde657901 962 }
mbed_official 87:085cde657901 963
mbed_official 87:085cde657901 964 ep->is_stall = 1;
mbed_official 87:085cde657901 965 ep->num = ep_addr & 0x7F;
mbed_official 87:085cde657901 966 ep->is_in = ((ep_addr & 0x80) == 0x80);
mbed_official 87:085cde657901 967
mbed_official 87:085cde657901 968
mbed_official 87:085cde657901 969 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 970 USB_EPSetStall(hpcd->Instance , ep);
mbed_official 87:085cde657901 971 if((ep_addr & 0x7F) == 0)
mbed_official 87:085cde657901 972 {
mbed_official 87:085cde657901 973 USB_EP0_OutStart(hpcd->Instance, hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup);
mbed_official 87:085cde657901 974 }
mbed_official 87:085cde657901 975 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 976
mbed_official 87:085cde657901 977 return HAL_OK;
mbed_official 87:085cde657901 978 }
mbed_official 87:085cde657901 979
mbed_official 87:085cde657901 980 /**
mbed_official 87:085cde657901 981 * @brief Clear a STALL condition over in an endpoint
mbed_official 87:085cde657901 982 * @param hpcd: PCD handle
mbed_official 87:085cde657901 983 * @param ep_addr: endpoint address
mbed_official 87:085cde657901 984 * @retval HAL status
mbed_official 87:085cde657901 985 */
mbed_official 87:085cde657901 986 HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 87:085cde657901 987 {
mbed_official 87:085cde657901 988 USB_OTG_EPTypeDef *ep;
mbed_official 87:085cde657901 989
mbed_official 87:085cde657901 990 if ((0x80 & ep_addr) == 0x80)
mbed_official 87:085cde657901 991 {
mbed_official 87:085cde657901 992 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 87:085cde657901 993 }
mbed_official 87:085cde657901 994 else
mbed_official 87:085cde657901 995 {
mbed_official 87:085cde657901 996 ep = &hpcd->OUT_ep[ep_addr];
mbed_official 87:085cde657901 997 }
mbed_official 87:085cde657901 998
mbed_official 87:085cde657901 999 ep->is_stall = 0;
mbed_official 87:085cde657901 1000 ep->num = ep_addr & 0x7F;
mbed_official 87:085cde657901 1001 ep->is_in = ((ep_addr & 0x80) == 0x80);
mbed_official 87:085cde657901 1002
mbed_official 87:085cde657901 1003 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 1004 USB_EPClearStall(hpcd->Instance , ep);
mbed_official 87:085cde657901 1005 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 1006
mbed_official 87:085cde657901 1007 return HAL_OK;
mbed_official 87:085cde657901 1008 }
mbed_official 87:085cde657901 1009
mbed_official 87:085cde657901 1010 /**
mbed_official 87:085cde657901 1011 * @brief Flush an endpoint
mbed_official 87:085cde657901 1012 * @param hpcd: PCD handle
mbed_official 87:085cde657901 1013 * @param ep_addr: endpoint address
mbed_official 87:085cde657901 1014 * @retval HAL status
mbed_official 87:085cde657901 1015 */
mbed_official 87:085cde657901 1016 HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 87:085cde657901 1017 {
mbed_official 87:085cde657901 1018 __HAL_LOCK(hpcd);
mbed_official 87:085cde657901 1019
mbed_official 87:085cde657901 1020 if ((ep_addr & 0x80) == 0x80)
mbed_official 87:085cde657901 1021 {
mbed_official 87:085cde657901 1022 USB_FlushTxFifo(hpcd->Instance, ep_addr & 0x7F);
mbed_official 87:085cde657901 1023 }
mbed_official 87:085cde657901 1024 else
mbed_official 87:085cde657901 1025 {
mbed_official 87:085cde657901 1026 USB_FlushRxFifo(hpcd->Instance);
mbed_official 87:085cde657901 1027 }
mbed_official 87:085cde657901 1028
mbed_official 87:085cde657901 1029 __HAL_UNLOCK(hpcd);
mbed_official 87:085cde657901 1030
mbed_official 87:085cde657901 1031 return HAL_OK;
mbed_official 87:085cde657901 1032 }
mbed_official 87:085cde657901 1033
mbed_official 87:085cde657901 1034 /**
mbed_official 87:085cde657901 1035 * @brief Update FIFO configuration
mbed_official 87:085cde657901 1036 * @param hpcd: PCD handle
mbed_official 87:085cde657901 1037 * @retval status
mbed_official 87:085cde657901 1038 */
mbed_official 87:085cde657901 1039 HAL_StatusTypeDef HAL_PCD_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size)
mbed_official 87:085cde657901 1040 {
mbed_official 87:085cde657901 1041 uint8_t i = 0;
mbed_official 87:085cde657901 1042 uint32_t Tx_Offset = 0;
mbed_official 87:085cde657901 1043
mbed_official 87:085cde657901 1044
mbed_official 87:085cde657901 1045 /* TXn min size = 16 words. (n : Transmit FIFO index)
mbed_official 87:085cde657901 1046 * When a TxFIFO is not used, the Configuration should be as follows:
mbed_official 87:085cde657901 1047 * case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes)
mbed_official 87:085cde657901 1048 * --> Txm can use the space allocated for Txn.
mbed_official 87:085cde657901 1049 * case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes)
mbed_official 87:085cde657901 1050 * --> Txn should be configured with the minimum space of 16 words
mbed_official 87:085cde657901 1051 * The FIFO is used optimally when used TxFIFOs are allocated in the top
mbed_official 87:085cde657901 1052 * of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones.
mbed_official 87:085cde657901 1053 * When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */
mbed_official 87:085cde657901 1054
mbed_official 87:085cde657901 1055 Tx_Offset = hpcd->Instance->GRXFSIZ;
mbed_official 87:085cde657901 1056
mbed_official 87:085cde657901 1057 for (i = 0; i < fifo; i++)
mbed_official 87:085cde657901 1058 {
mbed_official 87:085cde657901 1059 Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16);
mbed_official 87:085cde657901 1060 }
mbed_official 87:085cde657901 1061
mbed_official 87:085cde657901 1062 /* Multiply Tx_Size by 2 to get higher performance */
mbed_official 87:085cde657901 1063 hpcd->Instance->DIEPTXF[fifo] = (size << 16) | Tx_Offset;
mbed_official 87:085cde657901 1064
mbed_official 87:085cde657901 1065 return HAL_OK;
mbed_official 87:085cde657901 1066 }
mbed_official 87:085cde657901 1067
mbed_official 87:085cde657901 1068 /**
mbed_official 87:085cde657901 1069 * @brief Update FIFO configuration
mbed_official 87:085cde657901 1070 * @param hpcd: PCD handle
mbed_official 87:085cde657901 1071 * @retval status
mbed_official 87:085cde657901 1072 */
mbed_official 87:085cde657901 1073 HAL_StatusTypeDef HAL_PCD_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size)
mbed_official 87:085cde657901 1074 {
mbed_official 87:085cde657901 1075
mbed_official 87:085cde657901 1076 hpcd->Instance->GRXFSIZ = size;
mbed_official 87:085cde657901 1077
mbed_official 87:085cde657901 1078 return HAL_OK;
mbed_official 87:085cde657901 1079 }
mbed_official 87:085cde657901 1080
mbed_official 87:085cde657901 1081 /**
mbed_official 87:085cde657901 1082 * @}
mbed_official 87:085cde657901 1083 */
mbed_official 87:085cde657901 1084
mbed_official 87:085cde657901 1085 /** @defgroup PCD_Group4 Peripheral State functions
mbed_official 87:085cde657901 1086 * @brief Peripheral State functions
mbed_official 87:085cde657901 1087 *
mbed_official 87:085cde657901 1088 @verbatim
mbed_official 87:085cde657901 1089 ===============================================================================
mbed_official 87:085cde657901 1090 ##### Peripheral State functions #####
mbed_official 87:085cde657901 1091 ===============================================================================
mbed_official 87:085cde657901 1092 [..]
mbed_official 87:085cde657901 1093 This subsection permit to get in run-time the status of the peripheral
mbed_official 87:085cde657901 1094 and the data flow.
mbed_official 87:085cde657901 1095
mbed_official 87:085cde657901 1096 @endverbatim
mbed_official 87:085cde657901 1097 * @{
mbed_official 87:085cde657901 1098 */
mbed_official 87:085cde657901 1099
mbed_official 87:085cde657901 1100 /**
mbed_official 87:085cde657901 1101 * @brief Return the PCD state
mbed_official 87:085cde657901 1102 * @param hpcd : PCD handle
mbed_official 87:085cde657901 1103 * @retval HAL state
mbed_official 87:085cde657901 1104 */
mbed_official 87:085cde657901 1105 PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd)
mbed_official 87:085cde657901 1106 {
mbed_official 87:085cde657901 1107 return hpcd->State;
mbed_official 87:085cde657901 1108 }
mbed_official 87:085cde657901 1109 /**
mbed_official 87:085cde657901 1110 * @}
mbed_official 87:085cde657901 1111 */
mbed_official 87:085cde657901 1112
mbed_official 87:085cde657901 1113 /**
mbed_official 87:085cde657901 1114 * @brief DCD_WriteEmptyTxFifo
mbed_official 87:085cde657901 1115 * check FIFO for the next packet to be loaded
mbed_official 87:085cde657901 1116 * @param hpcd: PCD handle
mbed_official 87:085cde657901 1117 * @retval status
mbed_official 87:085cde657901 1118 */
mbed_official 87:085cde657901 1119 static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
mbed_official 87:085cde657901 1120 {
mbed_official 87:085cde657901 1121 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
mbed_official 87:085cde657901 1122 USB_OTG_EPTypeDef *ep;
mbed_official 87:085cde657901 1123 uint32_t len = 0;
mbed_official 87:085cde657901 1124 uint32_t len32b;
mbed_official 87:085cde657901 1125
mbed_official 87:085cde657901 1126 ep = &hpcd->IN_ep[epnum];
mbed_official 87:085cde657901 1127 len = ep->xfer_len - ep->xfer_count;
mbed_official 87:085cde657901 1128
mbed_official 87:085cde657901 1129 if (len > ep->maxpacket)
mbed_official 87:085cde657901 1130 {
mbed_official 87:085cde657901 1131 len = ep->maxpacket;
mbed_official 87:085cde657901 1132 }
mbed_official 87:085cde657901 1133
mbed_official 87:085cde657901 1134 len32b = (len + 3) / 4;
mbed_official 87:085cde657901 1135
mbed_official 87:085cde657901 1136 while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b &&
mbed_official 87:085cde657901 1137 ep->xfer_count < ep->xfer_len &&
mbed_official 87:085cde657901 1138 ep->xfer_len != 0)
mbed_official 87:085cde657901 1139 {
mbed_official 87:085cde657901 1140 /* Write the FIFO */
mbed_official 87:085cde657901 1141 len = ep->xfer_len - ep->xfer_count;
mbed_official 87:085cde657901 1142
mbed_official 87:085cde657901 1143 if (len > ep->maxpacket)
mbed_official 87:085cde657901 1144 {
mbed_official 87:085cde657901 1145 len = ep->maxpacket;
mbed_official 87:085cde657901 1146 }
mbed_official 87:085cde657901 1147 len32b = (len + 3) / 4;
mbed_official 87:085cde657901 1148
mbed_official 87:085cde657901 1149 USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable);
mbed_official 87:085cde657901 1150
mbed_official 87:085cde657901 1151 ep->xfer_buff += len;
mbed_official 87:085cde657901 1152 ep->xfer_count += len;
mbed_official 87:085cde657901 1153 }
mbed_official 87:085cde657901 1154
mbed_official 87:085cde657901 1155 return HAL_OK;
mbed_official 87:085cde657901 1156 }
mbed_official 87:085cde657901 1157
mbed_official 87:085cde657901 1158 /**
mbed_official 87:085cde657901 1159 * @}
mbed_official 87:085cde657901 1160 */
mbed_official 87:085cde657901 1161
mbed_official 87:085cde657901 1162 #endif /* HAL_PCD_MODULE_ENABLED */
mbed_official 87:085cde657901 1163 /**
mbed_official 87:085cde657901 1164 * @}
mbed_official 87:085cde657901 1165 */
mbed_official 87:085cde657901 1166
mbed_official 87:085cde657901 1167 /**
mbed_official 87:085cde657901 1168 * @}
mbed_official 87:085cde657901 1169 */
mbed_official 87:085cde657901 1170
mbed_official 87:085cde657901 1171 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/