mbed library sources

Dependents:   bare

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Wed Feb 26 09:45:12 2014 +0000
Revision:
106:ced8cbb51063
Parent:
87:085cde657901
Synchronized with git revision 4222735eff5868389433f0e9271976b39c8115cd

Full URL: https://github.com/mbedmicro/mbed/commit/4222735eff5868389433f0e9271976b39c8115cd/

[NUCLEO_xxx] Update STM32CubeF4 driver V1.0.0 + update license

Who changed what in which revision?

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