mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Thu Jul 02 16:30:08 2015 +0100
Revision:
581:39197bcd20f2
Parent:
532:fe11edbda85c
Child:
613:bc40b8d2aec4
Synchronized with git revision ae2d3cdffe70184eb8736d94f76c45c93f4b7724

Full URL: https://github.com/mbedmicro/mbed/commit/ae2d3cdffe70184eb8736d94f76c45c93f4b7724/

Make it possible to build the core mbed library with yotta

Who changed what in which revision?

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