mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Aug 20 10:45:13 2015 +0100
Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
Synchronized with git revision 92ca8c7b60a283b6bb60eb65b183dac1599f0ade

Full URL: https://github.com/mbedmicro/mbed/commit/92ca8c7b60a283b6bb60eb65b183dac1599f0ade/

Nordic: update application start address in GCC linker script

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 613:bc40b8d2aec4 5 * @version V1.3.2
mbed_official 613:bc40b8d2aec4 6 * @date 26-June-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 613:bc40b8d2aec4 27 (#) Call HAL_PCD_Init() API to initialize the PCD 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 613:bc40b8d2aec4 31 (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
mbed_official 613:bc40b8d2aec4 32 (+++) __HAL_RCC_USB_OTG_HS_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 613:bc40b8d2aec4 41 (#)Enable PCD 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 613:bc40b8d2aec4 131 * parameters in the PCD_InitTypeDef and initialize 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 613:bc40b8d2aec4 140 if(hpcd == 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 613:bc40b8d2aec4 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 613:bc40b8d2aec4 215 if(hpcd == 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 613:bc40b8d2aec4 261 /** @defgroup PCD_Exported_Functions_Group2 Input and Output 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 613:bc40b8d2aec4 306 * @brief 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 613:bc40b8d2aec4 463
mbed_official 532:fe11edbda85c 464 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT);
mbed_official 235:685d5f11838f 465 }
mbed_official 235:685d5f11838f 466
mbed_official 235:685d5f11838f 467 /* Handle Suspend Interrupt */
mbed_official 235:685d5f11838f 468 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP))
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 613:bc40b8d2aec4 540 hpcd->Instance->GUSBCFG |= (uint32_t)((USBD_HS_TRDT_VALUE << 10) & USB_OTG_GUSBCFG_TRDT);
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 613:bc40b8d2aec4 546 hpcd->Instance->GUSBCFG |= (uint32_t)((USBD_FS_TRDT_VALUE << 10) & USB_OTG_GUSBCFG_TRDT);
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 613:bc40b8d2aec4 558
mbed_official 235:685d5f11838f 559 temp = USBx->GRXSTSP;
mbed_official 613:bc40b8d2aec4 560
mbed_official 235:685d5f11838f 561 ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM];
mbed_official 235:685d5f11838f 562
mbed_official 235:685d5f11838f 563 if(((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT)
mbed_official 235:685d5f11838f 564 {
mbed_official 235:685d5f11838f 565 if((temp & USB_OTG_GRXSTSP_BCNT) != 0)
mbed_official 235:685d5f11838f 566 {
mbed_official 235:685d5f11838f 567 USB_ReadPacket(USBx, ep->xfer_buff, (temp & USB_OTG_GRXSTSP_BCNT) >> 4);
mbed_official 235:685d5f11838f 568 ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
mbed_official 235:685d5f11838f 569 ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
mbed_official 235:685d5f11838f 570 }
mbed_official 235:685d5f11838f 571 }
mbed_official 235:685d5f11838f 572 else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT)
mbed_official 235:685d5f11838f 573 {
mbed_official 235:685d5f11838f 574 USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8);
mbed_official 235:685d5f11838f 575 ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;
mbed_official 235:685d5f11838f 576 }
mbed_official 235:685d5f11838f 577 USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);
mbed_official 235:685d5f11838f 578 }
mbed_official 235:685d5f11838f 579
mbed_official 235:685d5f11838f 580 /* Handle SOF Interrupt */
mbed_official 235:685d5f11838f 581 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF))
mbed_official 235:685d5f11838f 582 {
mbed_official 235:685d5f11838f 583 HAL_PCD_SOFCallback(hpcd);
mbed_official 235:685d5f11838f 584 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF);
mbed_official 235:685d5f11838f 585 }
mbed_official 235:685d5f11838f 586
mbed_official 235:685d5f11838f 587 /* Handle Incomplete ISO IN Interrupt */
mbed_official 235:685d5f11838f 588 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR))
mbed_official 235:685d5f11838f 589 {
mbed_official 235:685d5f11838f 590 HAL_PCD_ISOINIncompleteCallback(hpcd, epnum);
mbed_official 235:685d5f11838f 591 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR);
mbed_official 235:685d5f11838f 592 }
mbed_official 235:685d5f11838f 593
mbed_official 235:685d5f11838f 594 /* Handle Incomplete ISO OUT Interrupt */
mbed_official 235:685d5f11838f 595 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))
mbed_official 235:685d5f11838f 596 {
mbed_official 235:685d5f11838f 597 HAL_PCD_ISOOUTIncompleteCallback(hpcd, epnum);
mbed_official 235:685d5f11838f 598 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);
mbed_official 235:685d5f11838f 599 }
mbed_official 235:685d5f11838f 600
mbed_official 235:685d5f11838f 601 /* Handle Connection event Interrupt */
mbed_official 235:685d5f11838f 602 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT))
mbed_official 235:685d5f11838f 603 {
mbed_official 235:685d5f11838f 604 HAL_PCD_ConnectCallback(hpcd);
mbed_official 235:685d5f11838f 605 __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT);
mbed_official 235:685d5f11838f 606 }
mbed_official 235:685d5f11838f 607
mbed_official 235:685d5f11838f 608 /* Handle Disconnection event Interrupt */
mbed_official 235:685d5f11838f 609 if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT))
mbed_official 235:685d5f11838f 610 {
mbed_official 235:685d5f11838f 611 temp = hpcd->Instance->GOTGINT;
mbed_official 235:685d5f11838f 612
mbed_official 235:685d5f11838f 613 if((temp & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET)
mbed_official 235:685d5f11838f 614 {
mbed_official 235:685d5f11838f 615 HAL_PCD_DisconnectCallback(hpcd);
mbed_official 235:685d5f11838f 616 }
mbed_official 235:685d5f11838f 617 hpcd->Instance->GOTGINT |= temp;
mbed_official 235:685d5f11838f 618 }
mbed_official 235:685d5f11838f 619 }
mbed_official 235:685d5f11838f 620 }
mbed_official 235:685d5f11838f 621
mbed_official 235:685d5f11838f 622 /**
mbed_official 613:bc40b8d2aec4 623 * @brief Data OUT stage callback.
mbed_official 235:685d5f11838f 624 * @param hpcd: PCD handle
mbed_official 532:fe11edbda85c 625 * @param epnum: endpoint number
mbed_official 235:685d5f11838f 626 * @retval None
mbed_official 235:685d5f11838f 627 */
mbed_official 235:685d5f11838f 628 __weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 235:685d5f11838f 629 {
mbed_official 235:685d5f11838f 630 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 631 the HAL_PCD_DataOutStageCallback could be implemented in the user file
mbed_official 235:685d5f11838f 632 */
mbed_official 235:685d5f11838f 633 }
mbed_official 235:685d5f11838f 634
mbed_official 235:685d5f11838f 635 /**
mbed_official 613:bc40b8d2aec4 636 * @brief Data IN stage callback.
mbed_official 235:685d5f11838f 637 * @param hpcd: PCD handle
mbed_official 532:fe11edbda85c 638 * @param epnum: endpoint number
mbed_official 235:685d5f11838f 639 * @retval None
mbed_official 235:685d5f11838f 640 */
mbed_official 235:685d5f11838f 641 __weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 235:685d5f11838f 642 {
mbed_official 235:685d5f11838f 643 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 644 the HAL_PCD_DataInStageCallback could be implemented in the user file
mbed_official 235:685d5f11838f 645 */
mbed_official 235:685d5f11838f 646 }
mbed_official 235:685d5f11838f 647 /**
mbed_official 613:bc40b8d2aec4 648 * @brief Setup stage callback.
mbed_official 235:685d5f11838f 649 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 650 * @retval None
mbed_official 235:685d5f11838f 651 */
mbed_official 235:685d5f11838f 652 __weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 653 {
mbed_official 235:685d5f11838f 654 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 655 the HAL_PCD_SetupStageCallback could be implemented in the user file
mbed_official 235:685d5f11838f 656 */
mbed_official 235:685d5f11838f 657 }
mbed_official 235:685d5f11838f 658
mbed_official 235:685d5f11838f 659 /**
mbed_official 613:bc40b8d2aec4 660 * @brief USB Start Of Frame callback.
mbed_official 235:685d5f11838f 661 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 662 * @retval None
mbed_official 235:685d5f11838f 663 */
mbed_official 235:685d5f11838f 664 __weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 665 {
mbed_official 235:685d5f11838f 666 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 667 the HAL_PCD_SOFCallback could be implemented in the user file
mbed_official 235:685d5f11838f 668 */
mbed_official 235:685d5f11838f 669 }
mbed_official 235:685d5f11838f 670
mbed_official 235:685d5f11838f 671 /**
mbed_official 613:bc40b8d2aec4 672 * @brief USB Reset callback.
mbed_official 235:685d5f11838f 673 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 674 * @retval None
mbed_official 235:685d5f11838f 675 */
mbed_official 235:685d5f11838f 676 __weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 677 {
mbed_official 235:685d5f11838f 678 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 679 the HAL_PCD_ResetCallback could be implemented in the user file
mbed_official 235:685d5f11838f 680 */
mbed_official 235:685d5f11838f 681 }
mbed_official 235:685d5f11838f 682
mbed_official 235:685d5f11838f 683 /**
mbed_official 613:bc40b8d2aec4 684 * @brief Suspend event callback.
mbed_official 235:685d5f11838f 685 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 686 * @retval None
mbed_official 235:685d5f11838f 687 */
mbed_official 235:685d5f11838f 688 __weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 689 {
mbed_official 235:685d5f11838f 690 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 691 the HAL_PCD_SuspendCallback could be implemented in the user file
mbed_official 235:685d5f11838f 692 */
mbed_official 235:685d5f11838f 693 }
mbed_official 235:685d5f11838f 694
mbed_official 235:685d5f11838f 695 /**
mbed_official 613:bc40b8d2aec4 696 * @brief Resume event callback.
mbed_official 235:685d5f11838f 697 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 698 * @retval None
mbed_official 235:685d5f11838f 699 */
mbed_official 235:685d5f11838f 700 __weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 701 {
mbed_official 235:685d5f11838f 702 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 703 the HAL_PCD_ResumeCallback could be implemented in the user file
mbed_official 235:685d5f11838f 704 */
mbed_official 235:685d5f11838f 705 }
mbed_official 235:685d5f11838f 706
mbed_official 235:685d5f11838f 707 /**
mbed_official 613:bc40b8d2aec4 708 * @brief Incomplete ISO OUT callback.
mbed_official 235:685d5f11838f 709 * @param hpcd: PCD handle
mbed_official 532:fe11edbda85c 710 * @param epnum: endpoint number
mbed_official 235:685d5f11838f 711 * @retval None
mbed_official 235:685d5f11838f 712 */
mbed_official 235:685d5f11838f 713 __weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 235:685d5f11838f 714 {
mbed_official 235:685d5f11838f 715 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 716 the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file
mbed_official 235:685d5f11838f 717 */
mbed_official 235:685d5f11838f 718 }
mbed_official 235:685d5f11838f 719
mbed_official 235:685d5f11838f 720 /**
mbed_official 613:bc40b8d2aec4 721 * @brief Incomplete ISO IN callback.
mbed_official 235:685d5f11838f 722 * @param hpcd: PCD handle
mbed_official 532:fe11edbda85c 723 * @param epnum: endpoint number
mbed_official 235:685d5f11838f 724 * @retval None
mbed_official 235:685d5f11838f 725 */
mbed_official 235:685d5f11838f 726 __weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 235:685d5f11838f 727 {
mbed_official 235:685d5f11838f 728 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 729 the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file
mbed_official 235:685d5f11838f 730 */
mbed_official 235:685d5f11838f 731 }
mbed_official 235:685d5f11838f 732
mbed_official 235:685d5f11838f 733 /**
mbed_official 613:bc40b8d2aec4 734 * @brief Connection event callback.
mbed_official 235:685d5f11838f 735 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 736 * @retval None
mbed_official 235:685d5f11838f 737 */
mbed_official 235:685d5f11838f 738 __weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 739 {
mbed_official 235:685d5f11838f 740 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 741 the HAL_PCD_ConnectCallback could be implemented in the user file
mbed_official 235:685d5f11838f 742 */
mbed_official 235:685d5f11838f 743 }
mbed_official 235:685d5f11838f 744
mbed_official 235:685d5f11838f 745 /**
mbed_official 613:bc40b8d2aec4 746 * @brief Disconnection event callback.
mbed_official 235:685d5f11838f 747 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 748 * @retval None
mbed_official 235:685d5f11838f 749 */
mbed_official 235:685d5f11838f 750 __weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 751 {
mbed_official 235:685d5f11838f 752 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 532:fe11edbda85c 753 the HAL_PCD_DisconnectCallback could be implemented in the user file
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 235:685d5f11838f 759 */
mbed_official 532:fe11edbda85c 760
mbed_official 532:fe11edbda85c 761 /** @defgroup PCD_Exported_Functions_Group3 Peripheral Control functions
mbed_official 532:fe11edbda85c 762 * @brief management functions
mbed_official 235:685d5f11838f 763 *
mbed_official 532:fe11edbda85c 764 @verbatim
mbed_official 235:685d5f11838f 765 ===============================================================================
mbed_official 235:685d5f11838f 766 ##### Peripheral Control functions #####
mbed_official 235:685d5f11838f 767 ===============================================================================
mbed_official 235:685d5f11838f 768 [..]
mbed_official 235:685d5f11838f 769 This subsection provides a set of functions allowing to control the PCD data
mbed_official 235:685d5f11838f 770 transfers.
mbed_official 235:685d5f11838f 771
mbed_official 235:685d5f11838f 772 @endverbatim
mbed_official 235:685d5f11838f 773 * @{
mbed_official 235:685d5f11838f 774 */
mbed_official 235:685d5f11838f 775
mbed_official 235:685d5f11838f 776 /**
mbed_official 613:bc40b8d2aec4 777 * @brief Connect the USB device.
mbed_official 235:685d5f11838f 778 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 779 * @retval HAL status
mbed_official 235:685d5f11838f 780 */
mbed_official 235:685d5f11838f 781 HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 782 {
mbed_official 235:685d5f11838f 783 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 784 USB_DevConnect(hpcd->Instance);
mbed_official 235:685d5f11838f 785 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 786 return HAL_OK;
mbed_official 235:685d5f11838f 787 }
mbed_official 235:685d5f11838f 788
mbed_official 235:685d5f11838f 789 /**
mbed_official 613:bc40b8d2aec4 790 * @brief Disconnect the USB device.
mbed_official 235:685d5f11838f 791 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 792 * @retval HAL status
mbed_official 235:685d5f11838f 793 */
mbed_official 235:685d5f11838f 794 HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 795 {
mbed_official 235:685d5f11838f 796 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 797 USB_DevDisconnect(hpcd->Instance);
mbed_official 235:685d5f11838f 798 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 799 return HAL_OK;
mbed_official 235:685d5f11838f 800 }
mbed_official 235:685d5f11838f 801
mbed_official 235:685d5f11838f 802 /**
mbed_official 613:bc40b8d2aec4 803 * @brief Set the USB Device address.
mbed_official 235:685d5f11838f 804 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 805 * @param address: new device address
mbed_official 235:685d5f11838f 806 * @retval HAL status
mbed_official 235:685d5f11838f 807 */
mbed_official 235:685d5f11838f 808 HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address)
mbed_official 235:685d5f11838f 809 {
mbed_official 235:685d5f11838f 810 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 811 USB_SetDevAddress(hpcd->Instance, address);
mbed_official 235:685d5f11838f 812 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 813 return HAL_OK;
mbed_official 235:685d5f11838f 814 }
mbed_official 235:685d5f11838f 815 /**
mbed_official 613:bc40b8d2aec4 816 * @brief Open and configure an endpoint.
mbed_official 235:685d5f11838f 817 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 818 * @param ep_addr: endpoint address
mbed_official 532:fe11edbda85c 819 * @param ep_mps: endpoint max packet size
mbed_official 235:685d5f11838f 820 * @param ep_type: endpoint type
mbed_official 235:685d5f11838f 821 * @retval HAL status
mbed_official 235:685d5f11838f 822 */
mbed_official 235:685d5f11838f 823 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 824 {
mbed_official 235:685d5f11838f 825 HAL_StatusTypeDef ret = HAL_OK;
mbed_official 235:685d5f11838f 826 USB_OTG_EPTypeDef *ep;
mbed_official 235:685d5f11838f 827
mbed_official 235:685d5f11838f 828 if ((ep_addr & 0x80) == 0x80)
mbed_official 235:685d5f11838f 829 {
mbed_official 235:685d5f11838f 830 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 235:685d5f11838f 831 }
mbed_official 235:685d5f11838f 832 else
mbed_official 235:685d5f11838f 833 {
mbed_official 235:685d5f11838f 834 ep = &hpcd->OUT_ep[ep_addr & 0x7F];
mbed_official 235:685d5f11838f 835 }
mbed_official 235:685d5f11838f 836 ep->num = ep_addr & 0x7F;
mbed_official 235:685d5f11838f 837
mbed_official 235:685d5f11838f 838 ep->is_in = (0x80 & ep_addr) != 0;
mbed_official 235:685d5f11838f 839 ep->maxpacket = ep_mps;
mbed_official 235:685d5f11838f 840 ep->type = ep_type;
mbed_official 235:685d5f11838f 841 if (ep->is_in)
mbed_official 235:685d5f11838f 842 {
mbed_official 235:685d5f11838f 843 /* Assign a Tx FIFO */
mbed_official 235:685d5f11838f 844 ep->tx_fifo_num = ep->num;
mbed_official 235:685d5f11838f 845 }
mbed_official 235:685d5f11838f 846 /* Set initial data PID. */
mbed_official 235:685d5f11838f 847 if (ep_type == EP_TYPE_BULK )
mbed_official 235:685d5f11838f 848 {
mbed_official 235:685d5f11838f 849 ep->data_pid_start = 0;
mbed_official 235:685d5f11838f 850 }
mbed_official 235:685d5f11838f 851
mbed_official 235:685d5f11838f 852 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 853 USB_ActivateEndpoint(hpcd->Instance , ep);
mbed_official 235:685d5f11838f 854 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 855 return ret;
mbed_official 235:685d5f11838f 856 }
mbed_official 235:685d5f11838f 857
mbed_official 235:685d5f11838f 858
mbed_official 235:685d5f11838f 859 /**
mbed_official 613:bc40b8d2aec4 860 * @brief Deactivate an endpoint.
mbed_official 235:685d5f11838f 861 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 862 * @param ep_addr: endpoint address
mbed_official 235:685d5f11838f 863 * @retval HAL status
mbed_official 235:685d5f11838f 864 */
mbed_official 235:685d5f11838f 865 HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 235:685d5f11838f 866 {
mbed_official 235:685d5f11838f 867 USB_OTG_EPTypeDef *ep;
mbed_official 235:685d5f11838f 868
mbed_official 235:685d5f11838f 869 if ((ep_addr & 0x80) == 0x80)
mbed_official 235:685d5f11838f 870 {
mbed_official 235:685d5f11838f 871 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 235:685d5f11838f 872 }
mbed_official 235:685d5f11838f 873 else
mbed_official 235:685d5f11838f 874 {
mbed_official 235:685d5f11838f 875 ep = &hpcd->OUT_ep[ep_addr & 0x7F];
mbed_official 235:685d5f11838f 876 }
mbed_official 235:685d5f11838f 877 ep->num = ep_addr & 0x7F;
mbed_official 235:685d5f11838f 878
mbed_official 235:685d5f11838f 879 ep->is_in = (0x80 & ep_addr) != 0;
mbed_official 235:685d5f11838f 880
mbed_official 235:685d5f11838f 881 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 882 USB_DeactivateEndpoint(hpcd->Instance , ep);
mbed_official 235:685d5f11838f 883 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 884 return HAL_OK;
mbed_official 235:685d5f11838f 885 }
mbed_official 235:685d5f11838f 886
mbed_official 235:685d5f11838f 887
mbed_official 235:685d5f11838f 888 /**
mbed_official 613:bc40b8d2aec4 889 * @brief Receive an amount of data.
mbed_official 235:685d5f11838f 890 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 891 * @param ep_addr: endpoint address
mbed_official 235:685d5f11838f 892 * @param pBuf: pointer to the reception buffer
mbed_official 235:685d5f11838f 893 * @param len: amount of data to be received
mbed_official 235:685d5f11838f 894 * @retval HAL status
mbed_official 235:685d5f11838f 895 */
mbed_official 235:685d5f11838f 896 HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
mbed_official 235:685d5f11838f 897 {
mbed_official 235:685d5f11838f 898 USB_OTG_EPTypeDef *ep;
mbed_official 235:685d5f11838f 899
mbed_official 235:685d5f11838f 900 ep = &hpcd->OUT_ep[ep_addr & 0x7F];
mbed_official 235:685d5f11838f 901
mbed_official 235:685d5f11838f 902 /*setup and start the Xfer */
mbed_official 235:685d5f11838f 903 ep->xfer_buff = pBuf;
mbed_official 235:685d5f11838f 904 ep->xfer_len = len;
mbed_official 235:685d5f11838f 905 ep->xfer_count = 0;
mbed_official 235:685d5f11838f 906 ep->is_in = 0;
mbed_official 235:685d5f11838f 907 ep->num = ep_addr & 0x7F;
mbed_official 235:685d5f11838f 908
mbed_official 235:685d5f11838f 909 if (hpcd->Init.dma_enable == 1)
mbed_official 235:685d5f11838f 910 {
mbed_official 235:685d5f11838f 911 ep->dma_addr = (uint32_t)pBuf;
mbed_official 235:685d5f11838f 912 }
mbed_official 235:685d5f11838f 913
mbed_official 235:685d5f11838f 914 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 915
mbed_official 235:685d5f11838f 916 if ((ep_addr & 0x7F) == 0 )
mbed_official 235:685d5f11838f 917 {
mbed_official 235:685d5f11838f 918 USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
mbed_official 235:685d5f11838f 919 }
mbed_official 235:685d5f11838f 920 else
mbed_official 235:685d5f11838f 921 {
mbed_official 235:685d5f11838f 922 USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
mbed_official 235:685d5f11838f 923 }
mbed_official 235:685d5f11838f 924 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 925
mbed_official 235:685d5f11838f 926 return HAL_OK;
mbed_official 235:685d5f11838f 927 }
mbed_official 235:685d5f11838f 928
mbed_official 235:685d5f11838f 929 /**
mbed_official 613:bc40b8d2aec4 930 * @brief Get Received Data Size.
mbed_official 235:685d5f11838f 931 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 932 * @param ep_addr: endpoint address
mbed_official 235:685d5f11838f 933 * @retval Data Size
mbed_official 235:685d5f11838f 934 */
mbed_official 235:685d5f11838f 935 uint16_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 235:685d5f11838f 936 {
mbed_official 235:685d5f11838f 937 return hpcd->OUT_ep[ep_addr & 0x7F].xfer_count;
mbed_official 235:685d5f11838f 938 }
mbed_official 235:685d5f11838f 939 /**
mbed_official 613:bc40b8d2aec4 940 * @brief Send an amount of data.
mbed_official 235:685d5f11838f 941 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 942 * @param ep_addr: endpoint address
mbed_official 235:685d5f11838f 943 * @param pBuf: pointer to the transmission buffer
mbed_official 235:685d5f11838f 944 * @param len: amount of data to be sent
mbed_official 235:685d5f11838f 945 * @retval HAL status
mbed_official 235:685d5f11838f 946 */
mbed_official 235:685d5f11838f 947 HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
mbed_official 235:685d5f11838f 948 {
mbed_official 235:685d5f11838f 949 USB_OTG_EPTypeDef *ep;
mbed_official 235:685d5f11838f 950
mbed_official 235:685d5f11838f 951 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 235:685d5f11838f 952
mbed_official 235:685d5f11838f 953 /*setup and start the Xfer */
mbed_official 235:685d5f11838f 954 ep->xfer_buff = pBuf;
mbed_official 235:685d5f11838f 955 ep->xfer_len = len;
mbed_official 235:685d5f11838f 956 ep->xfer_count = 0;
mbed_official 235:685d5f11838f 957 ep->is_in = 1;
mbed_official 235:685d5f11838f 958 ep->num = ep_addr & 0x7F;
mbed_official 235:685d5f11838f 959
mbed_official 235:685d5f11838f 960 if (hpcd->Init.dma_enable == 1)
mbed_official 235:685d5f11838f 961 {
mbed_official 235:685d5f11838f 962 ep->dma_addr = (uint32_t)pBuf;
mbed_official 235:685d5f11838f 963 }
mbed_official 235:685d5f11838f 964
mbed_official 235:685d5f11838f 965 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 966
mbed_official 235:685d5f11838f 967 if ((ep_addr & 0x7F) == 0 )
mbed_official 235:685d5f11838f 968 {
mbed_official 235:685d5f11838f 969 USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
mbed_official 235:685d5f11838f 970 }
mbed_official 235:685d5f11838f 971 else
mbed_official 235:685d5f11838f 972 {
mbed_official 235:685d5f11838f 973 USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
mbed_official 235:685d5f11838f 974 }
mbed_official 235:685d5f11838f 975
mbed_official 235:685d5f11838f 976 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 977
mbed_official 235:685d5f11838f 978 return HAL_OK;
mbed_official 235:685d5f11838f 979 }
mbed_official 235:685d5f11838f 980
mbed_official 235:685d5f11838f 981 /**
mbed_official 613:bc40b8d2aec4 982 * @brief Set a STALL condition over an endpoint.
mbed_official 235:685d5f11838f 983 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 984 * @param ep_addr: endpoint address
mbed_official 235:685d5f11838f 985 * @retval HAL status
mbed_official 235:685d5f11838f 986 */
mbed_official 235:685d5f11838f 987 HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 235:685d5f11838f 988 {
mbed_official 235:685d5f11838f 989 USB_OTG_EPTypeDef *ep;
mbed_official 235:685d5f11838f 990
mbed_official 235:685d5f11838f 991 if ((0x80 & ep_addr) == 0x80)
mbed_official 235:685d5f11838f 992 {
mbed_official 235:685d5f11838f 993 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 235:685d5f11838f 994 }
mbed_official 235:685d5f11838f 995 else
mbed_official 235:685d5f11838f 996 {
mbed_official 235:685d5f11838f 997 ep = &hpcd->OUT_ep[ep_addr];
mbed_official 235:685d5f11838f 998 }
mbed_official 235:685d5f11838f 999
mbed_official 235:685d5f11838f 1000 ep->is_stall = 1;
mbed_official 235:685d5f11838f 1001 ep->num = ep_addr & 0x7F;
mbed_official 235:685d5f11838f 1002 ep->is_in = ((ep_addr & 0x80) == 0x80);
mbed_official 235:685d5f11838f 1003
mbed_official 235:685d5f11838f 1004
mbed_official 235:685d5f11838f 1005 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 1006 USB_EPSetStall(hpcd->Instance , ep);
mbed_official 235:685d5f11838f 1007 if((ep_addr & 0x7F) == 0)
mbed_official 235:685d5f11838f 1008 {
mbed_official 235:685d5f11838f 1009 USB_EP0_OutStart(hpcd->Instance, hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup);
mbed_official 235:685d5f11838f 1010 }
mbed_official 235:685d5f11838f 1011 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 1012
mbed_official 235:685d5f11838f 1013 return HAL_OK;
mbed_official 235:685d5f11838f 1014 }
mbed_official 235:685d5f11838f 1015
mbed_official 235:685d5f11838f 1016 /**
mbed_official 613:bc40b8d2aec4 1017 * @brief Clear a STALL condition over in an endpoint.
mbed_official 235:685d5f11838f 1018 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 1019 * @param ep_addr: endpoint address
mbed_official 235:685d5f11838f 1020 * @retval HAL status
mbed_official 235:685d5f11838f 1021 */
mbed_official 235:685d5f11838f 1022 HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 235:685d5f11838f 1023 {
mbed_official 235:685d5f11838f 1024 USB_OTG_EPTypeDef *ep;
mbed_official 235:685d5f11838f 1025
mbed_official 235:685d5f11838f 1026 if ((0x80 & ep_addr) == 0x80)
mbed_official 235:685d5f11838f 1027 {
mbed_official 235:685d5f11838f 1028 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 235:685d5f11838f 1029 }
mbed_official 235:685d5f11838f 1030 else
mbed_official 235:685d5f11838f 1031 {
mbed_official 235:685d5f11838f 1032 ep = &hpcd->OUT_ep[ep_addr];
mbed_official 235:685d5f11838f 1033 }
mbed_official 235:685d5f11838f 1034
mbed_official 235:685d5f11838f 1035 ep->is_stall = 0;
mbed_official 235:685d5f11838f 1036 ep->num = ep_addr & 0x7F;
mbed_official 235:685d5f11838f 1037 ep->is_in = ((ep_addr & 0x80) == 0x80);
mbed_official 235:685d5f11838f 1038
mbed_official 235:685d5f11838f 1039 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 1040 USB_EPClearStall(hpcd->Instance , ep);
mbed_official 235:685d5f11838f 1041 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 1042
mbed_official 235:685d5f11838f 1043 return HAL_OK;
mbed_official 235:685d5f11838f 1044 }
mbed_official 235:685d5f11838f 1045
mbed_official 235:685d5f11838f 1046 /**
mbed_official 613:bc40b8d2aec4 1047 * @brief Flush an endpoint.
mbed_official 235:685d5f11838f 1048 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 1049 * @param ep_addr: endpoint address
mbed_official 235:685d5f11838f 1050 * @retval HAL status
mbed_official 235:685d5f11838f 1051 */
mbed_official 235:685d5f11838f 1052 HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 235:685d5f11838f 1053 {
mbed_official 235:685d5f11838f 1054 __HAL_LOCK(hpcd);
mbed_official 235:685d5f11838f 1055
mbed_official 235:685d5f11838f 1056 if ((ep_addr & 0x80) == 0x80)
mbed_official 235:685d5f11838f 1057 {
mbed_official 235:685d5f11838f 1058 USB_FlushTxFifo(hpcd->Instance, ep_addr & 0x7F);
mbed_official 235:685d5f11838f 1059 }
mbed_official 235:685d5f11838f 1060 else
mbed_official 235:685d5f11838f 1061 {
mbed_official 235:685d5f11838f 1062 USB_FlushRxFifo(hpcd->Instance);
mbed_official 235:685d5f11838f 1063 }
mbed_official 235:685d5f11838f 1064
mbed_official 235:685d5f11838f 1065 __HAL_UNLOCK(hpcd);
mbed_official 235:685d5f11838f 1066
mbed_official 235:685d5f11838f 1067 return HAL_OK;
mbed_official 235:685d5f11838f 1068 }
mbed_official 235:685d5f11838f 1069
mbed_official 235:685d5f11838f 1070 /**
mbed_official 613:bc40b8d2aec4 1071 * @brief Activate remote wakeup signalling.
mbed_official 235:685d5f11838f 1072 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 1073 * @retval HAL status
mbed_official 235:685d5f11838f 1074 */
mbed_official 532:fe11edbda85c 1075 HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 1076 {
mbed_official 235:685d5f11838f 1077 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
mbed_official 235:685d5f11838f 1078
mbed_official 235:685d5f11838f 1079 if((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)
mbed_official 235:685d5f11838f 1080 {
mbed_official 613:bc40b8d2aec4 1081 /* Activate Remote wakeup signaling */
mbed_official 235:685d5f11838f 1082 USBx_DEVICE->DCTL |= USB_OTG_DCTL_RWUSIG;
mbed_official 235:685d5f11838f 1083 }
mbed_official 235:685d5f11838f 1084 return HAL_OK;
mbed_official 235:685d5f11838f 1085 }
mbed_official 235:685d5f11838f 1086
mbed_official 235:685d5f11838f 1087 /**
mbed_official 613:bc40b8d2aec4 1088 * @brief De-activate remote wakeup signalling.
mbed_official 235:685d5f11838f 1089 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 1090 * @retval HAL status
mbed_official 235:685d5f11838f 1091 */
mbed_official 532:fe11edbda85c 1092 HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 1093 {
mbed_official 235:685d5f11838f 1094 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
mbed_official 235:685d5f11838f 1095
mbed_official 613:bc40b8d2aec4 1096 /* De-activate Remote wakeup signaling */
mbed_official 532:fe11edbda85c 1097 USBx_DEVICE->DCTL &= ~(USB_OTG_DCTL_RWUSIG);
mbed_official 235:685d5f11838f 1098 return HAL_OK;
mbed_official 235:685d5f11838f 1099 }
mbed_official 235:685d5f11838f 1100 /**
mbed_official 235:685d5f11838f 1101 * @}
mbed_official 235:685d5f11838f 1102 */
mbed_official 235:685d5f11838f 1103
mbed_official 532:fe11edbda85c 1104 /** @defgroup PCD_Exported_Functions_Group4 Peripheral State functions
mbed_official 532:fe11edbda85c 1105 * @brief Peripheral State functions
mbed_official 235:685d5f11838f 1106 *
mbed_official 532:fe11edbda85c 1107 @verbatim
mbed_official 235:685d5f11838f 1108 ===============================================================================
mbed_official 235:685d5f11838f 1109 ##### Peripheral State functions #####
mbed_official 235:685d5f11838f 1110 ===============================================================================
mbed_official 235:685d5f11838f 1111 [..]
mbed_official 235:685d5f11838f 1112 This subsection permits to get in run-time the status of the peripheral
mbed_official 235:685d5f11838f 1113 and the data flow.
mbed_official 235:685d5f11838f 1114
mbed_official 235:685d5f11838f 1115 @endverbatim
mbed_official 235:685d5f11838f 1116 * @{
mbed_official 235:685d5f11838f 1117 */
mbed_official 235:685d5f11838f 1118
mbed_official 235:685d5f11838f 1119 /**
mbed_official 613:bc40b8d2aec4 1120 * @brief Return the PCD handle state.
mbed_official 235:685d5f11838f 1121 * @param hpcd: PCD handle
mbed_official 235:685d5f11838f 1122 * @retval HAL state
mbed_official 235:685d5f11838f 1123 */
mbed_official 235:685d5f11838f 1124 PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd)
mbed_official 235:685d5f11838f 1125 {
mbed_official 235:685d5f11838f 1126 return hpcd->State;
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 235:685d5f11838f 1132 /**
mbed_official 532:fe11edbda85c 1133 * @}
mbed_official 532:fe11edbda85c 1134 */
mbed_official 532:fe11edbda85c 1135
mbed_official 532:fe11edbda85c 1136 /* Private functions ---------------------------------------------------------*/
mbed_official 532:fe11edbda85c 1137 /** @addtogroup PCD_Private_Functions
mbed_official 532:fe11edbda85c 1138 * @{
mbed_official 532:fe11edbda85c 1139 */
mbed_official 532:fe11edbda85c 1140
mbed_official 532:fe11edbda85c 1141 /**
mbed_official 613:bc40b8d2aec4 1142 * @brief 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****/