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:
Wed Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Parent:
573:ad23fe03a082
Child:
610:813dcc80987e
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

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

Initial version of drivers for SAMR21

Who changed what in which revision?

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