mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Tue Jun 24 14:45:08 2014 +0100
Revision:
237:f3da66175598
Child:
375:3d36234a1087
Synchronized with git revision 8ef659bca81f12dfc896b5a7af7c2abbd1a1b8b7

Full URL: https://github.com/mbedmicro/mbed/commit/8ef659bca81f12dfc896b5a7af7c2abbd1a1b8b7/

[NUCLEO_F334R8] Add platform files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 237:f3da66175598 1 /**
mbed_official 237:f3da66175598 2 ******************************************************************************
mbed_official 237:f3da66175598 3 * @file stm32f3xx_hal_pcd.c
mbed_official 237:f3da66175598 4 * @author MCD Application Team
mbed_official 237:f3da66175598 5 * @version V1.0.1
mbed_official 237:f3da66175598 6 * @date 18-June-2014
mbed_official 237:f3da66175598 7 * @brief PCD HAL module driver.
mbed_official 237:f3da66175598 8 * This file provides firmware functions to manage the following
mbed_official 237:f3da66175598 9 * functionalities of the USB Peripheral Controller:
mbed_official 237:f3da66175598 10 * + Initialization and de-initialization functions
mbed_official 237:f3da66175598 11 * + IO operation functions
mbed_official 237:f3da66175598 12 * + Peripheral Control functions
mbed_official 237:f3da66175598 13 * + Peripheral State functions
mbed_official 237:f3da66175598 14 *
mbed_official 237:f3da66175598 15 @verbatim
mbed_official 237:f3da66175598 16 ==============================================================================
mbed_official 237:f3da66175598 17 ##### How to use this driver #####
mbed_official 237:f3da66175598 18 ==============================================================================
mbed_official 237:f3da66175598 19 [..]
mbed_official 237:f3da66175598 20 The PCD HAL driver can be used as follows:
mbed_official 237:f3da66175598 21
mbed_official 237:f3da66175598 22 (#) Declare a PCD_HandleTypeDef handle structure, for example:
mbed_official 237:f3da66175598 23 PCD_HandleTypeDef hpcd;
mbed_official 237:f3da66175598 24
mbed_official 237:f3da66175598 25 (#) Fill parameters of Init structure in HCD handle
mbed_official 237:f3da66175598 26
mbed_official 237:f3da66175598 27 (#) Call HAL_PCD_Init() API to initialize the HCD peripheral (Core, Device core, ...)
mbed_official 237:f3da66175598 28
mbed_official 237:f3da66175598 29 (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API:
mbed_official 237:f3da66175598 30 (##) Enable the PCD/USB Low Level interface clock using
mbed_official 237:f3da66175598 31 (+++) __USB_CLK_ENABLE);
mbed_official 237:f3da66175598 32
mbed_official 237:f3da66175598 33 (##) Initialize the related GPIO clocks
mbed_official 237:f3da66175598 34 (##) Configure PCD pin-out
mbed_official 237:f3da66175598 35 (##) Configure PCD NVIC interrupt
mbed_official 237:f3da66175598 36
mbed_official 237:f3da66175598 37 (#)Associate the Upper USB device stack to the HAL PCD Driver:
mbed_official 237:f3da66175598 38 (##) hpcd.pData = pdev;
mbed_official 237:f3da66175598 39
mbed_official 237:f3da66175598 40 (#)Enable HCD transmission and reception:
mbed_official 237:f3da66175598 41 (##) HAL_PCD_Start();
mbed_official 237:f3da66175598 42
mbed_official 237:f3da66175598 43 @endverbatim
mbed_official 237:f3da66175598 44 ******************************************************************************
mbed_official 237:f3da66175598 45 * @attention
mbed_official 237:f3da66175598 46 *
mbed_official 237:f3da66175598 47 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 237:f3da66175598 48 *
mbed_official 237:f3da66175598 49 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 237:f3da66175598 50 * are permitted provided that the following conditions are met:
mbed_official 237:f3da66175598 51 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 237:f3da66175598 52 * this list of conditions and the following disclaimer.
mbed_official 237:f3da66175598 53 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 237:f3da66175598 54 * this list of conditions and the following disclaimer in the documentation
mbed_official 237:f3da66175598 55 * and/or other materials provided with the distribution.
mbed_official 237:f3da66175598 56 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 237:f3da66175598 57 * may be used to endorse or promote products derived from this software
mbed_official 237:f3da66175598 58 * without specific prior written permission.
mbed_official 237:f3da66175598 59 *
mbed_official 237:f3da66175598 60 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 237:f3da66175598 61 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 237:f3da66175598 62 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 237:f3da66175598 63 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 237:f3da66175598 64 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 237:f3da66175598 65 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 237:f3da66175598 66 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 237:f3da66175598 67 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 237:f3da66175598 68 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 237:f3da66175598 69 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 237:f3da66175598 70 *
mbed_official 237:f3da66175598 71 ******************************************************************************
mbed_official 237:f3da66175598 72 */
mbed_official 237:f3da66175598 73
mbed_official 237:f3da66175598 74 /* Includes ------------------------------------------------------------------*/
mbed_official 237:f3da66175598 75 #include "stm32f3xx_hal.h"
mbed_official 237:f3da66175598 76
mbed_official 237:f3da66175598 77 /** @addtogroup STM32F3xx_HAL_Driver
mbed_official 237:f3da66175598 78 * @{
mbed_official 237:f3da66175598 79 */
mbed_official 237:f3da66175598 80
mbed_official 237:f3da66175598 81 /** @defgroup PCD
mbed_official 237:f3da66175598 82 * @brief PCD HAL module driver
mbed_official 237:f3da66175598 83 * @{
mbed_official 237:f3da66175598 84 */
mbed_official 237:f3da66175598 85
mbed_official 237:f3da66175598 86 #ifdef HAL_PCD_MODULE_ENABLED
mbed_official 237:f3da66175598 87
mbed_official 237:f3da66175598 88 #if defined(STM32F302x8) || defined(STM32F302xC) || \
mbed_official 237:f3da66175598 89 defined(STM32F303xC) || defined(STM32F373xC)
mbed_official 237:f3da66175598 90
mbed_official 237:f3da66175598 91 /* Private typedef -----------------------------------------------------------*/
mbed_official 237:f3da66175598 92 /* Private define ------------------------------------------------------------*/
mbed_official 237:f3da66175598 93 #define BTABLE_ADDRESS (0x000)
mbed_official 237:f3da66175598 94 /* Private macro -------------------------------------------------------------*/
mbed_official 237:f3da66175598 95 /* Private variables ---------------------------------------------------------*/
mbed_official 237:f3da66175598 96 /* Private function prototypes -----------------------------------------------*/
mbed_official 237:f3da66175598 97 static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd);
mbed_official 237:f3da66175598 98 /* Private functions ---------------------------------------------------------*/
mbed_official 237:f3da66175598 99
mbed_official 237:f3da66175598 100
mbed_official 237:f3da66175598 101 /** @defgroup PCD_Private_Functions
mbed_official 237:f3da66175598 102 * @{
mbed_official 237:f3da66175598 103 */
mbed_official 237:f3da66175598 104
mbed_official 237:f3da66175598 105 /** @defgroup PCD_Group1 Initialization and de-initialization functions
mbed_official 237:f3da66175598 106 * @brief Initialization and Configuration functions
mbed_official 237:f3da66175598 107 *
mbed_official 237:f3da66175598 108 @verbatim
mbed_official 237:f3da66175598 109 ===============================================================================
mbed_official 237:f3da66175598 110 ##### Initialization and de-initialization functions #####
mbed_official 237:f3da66175598 111 ===============================================================================
mbed_official 237:f3da66175598 112 [..] This section provides functions allowing to:
mbed_official 237:f3da66175598 113
mbed_official 237:f3da66175598 114 @endverbatim
mbed_official 237:f3da66175598 115 * @{
mbed_official 237:f3da66175598 116 */
mbed_official 237:f3da66175598 117
mbed_official 237:f3da66175598 118 /**
mbed_official 237:f3da66175598 119 * @brief Initializes the PCD according to the specified
mbed_official 237:f3da66175598 120 * parameters in the PCD_InitTypeDef and create the associated handle.
mbed_official 237:f3da66175598 121 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 122 * @retval HAL status
mbed_official 237:f3da66175598 123 */
mbed_official 237:f3da66175598 124 HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 125 {
mbed_official 237:f3da66175598 126 uint32_t i = 0;
mbed_official 237:f3da66175598 127
mbed_official 237:f3da66175598 128 uint32_t wInterrupt_Mask = 0;
mbed_official 237:f3da66175598 129
mbed_official 237:f3da66175598 130 /* Check the PCD handle allocation */
mbed_official 237:f3da66175598 131 if(hpcd == NULL)
mbed_official 237:f3da66175598 132 {
mbed_official 237:f3da66175598 133 return HAL_ERROR;
mbed_official 237:f3da66175598 134 }
mbed_official 237:f3da66175598 135
mbed_official 237:f3da66175598 136 /* Check the parameters */
mbed_official 237:f3da66175598 137 assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance));
mbed_official 237:f3da66175598 138
mbed_official 237:f3da66175598 139 hpcd->State = PCD_BUSY;
mbed_official 237:f3da66175598 140
mbed_official 237:f3da66175598 141 /* Init the low level hardware : GPIO, CLOCK, NVIC... */
mbed_official 237:f3da66175598 142 HAL_PCD_MspInit(hpcd);
mbed_official 237:f3da66175598 143
mbed_official 237:f3da66175598 144 /* Init endpoints structures */
mbed_official 237:f3da66175598 145 for (i = 0; i < hpcd->Init.dev_endpoints ; i++)
mbed_official 237:f3da66175598 146 {
mbed_official 237:f3da66175598 147 /* Init ep structure */
mbed_official 237:f3da66175598 148 hpcd->IN_ep[i].is_in = 1;
mbed_official 237:f3da66175598 149 hpcd->IN_ep[i].num = i;
mbed_official 237:f3da66175598 150 /* Control until ep is actvated */
mbed_official 237:f3da66175598 151 hpcd->IN_ep[i].type = PCD_EP_TYPE_CTRL;
mbed_official 237:f3da66175598 152 hpcd->IN_ep[i].maxpacket = 0;
mbed_official 237:f3da66175598 153 hpcd->IN_ep[i].xfer_buff = 0;
mbed_official 237:f3da66175598 154 hpcd->IN_ep[i].xfer_len = 0;
mbed_official 237:f3da66175598 155 }
mbed_official 237:f3da66175598 156
mbed_official 237:f3da66175598 157 for (i = 0; i < hpcd->Init.dev_endpoints ; i++)
mbed_official 237:f3da66175598 158 {
mbed_official 237:f3da66175598 159 hpcd->OUT_ep[i].is_in = 0;
mbed_official 237:f3da66175598 160 hpcd->OUT_ep[i].num = i;
mbed_official 237:f3da66175598 161 /* Control until ep is activated */
mbed_official 237:f3da66175598 162 hpcd->OUT_ep[i].type = PCD_EP_TYPE_CTRL;
mbed_official 237:f3da66175598 163 hpcd->OUT_ep[i].maxpacket = 0;
mbed_official 237:f3da66175598 164 hpcd->OUT_ep[i].xfer_buff = 0;
mbed_official 237:f3da66175598 165 hpcd->OUT_ep[i].xfer_len = 0;
mbed_official 237:f3da66175598 166 }
mbed_official 237:f3da66175598 167
mbed_official 237:f3da66175598 168 /* Init Device */
mbed_official 237:f3da66175598 169 /*CNTR_FRES = 1*/
mbed_official 237:f3da66175598 170 hpcd->Instance->CNTR = USB_CNTR_FRES;
mbed_official 237:f3da66175598 171
mbed_official 237:f3da66175598 172 /*CNTR_FRES = 0*/
mbed_official 237:f3da66175598 173 hpcd->Instance->CNTR = 0;
mbed_official 237:f3da66175598 174
mbed_official 237:f3da66175598 175 /*Clear pending interrupts*/
mbed_official 237:f3da66175598 176 hpcd->Instance->ISTR = 0;
mbed_official 237:f3da66175598 177
mbed_official 237:f3da66175598 178 /*Set Btable Adress*/
mbed_official 237:f3da66175598 179 hpcd->Instance->BTABLE = BTABLE_ADDRESS;
mbed_official 237:f3da66175598 180
mbed_official 237:f3da66175598 181 /*set wInterrupt_Mask global variable*/
mbed_official 237:f3da66175598 182 wInterrupt_Mask = USB_CNTR_CTRM | USB_CNTR_WKUPM | USB_CNTR_SUSPM | USB_CNTR_ERRM \
mbed_official 237:f3da66175598 183 | USB_CNTR_ESOFM | USB_CNTR_RESETM;
mbed_official 237:f3da66175598 184
mbed_official 237:f3da66175598 185 /*Set interrupt mask*/
mbed_official 237:f3da66175598 186 hpcd->Instance->CNTR = wInterrupt_Mask;
mbed_official 237:f3da66175598 187
mbed_official 237:f3da66175598 188 hpcd->USB_Address = 0;
mbed_official 237:f3da66175598 189 hpcd->State= PCD_READY;
mbed_official 237:f3da66175598 190
mbed_official 237:f3da66175598 191 return HAL_OK;
mbed_official 237:f3da66175598 192 }
mbed_official 237:f3da66175598 193
mbed_official 237:f3da66175598 194 /**
mbed_official 237:f3da66175598 195 * @brief DeInitializes the PCD peripheral
mbed_official 237:f3da66175598 196 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 197 * @retval HAL status
mbed_official 237:f3da66175598 198 */
mbed_official 237:f3da66175598 199 HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 200 {
mbed_official 237:f3da66175598 201 /* Check the PCD handle allocation */
mbed_official 237:f3da66175598 202 if(hpcd == NULL)
mbed_official 237:f3da66175598 203 {
mbed_official 237:f3da66175598 204 return HAL_ERROR;
mbed_official 237:f3da66175598 205 }
mbed_official 237:f3da66175598 206
mbed_official 237:f3da66175598 207 hpcd->State = PCD_BUSY;
mbed_official 237:f3da66175598 208
mbed_official 237:f3da66175598 209 /* Stop Device */
mbed_official 237:f3da66175598 210 HAL_PCD_Stop(hpcd);
mbed_official 237:f3da66175598 211
mbed_official 237:f3da66175598 212 /* DeInit the low level hardware */
mbed_official 237:f3da66175598 213 HAL_PCD_MspDeInit(hpcd);
mbed_official 237:f3da66175598 214
mbed_official 237:f3da66175598 215 hpcd->State = PCD_READY;
mbed_official 237:f3da66175598 216
mbed_official 237:f3da66175598 217 return HAL_OK;
mbed_official 237:f3da66175598 218 }
mbed_official 237:f3da66175598 219
mbed_official 237:f3da66175598 220 /**
mbed_official 237:f3da66175598 221 * @brief Initializes the PCD MSP.
mbed_official 237:f3da66175598 222 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 223 * @retval None
mbed_official 237:f3da66175598 224 */
mbed_official 237:f3da66175598 225 __weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 226 {
mbed_official 237:f3da66175598 227 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 228 the HAL_PCD_MspInit could be implenetd in the user file
mbed_official 237:f3da66175598 229 */
mbed_official 237:f3da66175598 230 }
mbed_official 237:f3da66175598 231
mbed_official 237:f3da66175598 232 /**
mbed_official 237:f3da66175598 233 * @brief DeInitializes PCD MSP.
mbed_official 237:f3da66175598 234 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 235 * @retval None
mbed_official 237:f3da66175598 236 */
mbed_official 237:f3da66175598 237 __weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 238 {
mbed_official 237:f3da66175598 239 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 240 the HAL_PCD_MspDeInit could be implenetd in the user file
mbed_official 237:f3da66175598 241 */
mbed_official 237:f3da66175598 242 }
mbed_official 237:f3da66175598 243
mbed_official 237:f3da66175598 244 /**
mbed_official 237:f3da66175598 245 * @}
mbed_official 237:f3da66175598 246 */
mbed_official 237:f3da66175598 247
mbed_official 237:f3da66175598 248 /** @defgroup PCD_Group2 IO operation functions
mbed_official 237:f3da66175598 249 * @brief Data transfers functions
mbed_official 237:f3da66175598 250 *
mbed_official 237:f3da66175598 251 @verbatim
mbed_official 237:f3da66175598 252 ===============================================================================
mbed_official 237:f3da66175598 253 ##### IO operation functions #####
mbed_official 237:f3da66175598 254 ===============================================================================
mbed_official 237:f3da66175598 255 [..]
mbed_official 237:f3da66175598 256 This subsection provides a set of functions allowing to manage the PCD data
mbed_official 237:f3da66175598 257 transfers.
mbed_official 237:f3da66175598 258
mbed_official 237:f3da66175598 259 @endverbatim
mbed_official 237:f3da66175598 260 * @{
mbed_official 237:f3da66175598 261 */
mbed_official 237:f3da66175598 262
mbed_official 237:f3da66175598 263 /**
mbed_official 237:f3da66175598 264 * @brief Start The USB OTG Device.
mbed_official 237:f3da66175598 265 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 266 * @retval HAL status
mbed_official 237:f3da66175598 267 */
mbed_official 237:f3da66175598 268 HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 269 {
mbed_official 237:f3da66175598 270 /* DP Pull-Down is external */
mbed_official 237:f3da66175598 271 HAL_PCDEx_SetConnectionState (hpcd, 1);
mbed_official 237:f3da66175598 272
mbed_official 237:f3da66175598 273 return HAL_OK;
mbed_official 237:f3da66175598 274 }
mbed_official 237:f3da66175598 275
mbed_official 237:f3da66175598 276 /**
mbed_official 237:f3da66175598 277 * @brief Stop The USB OTG Device.
mbed_official 237:f3da66175598 278 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 279 * @retval HAL status
mbed_official 237:f3da66175598 280 */
mbed_official 237:f3da66175598 281 HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 282 {
mbed_official 237:f3da66175598 283 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 284
mbed_official 237:f3da66175598 285 /* disable all interrupts and force USB reset */
mbed_official 237:f3da66175598 286 hpcd->Instance->CNTR = USB_CNTR_FRES;
mbed_official 237:f3da66175598 287
mbed_official 237:f3da66175598 288 /* clear interrupt status register */
mbed_official 237:f3da66175598 289 hpcd->Instance->ISTR = 0;
mbed_official 237:f3da66175598 290
mbed_official 237:f3da66175598 291 /* switch-off device */
mbed_official 237:f3da66175598 292 hpcd->Instance->CNTR = (USB_CNTR_FRES | USB_CNTR_PDWN);
mbed_official 237:f3da66175598 293
mbed_official 237:f3da66175598 294 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 295 return HAL_OK;
mbed_official 237:f3da66175598 296 }
mbed_official 237:f3da66175598 297
mbed_official 237:f3da66175598 298 /**
mbed_official 237:f3da66175598 299 * @brief This function handles PCD Endpoint interrupt request.
mbed_official 237:f3da66175598 300 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 301 * @retval HAL status
mbed_official 237:f3da66175598 302 */
mbed_official 237:f3da66175598 303 static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 304 {
mbed_official 237:f3da66175598 305 PCD_EPTypeDef *ep;
mbed_official 237:f3da66175598 306 uint16_t count=0;
mbed_official 237:f3da66175598 307 uint8_t EPindex;
mbed_official 237:f3da66175598 308 __IO uint16_t wIstr;
mbed_official 237:f3da66175598 309 __IO uint16_t wEPVal = 0;
mbed_official 237:f3da66175598 310
mbed_official 237:f3da66175598 311 /* stay in loop while pending interrupts */
mbed_official 237:f3da66175598 312 while (((wIstr = hpcd->Instance->ISTR) & USB_ISTR_CTR) != 0)
mbed_official 237:f3da66175598 313 {
mbed_official 237:f3da66175598 314 /* extract highest priority endpoint number */
mbed_official 237:f3da66175598 315 EPindex = (uint8_t)(wIstr & USB_ISTR_EP_ID);
mbed_official 237:f3da66175598 316
mbed_official 237:f3da66175598 317 if (EPindex == 0)
mbed_official 237:f3da66175598 318 {
mbed_official 237:f3da66175598 319 /* Decode and service control endpoint interrupt */
mbed_official 237:f3da66175598 320
mbed_official 237:f3da66175598 321 /* DIR bit = origin of the interrupt */
mbed_official 237:f3da66175598 322 if ((wIstr & USB_ISTR_DIR) == 0)
mbed_official 237:f3da66175598 323 {
mbed_official 237:f3da66175598 324 /* DIR = 0 */
mbed_official 237:f3da66175598 325
mbed_official 237:f3da66175598 326 /* DIR = 0 => IN int */
mbed_official 237:f3da66175598 327 /* DIR = 0 implies that (EP_CTR_TX = 1) always */
mbed_official 237:f3da66175598 328 PCD_CLEAR_TX_EP_CTR(hpcd->Instance, PCD_ENDP0);
mbed_official 237:f3da66175598 329 ep = &hpcd->IN_ep[0];
mbed_official 237:f3da66175598 330
mbed_official 237:f3da66175598 331 ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 332 ep->xfer_buff += ep->xfer_count;
mbed_official 237:f3da66175598 333
mbed_official 237:f3da66175598 334 /* TX COMPLETE */
mbed_official 237:f3da66175598 335 HAL_PCD_DataInStageCallback(hpcd, 0);
mbed_official 237:f3da66175598 336
mbed_official 237:f3da66175598 337
mbed_official 237:f3da66175598 338 if((hpcd->USB_Address > 0)&& ( ep->xfer_len == 0))
mbed_official 237:f3da66175598 339 {
mbed_official 237:f3da66175598 340 hpcd->Instance->DADDR = (hpcd->USB_Address | USB_DADDR_EF);
mbed_official 237:f3da66175598 341 hpcd->USB_Address = 0;
mbed_official 237:f3da66175598 342 }
mbed_official 237:f3da66175598 343
mbed_official 237:f3da66175598 344 }
mbed_official 237:f3da66175598 345 else
mbed_official 237:f3da66175598 346 {
mbed_official 237:f3da66175598 347 /* DIR = 1 */
mbed_official 237:f3da66175598 348
mbed_official 237:f3da66175598 349 /* DIR = 1 & CTR_RX => SETUP or OUT int */
mbed_official 237:f3da66175598 350 /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */
mbed_official 237:f3da66175598 351 ep = &hpcd->OUT_ep[0];
mbed_official 237:f3da66175598 352 wEPVal = PCD_GET_ENDPOINT(hpcd->Instance, PCD_ENDP0);
mbed_official 237:f3da66175598 353
mbed_official 237:f3da66175598 354 if ((wEPVal & USB_EP_SETUP) != 0)
mbed_official 237:f3da66175598 355 {
mbed_official 237:f3da66175598 356 /* Get SETUP Packet*/
mbed_official 237:f3da66175598 357 ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 358 PCD_ReadPMA(hpcd->Instance, (uint8_t*)hpcd->Setup ,ep->pmaadress , ep->xfer_count);
mbed_official 237:f3da66175598 359 /* SETUP bit kept frozen while CTR_RX = 1*/
mbed_official 237:f3da66175598 360 PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0);
mbed_official 237:f3da66175598 361
mbed_official 237:f3da66175598 362 /* Process SETUP Packet*/
mbed_official 237:f3da66175598 363 HAL_PCD_SetupStageCallback(hpcd);
mbed_official 237:f3da66175598 364 }
mbed_official 237:f3da66175598 365
mbed_official 237:f3da66175598 366 else if ((wEPVal & USB_EP_CTR_RX) != 0)
mbed_official 237:f3da66175598 367 {
mbed_official 237:f3da66175598 368 PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0);
mbed_official 237:f3da66175598 369 /* Get Control Data OUT Packet*/
mbed_official 237:f3da66175598 370 ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 371
mbed_official 237:f3da66175598 372 if (ep->xfer_count != 0)
mbed_official 237:f3da66175598 373 {
mbed_official 237:f3da66175598 374 PCD_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, ep->xfer_count);
mbed_official 237:f3da66175598 375 ep->xfer_buff+=ep->xfer_count;
mbed_official 237:f3da66175598 376 }
mbed_official 237:f3da66175598 377
mbed_official 237:f3da66175598 378 /* Process Control Data OUT Packet*/
mbed_official 237:f3da66175598 379 HAL_PCD_DataOutStageCallback(hpcd, 0);
mbed_official 237:f3da66175598 380
mbed_official 237:f3da66175598 381 PCD_SET_EP_RX_CNT(hpcd->Instance, PCD_ENDP0, ep->maxpacket);
mbed_official 237:f3da66175598 382 PCD_SET_EP_RX_STATUS(hpcd->Instance, PCD_ENDP0, USB_EP_RX_VALID);
mbed_official 237:f3da66175598 383 }
mbed_official 237:f3da66175598 384 }
mbed_official 237:f3da66175598 385 }
mbed_official 237:f3da66175598 386 else
mbed_official 237:f3da66175598 387 {
mbed_official 237:f3da66175598 388
mbed_official 237:f3da66175598 389 /* Decode and service non control endpoints interrupt */
mbed_official 237:f3da66175598 390
mbed_official 237:f3da66175598 391 /* process related endpoint register */
mbed_official 237:f3da66175598 392 wEPVal = PCD_GET_ENDPOINT(hpcd->Instance, EPindex);
mbed_official 237:f3da66175598 393 if ((wEPVal & USB_EP_CTR_RX) != 0)
mbed_official 237:f3da66175598 394 {
mbed_official 237:f3da66175598 395 /* clear int flag */
mbed_official 237:f3da66175598 396 PCD_CLEAR_RX_EP_CTR(hpcd->Instance, EPindex);
mbed_official 237:f3da66175598 397 ep = &hpcd->OUT_ep[EPindex];
mbed_official 237:f3da66175598 398
mbed_official 237:f3da66175598 399 /* OUT double Buffering*/
mbed_official 237:f3da66175598 400 if (ep->doublebuffer == 0)
mbed_official 237:f3da66175598 401 {
mbed_official 237:f3da66175598 402 count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 403 if (count != 0)
mbed_official 237:f3da66175598 404 {
mbed_official 237:f3da66175598 405 PCD_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, count);
mbed_official 237:f3da66175598 406 }
mbed_official 237:f3da66175598 407 }
mbed_official 237:f3da66175598 408 else
mbed_official 237:f3da66175598 409 {
mbed_official 237:f3da66175598 410 if (PCD_GET_ENDPOINT(hpcd->Instance, ep->num) & USB_EP_DTOG_RX)
mbed_official 237:f3da66175598 411 {
mbed_official 237:f3da66175598 412 /*read from endpoint BUF0Addr buffer*/
mbed_official 237:f3da66175598 413 count = PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 414 if (count != 0)
mbed_official 237:f3da66175598 415 {
mbed_official 237:f3da66175598 416 PCD_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, count);
mbed_official 237:f3da66175598 417 }
mbed_official 237:f3da66175598 418 }
mbed_official 237:f3da66175598 419 else
mbed_official 237:f3da66175598 420 {
mbed_official 237:f3da66175598 421 /*read from endpoint BUF1Addr buffer*/
mbed_official 237:f3da66175598 422 count = PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 423 if (count != 0)
mbed_official 237:f3da66175598 424 {
mbed_official 237:f3da66175598 425 PCD_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, count);
mbed_official 237:f3da66175598 426 }
mbed_official 237:f3da66175598 427 }
mbed_official 237:f3da66175598 428 PCD_FreeUserBuffer(hpcd->Instance, ep->num, PCD_EP_DBUF_OUT);
mbed_official 237:f3da66175598 429 }
mbed_official 237:f3da66175598 430 /*multi-packet on the NON control OUT endpoint*/
mbed_official 237:f3da66175598 431 ep->xfer_count+=count;
mbed_official 237:f3da66175598 432 ep->xfer_buff+=count;
mbed_official 237:f3da66175598 433
mbed_official 237:f3da66175598 434 if ((ep->xfer_len == 0) || (count < ep->maxpacket))
mbed_official 237:f3da66175598 435 {
mbed_official 237:f3da66175598 436 /* RX COMPLETE */
mbed_official 237:f3da66175598 437 HAL_PCD_DataOutStageCallback(hpcd, ep->num);
mbed_official 237:f3da66175598 438 }
mbed_official 237:f3da66175598 439 else
mbed_official 237:f3da66175598 440 {
mbed_official 237:f3da66175598 441 HAL_PCD_EP_Receive(hpcd, ep->num, ep->xfer_buff, ep->xfer_len);
mbed_official 237:f3da66175598 442 }
mbed_official 237:f3da66175598 443
mbed_official 237:f3da66175598 444 } /* if((wEPVal & EP_CTR_RX) */
mbed_official 237:f3da66175598 445
mbed_official 237:f3da66175598 446 if ((wEPVal & USB_EP_CTR_TX) != 0)
mbed_official 237:f3da66175598 447 {
mbed_official 237:f3da66175598 448 ep = &hpcd->IN_ep[EPindex];
mbed_official 237:f3da66175598 449
mbed_official 237:f3da66175598 450 /* clear int flag */
mbed_official 237:f3da66175598 451 PCD_CLEAR_TX_EP_CTR(hpcd->Instance, EPindex);
mbed_official 237:f3da66175598 452
mbed_official 237:f3da66175598 453 /* IN double Buffering*/
mbed_official 237:f3da66175598 454 if (ep->doublebuffer == 0)
mbed_official 237:f3da66175598 455 {
mbed_official 237:f3da66175598 456 ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 457 if (ep->xfer_count != 0)
mbed_official 237:f3da66175598 458 {
mbed_official 237:f3da66175598 459 PCD_WritePMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, ep->xfer_count);
mbed_official 237:f3da66175598 460 }
mbed_official 237:f3da66175598 461 }
mbed_official 237:f3da66175598 462 else
mbed_official 237:f3da66175598 463 {
mbed_official 237:f3da66175598 464 if (PCD_GET_ENDPOINT(hpcd->Instance, ep->num) & USB_EP_DTOG_TX)
mbed_official 237:f3da66175598 465 {
mbed_official 237:f3da66175598 466 /*read from endpoint BUF0Addr buffer*/
mbed_official 237:f3da66175598 467 ep->xfer_count = PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 468 if (ep->xfer_count != 0)
mbed_official 237:f3da66175598 469 {
mbed_official 237:f3da66175598 470 PCD_WritePMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, ep->xfer_count);
mbed_official 237:f3da66175598 471 }
mbed_official 237:f3da66175598 472 }
mbed_official 237:f3da66175598 473 else
mbed_official 237:f3da66175598 474 {
mbed_official 237:f3da66175598 475 /*read from endpoint BUF1Addr buffer*/
mbed_official 237:f3da66175598 476 ep->xfer_count = PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 477 if (ep->xfer_count != 0)
mbed_official 237:f3da66175598 478 {
mbed_official 237:f3da66175598 479 PCD_WritePMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, ep->xfer_count);
mbed_official 237:f3da66175598 480 }
mbed_official 237:f3da66175598 481 }
mbed_official 237:f3da66175598 482 PCD_FreeUserBuffer(hpcd->Instance, ep->num, PCD_EP_DBUF_IN);
mbed_official 237:f3da66175598 483 }
mbed_official 237:f3da66175598 484 /*multi-packet on the NON control IN endpoint*/
mbed_official 237:f3da66175598 485 ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 486 ep->xfer_buff+=ep->xfer_count;
mbed_official 237:f3da66175598 487
mbed_official 237:f3da66175598 488 /* Zero Length Packet? */
mbed_official 237:f3da66175598 489 if (ep->xfer_len == 0)
mbed_official 237:f3da66175598 490 {
mbed_official 237:f3da66175598 491 /* TX COMPLETE */
mbed_official 237:f3da66175598 492 HAL_PCD_DataInStageCallback(hpcd, ep->num);
mbed_official 237:f3da66175598 493 }
mbed_official 237:f3da66175598 494 else
mbed_official 237:f3da66175598 495 {
mbed_official 237:f3da66175598 496 HAL_PCD_EP_Transmit(hpcd, ep->num, ep->xfer_buff, ep->xfer_len);
mbed_official 237:f3da66175598 497 }
mbed_official 237:f3da66175598 498 }
mbed_official 237:f3da66175598 499 }
mbed_official 237:f3da66175598 500 }
mbed_official 237:f3da66175598 501 return HAL_OK;
mbed_official 237:f3da66175598 502 }
mbed_official 237:f3da66175598 503 /**
mbed_official 237:f3da66175598 504 * @brief This function handles PCD interrupt request.
mbed_official 237:f3da66175598 505 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 506 * @retval HAL status
mbed_official 237:f3da66175598 507 */
mbed_official 237:f3da66175598 508 void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 509 {
mbed_official 237:f3da66175598 510 uint32_t wInterrupt_Mask = 0;
mbed_official 237:f3da66175598 511
mbed_official 237:f3da66175598 512 if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_CTR))
mbed_official 237:f3da66175598 513 {
mbed_official 237:f3da66175598 514 /* servicing of the endpoint correct transfer interrupt */
mbed_official 237:f3da66175598 515 /* clear of the CTR flag into the sub */
mbed_official 237:f3da66175598 516 PCD_EP_ISR_Handler(hpcd);
mbed_official 237:f3da66175598 517 }
mbed_official 237:f3da66175598 518
mbed_official 237:f3da66175598 519 if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_RESET))
mbed_official 237:f3da66175598 520 {
mbed_official 237:f3da66175598 521 __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_RESET);
mbed_official 237:f3da66175598 522 HAL_PCD_ResetCallback(hpcd);
mbed_official 237:f3da66175598 523 HAL_PCD_SetAddress(hpcd, 0);
mbed_official 237:f3da66175598 524 }
mbed_official 237:f3da66175598 525
mbed_official 237:f3da66175598 526 if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_PMAOVRM))
mbed_official 237:f3da66175598 527 {
mbed_official 237:f3da66175598 528 __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_PMAOVRM);
mbed_official 237:f3da66175598 529 }
mbed_official 237:f3da66175598 530 if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_ERR))
mbed_official 237:f3da66175598 531 {
mbed_official 237:f3da66175598 532 __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ERR);
mbed_official 237:f3da66175598 533 }
mbed_official 237:f3da66175598 534
mbed_official 237:f3da66175598 535 if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_WKUP))
mbed_official 237:f3da66175598 536 {
mbed_official 237:f3da66175598 537 hpcd->Instance->CNTR &= ~(USB_CNTR_LP_MODE);
mbed_official 237:f3da66175598 538
mbed_official 237:f3da66175598 539 /*set wInterrupt_Mask global variable*/
mbed_official 237:f3da66175598 540 wInterrupt_Mask = USB_CNTR_CTRM | USB_CNTR_WKUPM | USB_CNTR_SUSPM | USB_CNTR_ERRM \
mbed_official 237:f3da66175598 541 | USB_CNTR_ESOFM | USB_CNTR_RESETM;
mbed_official 237:f3da66175598 542
mbed_official 237:f3da66175598 543 /*Set interrupt mask*/
mbed_official 237:f3da66175598 544 hpcd->Instance->CNTR = wInterrupt_Mask;
mbed_official 237:f3da66175598 545
mbed_official 237:f3da66175598 546 HAL_PCD_ResumeCallback(hpcd);
mbed_official 237:f3da66175598 547
mbed_official 237:f3da66175598 548 __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_WKUP);
mbed_official 237:f3da66175598 549 }
mbed_official 237:f3da66175598 550
mbed_official 237:f3da66175598 551 if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_SUSP))
mbed_official 237:f3da66175598 552 {
mbed_official 237:f3da66175598 553 /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
mbed_official 237:f3da66175598 554 __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SUSP);
mbed_official 237:f3da66175598 555
mbed_official 237:f3da66175598 556 /* Force low-power mode in the macrocell */
mbed_official 237:f3da66175598 557 hpcd->Instance->CNTR |= USB_CNTR_FSUSP;
mbed_official 237:f3da66175598 558 hpcd->Instance->CNTR |= USB_CNTR_LP_MODE;
mbed_official 237:f3da66175598 559 if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_WKUP) == 0)
mbed_official 237:f3da66175598 560 {
mbed_official 237:f3da66175598 561 HAL_PCD_SuspendCallback(hpcd);
mbed_official 237:f3da66175598 562 }
mbed_official 237:f3da66175598 563 }
mbed_official 237:f3da66175598 564
mbed_official 237:f3da66175598 565 if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_SOF))
mbed_official 237:f3da66175598 566 {
mbed_official 237:f3da66175598 567 __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SOF);
mbed_official 237:f3da66175598 568 HAL_PCD_SOFCallback(hpcd);
mbed_official 237:f3da66175598 569 }
mbed_official 237:f3da66175598 570
mbed_official 237:f3da66175598 571 if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_ESOF))
mbed_official 237:f3da66175598 572 {
mbed_official 237:f3da66175598 573 /* clear ESOF flag in ISTR */
mbed_official 237:f3da66175598 574 __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ESOF);
mbed_official 237:f3da66175598 575 }
mbed_official 237:f3da66175598 576 }
mbed_official 237:f3da66175598 577
mbed_official 237:f3da66175598 578 /**
mbed_official 237:f3da66175598 579 * @brief Data out stage callbacks
mbed_official 237:f3da66175598 580 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 581 * @param epnum: endpoint number
mbed_official 237:f3da66175598 582 * @retval None
mbed_official 237:f3da66175598 583 */
mbed_official 237:f3da66175598 584 __weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 237:f3da66175598 585 {
mbed_official 237:f3da66175598 586 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 587 the HAL_PCD_DataOutStageCallback could be implenetd in the user file
mbed_official 237:f3da66175598 588 */
mbed_official 237:f3da66175598 589 }
mbed_official 237:f3da66175598 590
mbed_official 237:f3da66175598 591 /**
mbed_official 237:f3da66175598 592 * @brief Data IN stage callbacks
mbed_official 237:f3da66175598 593 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 594 * @param epnum: endpoint number
mbed_official 237:f3da66175598 595 * @retval None
mbed_official 237:f3da66175598 596 */
mbed_official 237:f3da66175598 597 __weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 237:f3da66175598 598 {
mbed_official 237:f3da66175598 599 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 600 the HAL_PCD_DataInStageCallback could be implenetd in the user file
mbed_official 237:f3da66175598 601 */
mbed_official 237:f3da66175598 602 }
mbed_official 237:f3da66175598 603 /**
mbed_official 237:f3da66175598 604 * @brief Setup stage callback
mbed_official 237:f3da66175598 605 * @param hpcd: ppp handle
mbed_official 237:f3da66175598 606 * @retval None
mbed_official 237:f3da66175598 607 */
mbed_official 237:f3da66175598 608 __weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 609 {
mbed_official 237:f3da66175598 610 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 611 the HAL_PCD_SetupStageCallback could be implenetd in the user file
mbed_official 237:f3da66175598 612 */
mbed_official 237:f3da66175598 613 }
mbed_official 237:f3da66175598 614
mbed_official 237:f3da66175598 615 /**
mbed_official 237:f3da66175598 616 * @brief USB Start Of Frame callbacks
mbed_official 237:f3da66175598 617 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 618 * @retval None
mbed_official 237:f3da66175598 619 */
mbed_official 237:f3da66175598 620 __weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 621 {
mbed_official 237:f3da66175598 622 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 623 the HAL_PCD_SOFCallback could be implenetd in the user file
mbed_official 237:f3da66175598 624 */
mbed_official 237:f3da66175598 625 }
mbed_official 237:f3da66175598 626
mbed_official 237:f3da66175598 627 /**
mbed_official 237:f3da66175598 628 * @brief USB Reset callbacks
mbed_official 237:f3da66175598 629 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 630 * @retval None
mbed_official 237:f3da66175598 631 */
mbed_official 237:f3da66175598 632 __weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 633 {
mbed_official 237:f3da66175598 634 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 635 the HAL_PCD_ResetCallback could be implenetd in the user file
mbed_official 237:f3da66175598 636 */
mbed_official 237:f3da66175598 637 }
mbed_official 237:f3da66175598 638
mbed_official 237:f3da66175598 639
mbed_official 237:f3da66175598 640 /**
mbed_official 237:f3da66175598 641 * @brief Suspend event callbacks
mbed_official 237:f3da66175598 642 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 643 * @retval None
mbed_official 237:f3da66175598 644 */
mbed_official 237:f3da66175598 645 __weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 646 {
mbed_official 237:f3da66175598 647 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 648 the HAL_PCD_SuspendCallback could be implenetd in the user file
mbed_official 237:f3da66175598 649 */
mbed_official 237:f3da66175598 650 }
mbed_official 237:f3da66175598 651
mbed_official 237:f3da66175598 652 /**
mbed_official 237:f3da66175598 653 * @brief Resume event callbacks
mbed_official 237:f3da66175598 654 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 655 * @retval None
mbed_official 237:f3da66175598 656 */
mbed_official 237:f3da66175598 657 __weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 658 {
mbed_official 237:f3da66175598 659 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 660 the HAL_PCD_ResumeCallback could be implenetd in the user file
mbed_official 237:f3da66175598 661 */
mbed_official 237:f3da66175598 662 }
mbed_official 237:f3da66175598 663
mbed_official 237:f3da66175598 664 /**
mbed_official 237:f3da66175598 665 * @brief Incomplete ISO OUT callbacks
mbed_official 237:f3da66175598 666 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 667 * @param epnum: endpoint number
mbed_official 237:f3da66175598 668 * @retval None
mbed_official 237:f3da66175598 669 */
mbed_official 237:f3da66175598 670 __weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 237:f3da66175598 671 {
mbed_official 237:f3da66175598 672 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 673 the HAL_PCD_ISOOUTIncompleteCallback could be implenetd in the user file
mbed_official 237:f3da66175598 674 */
mbed_official 237:f3da66175598 675 }
mbed_official 237:f3da66175598 676
mbed_official 237:f3da66175598 677 /**
mbed_official 237:f3da66175598 678 * @brief Incomplete ISO IN callbacks
mbed_official 237:f3da66175598 679 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 680 * @param epnum: endpoint number
mbed_official 237:f3da66175598 681 * @retval None
mbed_official 237:f3da66175598 682 */
mbed_official 237:f3da66175598 683 __weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
mbed_official 237:f3da66175598 684 {
mbed_official 237:f3da66175598 685 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 686 the HAL_PCD_ISOINIncompleteCallback could be implenetd in the user file
mbed_official 237:f3da66175598 687 */
mbed_official 237:f3da66175598 688 }
mbed_official 237:f3da66175598 689
mbed_official 237:f3da66175598 690 /**
mbed_official 237:f3da66175598 691 * @brief Connection event callbacks
mbed_official 237:f3da66175598 692 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 693 * @retval None
mbed_official 237:f3da66175598 694 */
mbed_official 237:f3da66175598 695 __weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 696 {
mbed_official 237:f3da66175598 697 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 698 the HAL_PCD_ConnectCallback could be implenetd in the user file
mbed_official 237:f3da66175598 699 */
mbed_official 237:f3da66175598 700 }
mbed_official 237:f3da66175598 701
mbed_official 237:f3da66175598 702 /**
mbed_official 237:f3da66175598 703 * @brief Disconnection event callbacks
mbed_official 237:f3da66175598 704 * @param hpcd: ppp handle
mbed_official 237:f3da66175598 705 * @retval None
mbed_official 237:f3da66175598 706 */
mbed_official 237:f3da66175598 707 __weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 708 {
mbed_official 237:f3da66175598 709 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 237:f3da66175598 710 the HAL_PCD_DisconnectCallback could be implenetd in the user file
mbed_official 237:f3da66175598 711 */
mbed_official 237:f3da66175598 712 }
mbed_official 237:f3da66175598 713
mbed_official 237:f3da66175598 714 /**
mbed_official 237:f3da66175598 715 * @}
mbed_official 237:f3da66175598 716 */
mbed_official 237:f3da66175598 717
mbed_official 237:f3da66175598 718 /** @defgroup PCD_Group3 Peripheral Control functions
mbed_official 237:f3da66175598 719 * @brief management functions
mbed_official 237:f3da66175598 720 *
mbed_official 237:f3da66175598 721 @verbatim
mbed_official 237:f3da66175598 722 ===============================================================================
mbed_official 237:f3da66175598 723 ##### Peripheral Control functions #####
mbed_official 237:f3da66175598 724 ===============================================================================
mbed_official 237:f3da66175598 725 [..]
mbed_official 237:f3da66175598 726 This subsection provides a set of functions allowing to control the PCD data
mbed_official 237:f3da66175598 727 transfers.
mbed_official 237:f3da66175598 728
mbed_official 237:f3da66175598 729 @endverbatim
mbed_official 237:f3da66175598 730 * @{
mbed_official 237:f3da66175598 731 */
mbed_official 237:f3da66175598 732
mbed_official 237:f3da66175598 733 /**
mbed_official 237:f3da66175598 734 * @brief Connect the USB device
mbed_official 237:f3da66175598 735 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 736 * @retval HAL status
mbed_official 237:f3da66175598 737 */
mbed_official 237:f3da66175598 738 HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 739 {
mbed_official 237:f3da66175598 740 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 741
mbed_official 237:f3da66175598 742 /* Enabling DP Pull-Down bit to Connect internal pull-up on USB DP line */
mbed_official 237:f3da66175598 743 HAL_PCDEx_SetConnectionState (hpcd, 1);
mbed_official 237:f3da66175598 744
mbed_official 237:f3da66175598 745 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 746 return HAL_OK;
mbed_official 237:f3da66175598 747 }
mbed_official 237:f3da66175598 748
mbed_official 237:f3da66175598 749 /**
mbed_official 237:f3da66175598 750 * @brief Disconnect the USB device
mbed_official 237:f3da66175598 751 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 752 * @retval HAL status
mbed_official 237:f3da66175598 753 */
mbed_official 237:f3da66175598 754 HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 755 {
mbed_official 237:f3da66175598 756 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 757
mbed_official 237:f3da66175598 758 /* Disable DP Pull-Down bit*/
mbed_official 237:f3da66175598 759 HAL_PCDEx_SetConnectionState (hpcd, 0);
mbed_official 237:f3da66175598 760
mbed_official 237:f3da66175598 761 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 762 return HAL_OK;
mbed_official 237:f3da66175598 763 }
mbed_official 237:f3da66175598 764
mbed_official 237:f3da66175598 765 /**
mbed_official 237:f3da66175598 766 * @brief Set the USB Device address
mbed_official 237:f3da66175598 767 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 768 * @param address: new device address
mbed_official 237:f3da66175598 769 * @retval HAL status
mbed_official 237:f3da66175598 770 */
mbed_official 237:f3da66175598 771 HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address)
mbed_official 237:f3da66175598 772 {
mbed_official 237:f3da66175598 773 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 774
mbed_official 237:f3da66175598 775 if(address == 0)
mbed_official 237:f3da66175598 776 {
mbed_official 237:f3da66175598 777 /* set device address and enable function */
mbed_official 237:f3da66175598 778 hpcd->Instance->DADDR = USB_DADDR_EF;
mbed_official 237:f3da66175598 779 }
mbed_official 237:f3da66175598 780 else /* USB Address will be applied later */
mbed_official 237:f3da66175598 781 {
mbed_official 237:f3da66175598 782 hpcd->USB_Address = address;
mbed_official 237:f3da66175598 783 }
mbed_official 237:f3da66175598 784
mbed_official 237:f3da66175598 785 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 786 return HAL_OK;
mbed_official 237:f3da66175598 787 }
mbed_official 237:f3da66175598 788 /**
mbed_official 237:f3da66175598 789 * @brief Open and configure an endpoint
mbed_official 237:f3da66175598 790 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 791 * @param ep_addr: endpoint address
mbed_official 237:f3da66175598 792 * @param ep_mps: endpoint max packert size
mbed_official 237:f3da66175598 793 * @param ep_type: endpoint type
mbed_official 237:f3da66175598 794 * @retval HAL status
mbed_official 237:f3da66175598 795 */
mbed_official 237:f3da66175598 796 HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type)
mbed_official 237:f3da66175598 797 {
mbed_official 237:f3da66175598 798 HAL_StatusTypeDef ret = HAL_OK;
mbed_official 237:f3da66175598 799 PCD_EPTypeDef *ep;
mbed_official 237:f3da66175598 800
mbed_official 237:f3da66175598 801 if ((ep_addr & 0x80) == 0x80)
mbed_official 237:f3da66175598 802 {
mbed_official 237:f3da66175598 803 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 237:f3da66175598 804 }
mbed_official 237:f3da66175598 805 else
mbed_official 237:f3da66175598 806 {
mbed_official 237:f3da66175598 807 ep = &hpcd->OUT_ep[ep_addr & 0x7F];
mbed_official 237:f3da66175598 808 }
mbed_official 237:f3da66175598 809 ep->num = ep_addr & 0x7F;
mbed_official 237:f3da66175598 810
mbed_official 237:f3da66175598 811 ep->is_in = (0x80 & ep_addr) != 0;
mbed_official 237:f3da66175598 812 ep->maxpacket = ep_mps;
mbed_official 237:f3da66175598 813 ep->type = ep_type;
mbed_official 237:f3da66175598 814
mbed_official 237:f3da66175598 815 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 816
mbed_official 237:f3da66175598 817 /* initialize Endpoint */
mbed_official 237:f3da66175598 818 switch (ep->type)
mbed_official 237:f3da66175598 819 {
mbed_official 237:f3da66175598 820 case PCD_EP_TYPE_CTRL:
mbed_official 237:f3da66175598 821 PCD_SET_EPTYPE(hpcd->Instance, ep->num, USB_EP_CONTROL);
mbed_official 237:f3da66175598 822 break;
mbed_official 237:f3da66175598 823 case PCD_EP_TYPE_BULK:
mbed_official 237:f3da66175598 824 PCD_SET_EPTYPE(hpcd->Instance, ep->num, USB_EP_BULK);
mbed_official 237:f3da66175598 825 break;
mbed_official 237:f3da66175598 826 case PCD_EP_TYPE_INTR:
mbed_official 237:f3da66175598 827 PCD_SET_EPTYPE(hpcd->Instance, ep->num, USB_EP_INTERRUPT);
mbed_official 237:f3da66175598 828 break;
mbed_official 237:f3da66175598 829 case PCD_EP_TYPE_ISOC:
mbed_official 237:f3da66175598 830 PCD_SET_EPTYPE(hpcd->Instance, ep->num, USB_EP_ISOCHRONOUS);
mbed_official 237:f3da66175598 831 break;
mbed_official 237:f3da66175598 832 }
mbed_official 237:f3da66175598 833
mbed_official 237:f3da66175598 834 PCD_SET_EP_ADDRESS(hpcd->Instance, ep->num, ep->num);
mbed_official 237:f3da66175598 835
mbed_official 237:f3da66175598 836 if (ep->doublebuffer == 0)
mbed_official 237:f3da66175598 837 {
mbed_official 237:f3da66175598 838 if (ep->is_in)
mbed_official 237:f3da66175598 839 {
mbed_official 237:f3da66175598 840 /*Set the endpoint Transmit buffer address */
mbed_official 237:f3da66175598 841 PCD_SET_EP_TX_ADDRESS(hpcd->Instance, ep->num, ep->pmaadress);
mbed_official 237:f3da66175598 842 PCD_CLEAR_TX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 843 /* Configure NAK status for the Endpoint*/
mbed_official 237:f3da66175598 844 PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_NAK);
mbed_official 237:f3da66175598 845 }
mbed_official 237:f3da66175598 846 else
mbed_official 237:f3da66175598 847 {
mbed_official 237:f3da66175598 848 /*Set the endpoint Receive buffer address */
mbed_official 237:f3da66175598 849 PCD_SET_EP_RX_ADDRESS(hpcd->Instance, ep->num, ep->pmaadress);
mbed_official 237:f3da66175598 850 /*Set the endpoint Receive buffer counter*/
mbed_official 237:f3da66175598 851 PCD_SET_EP_RX_CNT(hpcd->Instance, ep->num, ep->maxpacket);
mbed_official 237:f3da66175598 852 PCD_CLEAR_RX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 853 /* Configure VALID status for the Endpoint*/
mbed_official 237:f3da66175598 854 PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_VALID);
mbed_official 237:f3da66175598 855 }
mbed_official 237:f3da66175598 856 }
mbed_official 237:f3da66175598 857 /*Double Buffer*/
mbed_official 237:f3da66175598 858 else
mbed_official 237:f3da66175598 859 {
mbed_official 237:f3da66175598 860 /*Set the endpoint as double buffered*/
mbed_official 237:f3da66175598 861 PCD_SET_EP_DBUF(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 862 /*Set buffer address for double buffered mode*/
mbed_official 237:f3da66175598 863 PCD_SET_EP_DBUF_ADDR(hpcd->Instance, ep->num,ep->pmaaddr0, ep->pmaaddr1);
mbed_official 237:f3da66175598 864
mbed_official 237:f3da66175598 865 if (ep->is_in==0)
mbed_official 237:f3da66175598 866 {
mbed_official 237:f3da66175598 867 /* Clear the data toggle bits for the endpoint IN/OUT*/
mbed_official 237:f3da66175598 868 PCD_CLEAR_RX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 869 PCD_CLEAR_TX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 870
mbed_official 237:f3da66175598 871 /* Reset value of the data toggle bits for the endpoint out*/
mbed_official 237:f3da66175598 872 PCD_TX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 873
mbed_official 237:f3da66175598 874 PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_VALID);
mbed_official 237:f3da66175598 875 PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_DIS);
mbed_official 237:f3da66175598 876 }
mbed_official 237:f3da66175598 877 else
mbed_official 237:f3da66175598 878 {
mbed_official 237:f3da66175598 879 /* Clear the data toggle bits for the endpoint IN/OUT*/
mbed_official 237:f3da66175598 880 PCD_CLEAR_RX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 881 PCD_CLEAR_TX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 882 PCD_RX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 883 /* Configure DISABLE status for the Endpoint*/
mbed_official 237:f3da66175598 884 PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_DIS);
mbed_official 237:f3da66175598 885 PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_DIS);
mbed_official 237:f3da66175598 886 }
mbed_official 237:f3da66175598 887 }
mbed_official 237:f3da66175598 888
mbed_official 237:f3da66175598 889 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 890 return ret;
mbed_official 237:f3da66175598 891 }
mbed_official 237:f3da66175598 892
mbed_official 237:f3da66175598 893
mbed_official 237:f3da66175598 894 /**
mbed_official 237:f3da66175598 895 * @brief Deactivate an endpoint
mbed_official 237:f3da66175598 896 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 897 * @param ep_addr: endpoint address
mbed_official 237:f3da66175598 898 * @retval HAL status
mbed_official 237:f3da66175598 899 */
mbed_official 237:f3da66175598 900 HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 237:f3da66175598 901 {
mbed_official 237:f3da66175598 902 PCD_EPTypeDef *ep;
mbed_official 237:f3da66175598 903
mbed_official 237:f3da66175598 904 if ((ep_addr & 0x80) == 0x80)
mbed_official 237:f3da66175598 905 {
mbed_official 237:f3da66175598 906 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 237:f3da66175598 907 }
mbed_official 237:f3da66175598 908 else
mbed_official 237:f3da66175598 909 {
mbed_official 237:f3da66175598 910 ep = &hpcd->OUT_ep[ep_addr & 0x7F];
mbed_official 237:f3da66175598 911 }
mbed_official 237:f3da66175598 912 ep->num = ep_addr & 0x7F;
mbed_official 237:f3da66175598 913
mbed_official 237:f3da66175598 914 ep->is_in = (0x80 & ep_addr) != 0;
mbed_official 237:f3da66175598 915
mbed_official 237:f3da66175598 916 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 917
mbed_official 237:f3da66175598 918 if (ep->doublebuffer == 0)
mbed_official 237:f3da66175598 919 {
mbed_official 237:f3da66175598 920 if (ep->is_in)
mbed_official 237:f3da66175598 921 {
mbed_official 237:f3da66175598 922 PCD_CLEAR_TX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 923 /* Configure DISABLE status for the Endpoint*/
mbed_official 237:f3da66175598 924 PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_DIS);
mbed_official 237:f3da66175598 925 }
mbed_official 237:f3da66175598 926 else
mbed_official 237:f3da66175598 927 {
mbed_official 237:f3da66175598 928 PCD_CLEAR_RX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 929 /* Configure DISABLE status for the Endpoint*/
mbed_official 237:f3da66175598 930 PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_DIS);
mbed_official 237:f3da66175598 931 }
mbed_official 237:f3da66175598 932 }
mbed_official 237:f3da66175598 933 /*Double Buffer*/
mbed_official 237:f3da66175598 934 else
mbed_official 237:f3da66175598 935 {
mbed_official 237:f3da66175598 936 if (ep->is_in==0)
mbed_official 237:f3da66175598 937 {
mbed_official 237:f3da66175598 938 /* Clear the data toggle bits for the endpoint IN/OUT*/
mbed_official 237:f3da66175598 939 PCD_CLEAR_RX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 940 PCD_CLEAR_TX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 941
mbed_official 237:f3da66175598 942 /* Reset value of the data toggle bits for the endpoint out*/
mbed_official 237:f3da66175598 943 PCD_TX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 944
mbed_official 237:f3da66175598 945 PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_DIS);
mbed_official 237:f3da66175598 946 PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_DIS);
mbed_official 237:f3da66175598 947 }
mbed_official 237:f3da66175598 948 else
mbed_official 237:f3da66175598 949 {
mbed_official 237:f3da66175598 950 /* Clear the data toggle bits for the endpoint IN/OUT*/
mbed_official 237:f3da66175598 951 PCD_CLEAR_RX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 952 PCD_CLEAR_TX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 953 PCD_RX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 954 /* Configure DISABLE status for the Endpoint*/
mbed_official 237:f3da66175598 955 PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_DIS);
mbed_official 237:f3da66175598 956 PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_DIS);
mbed_official 237:f3da66175598 957 }
mbed_official 237:f3da66175598 958 }
mbed_official 237:f3da66175598 959
mbed_official 237:f3da66175598 960 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 961 return HAL_OK;
mbed_official 237:f3da66175598 962 }
mbed_official 237:f3da66175598 963
mbed_official 237:f3da66175598 964
mbed_official 237:f3da66175598 965 /**
mbed_official 237:f3da66175598 966 * @brief Receive an amount of data
mbed_official 237:f3da66175598 967 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 968 * @param ep_addr: endpoint address
mbed_official 237:f3da66175598 969 * @param pBuf: pointer to the reception buffer
mbed_official 237:f3da66175598 970 * @param len: amount of data to be received
mbed_official 237:f3da66175598 971 * @retval HAL status
mbed_official 237:f3da66175598 972 */
mbed_official 237:f3da66175598 973 HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
mbed_official 237:f3da66175598 974 {
mbed_official 237:f3da66175598 975
mbed_official 237:f3da66175598 976 PCD_EPTypeDef *ep;
mbed_official 237:f3da66175598 977
mbed_official 237:f3da66175598 978 ep = &hpcd->OUT_ep[ep_addr & 0x7F];
mbed_official 237:f3da66175598 979
mbed_official 237:f3da66175598 980 /*setup and start the Xfer */
mbed_official 237:f3da66175598 981 ep->xfer_buff = pBuf;
mbed_official 237:f3da66175598 982 ep->xfer_len = len;
mbed_official 237:f3da66175598 983 ep->xfer_count = 0;
mbed_official 237:f3da66175598 984 ep->is_in = 0;
mbed_official 237:f3da66175598 985 ep->num = ep_addr & 0x7F;
mbed_official 237:f3da66175598 986
mbed_official 237:f3da66175598 987 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 988
mbed_official 237:f3da66175598 989 /* Multi packet transfer*/
mbed_official 237:f3da66175598 990 if (ep->xfer_len > ep->maxpacket)
mbed_official 237:f3da66175598 991 {
mbed_official 237:f3da66175598 992 len=ep->maxpacket;
mbed_official 237:f3da66175598 993 ep->xfer_len-=len;
mbed_official 237:f3da66175598 994 }
mbed_official 237:f3da66175598 995 else
mbed_official 237:f3da66175598 996 {
mbed_official 237:f3da66175598 997 len=ep->xfer_len;
mbed_official 237:f3da66175598 998 ep->xfer_len =0;
mbed_official 237:f3da66175598 999 }
mbed_official 237:f3da66175598 1000
mbed_official 237:f3da66175598 1001 /* configure and validate Rx endpoint */
mbed_official 237:f3da66175598 1002 if (ep->doublebuffer == 0)
mbed_official 237:f3da66175598 1003 {
mbed_official 237:f3da66175598 1004 /*Set RX buffer count*/
mbed_official 237:f3da66175598 1005 PCD_SET_EP_RX_CNT(hpcd->Instance, ep->num, len);
mbed_official 237:f3da66175598 1006 }
mbed_official 237:f3da66175598 1007 else
mbed_official 237:f3da66175598 1008 {
mbed_official 237:f3da66175598 1009 /*Set the Double buffer counter*/
mbed_official 237:f3da66175598 1010 PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, len);
mbed_official 237:f3da66175598 1011 }
mbed_official 237:f3da66175598 1012
mbed_official 237:f3da66175598 1013 PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_VALID);
mbed_official 237:f3da66175598 1014
mbed_official 237:f3da66175598 1015 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 1016
mbed_official 237:f3da66175598 1017 return HAL_OK;
mbed_official 237:f3da66175598 1018 }
mbed_official 237:f3da66175598 1019
mbed_official 237:f3da66175598 1020 /**
mbed_official 237:f3da66175598 1021 * @brief Get Received Data Size
mbed_official 237:f3da66175598 1022 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 1023 * @param ep_addr: endpoint address
mbed_official 237:f3da66175598 1024 * @retval Data Size
mbed_official 237:f3da66175598 1025 */
mbed_official 237:f3da66175598 1026 uint16_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 237:f3da66175598 1027 {
mbed_official 237:f3da66175598 1028 return hpcd->OUT_ep[ep_addr & 0x7F].xfer_count;
mbed_official 237:f3da66175598 1029 }
mbed_official 237:f3da66175598 1030 /**
mbed_official 237:f3da66175598 1031 * @brief Send an amount of data
mbed_official 237:f3da66175598 1032 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 1033 * @param ep_addr: endpoint address
mbed_official 237:f3da66175598 1034 * @param pBuf: pointer to the transmission buffer
mbed_official 237:f3da66175598 1035 * @param len: amount of data to be sent
mbed_official 237:f3da66175598 1036 * @retval HAL status
mbed_official 237:f3da66175598 1037 */
mbed_official 237:f3da66175598 1038 HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
mbed_official 237:f3da66175598 1039 {
mbed_official 237:f3da66175598 1040 PCD_EPTypeDef *ep;
mbed_official 237:f3da66175598 1041 uint16_t pmabuffer = 0;
mbed_official 237:f3da66175598 1042
mbed_official 237:f3da66175598 1043 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 237:f3da66175598 1044
mbed_official 237:f3da66175598 1045 /*setup and start the Xfer */
mbed_official 237:f3da66175598 1046 ep->xfer_buff = pBuf;
mbed_official 237:f3da66175598 1047 ep->xfer_len = len;
mbed_official 237:f3da66175598 1048 ep->xfer_count = 0;
mbed_official 237:f3da66175598 1049 ep->is_in = 1;
mbed_official 237:f3da66175598 1050 ep->num = ep_addr & 0x7F;
mbed_official 237:f3da66175598 1051
mbed_official 237:f3da66175598 1052 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 1053
mbed_official 237:f3da66175598 1054 /*Multi packet transfer*/
mbed_official 237:f3da66175598 1055 if (ep->xfer_len > ep->maxpacket)
mbed_official 237:f3da66175598 1056 {
mbed_official 237:f3da66175598 1057 len=ep->maxpacket;
mbed_official 237:f3da66175598 1058 ep->xfer_len-=len;
mbed_official 237:f3da66175598 1059 }
mbed_official 237:f3da66175598 1060 else
mbed_official 237:f3da66175598 1061 {
mbed_official 237:f3da66175598 1062 len=ep->xfer_len;
mbed_official 237:f3da66175598 1063 ep->xfer_len =0;
mbed_official 237:f3da66175598 1064 }
mbed_official 237:f3da66175598 1065
mbed_official 237:f3da66175598 1066 /* configure and validate Tx endpoint */
mbed_official 237:f3da66175598 1067 if (ep->doublebuffer == 0)
mbed_official 237:f3da66175598 1068 {
mbed_official 237:f3da66175598 1069 PCD_WritePMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, len);
mbed_official 237:f3da66175598 1070 PCD_SET_EP_TX_CNT(hpcd->Instance, ep->num, len);
mbed_official 237:f3da66175598 1071 }
mbed_official 237:f3da66175598 1072 else
mbed_official 237:f3da66175598 1073 {
mbed_official 237:f3da66175598 1074 /*Set the Double buffer counter*/
mbed_official 237:f3da66175598 1075 PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, len);
mbed_official 237:f3da66175598 1076
mbed_official 237:f3da66175598 1077 /*Write the data to the USB endpoint*/
mbed_official 237:f3da66175598 1078 if (PCD_GET_ENDPOINT(hpcd->Instance, ep->num)& USB_EP_DTOG_TX)
mbed_official 237:f3da66175598 1079 {
mbed_official 237:f3da66175598 1080 pmabuffer = ep->pmaaddr1;
mbed_official 237:f3da66175598 1081 }
mbed_official 237:f3da66175598 1082 else
mbed_official 237:f3da66175598 1083 {
mbed_official 237:f3da66175598 1084 pmabuffer = ep->pmaaddr0;
mbed_official 237:f3da66175598 1085 }
mbed_official 237:f3da66175598 1086 PCD_WritePMA(hpcd->Instance, ep->xfer_buff, pmabuffer, len);
mbed_official 237:f3da66175598 1087 PCD_FreeUserBuffer(hpcd->Instance, ep->num, ep->is_in);
mbed_official 237:f3da66175598 1088 }
mbed_official 237:f3da66175598 1089
mbed_official 237:f3da66175598 1090 PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_VALID);
mbed_official 237:f3da66175598 1091
mbed_official 237:f3da66175598 1092 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 1093
mbed_official 237:f3da66175598 1094 return HAL_OK;
mbed_official 237:f3da66175598 1095 }
mbed_official 237:f3da66175598 1096
mbed_official 237:f3da66175598 1097 /**
mbed_official 237:f3da66175598 1098 * @brief Set a STALL condition over an endpoint
mbed_official 237:f3da66175598 1099 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 1100 * @param ep_addr: endpoint address
mbed_official 237:f3da66175598 1101 * @retval HAL status
mbed_official 237:f3da66175598 1102 */
mbed_official 237:f3da66175598 1103 HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 237:f3da66175598 1104 {
mbed_official 237:f3da66175598 1105 PCD_EPTypeDef *ep;
mbed_official 237:f3da66175598 1106
mbed_official 237:f3da66175598 1107 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 1108
mbed_official 237:f3da66175598 1109 if ((0x80 & ep_addr) == 0x80)
mbed_official 237:f3da66175598 1110 {
mbed_official 237:f3da66175598 1111 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 237:f3da66175598 1112 }
mbed_official 237:f3da66175598 1113 else
mbed_official 237:f3da66175598 1114 {
mbed_official 237:f3da66175598 1115 ep = &hpcd->OUT_ep[ep_addr];
mbed_official 237:f3da66175598 1116 }
mbed_official 237:f3da66175598 1117
mbed_official 237:f3da66175598 1118 ep->is_stall = 1;
mbed_official 237:f3da66175598 1119 ep->num = ep_addr & 0x7F;
mbed_official 237:f3da66175598 1120 ep->is_in = ((ep_addr & 0x80) == 0x80);
mbed_official 237:f3da66175598 1121
mbed_official 237:f3da66175598 1122 if (ep->num == 0)
mbed_official 237:f3da66175598 1123 {
mbed_official 237:f3da66175598 1124 /* This macro sets STALL status for RX & TX*/
mbed_official 237:f3da66175598 1125 PCD_SET_EP_TXRX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_STALL, USB_EP_TX_STALL);
mbed_official 237:f3da66175598 1126 }
mbed_official 237:f3da66175598 1127 else
mbed_official 237:f3da66175598 1128 {
mbed_official 237:f3da66175598 1129 if (ep->is_in)
mbed_official 237:f3da66175598 1130 {
mbed_official 237:f3da66175598 1131 PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num , USB_EP_TX_STALL);
mbed_official 237:f3da66175598 1132 }
mbed_official 237:f3da66175598 1133 else
mbed_official 237:f3da66175598 1134 {
mbed_official 237:f3da66175598 1135 PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num , USB_EP_RX_STALL);
mbed_official 237:f3da66175598 1136 }
mbed_official 237:f3da66175598 1137 }
mbed_official 237:f3da66175598 1138 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 1139
mbed_official 237:f3da66175598 1140 return HAL_OK;
mbed_official 237:f3da66175598 1141 }
mbed_official 237:f3da66175598 1142
mbed_official 237:f3da66175598 1143 /**
mbed_official 237:f3da66175598 1144 * @brief Clear a STALL condition over in an endpoint
mbed_official 237:f3da66175598 1145 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 1146 * @param ep_addr: endpoint address
mbed_official 237:f3da66175598 1147 * @retval HAL status
mbed_official 237:f3da66175598 1148 */
mbed_official 237:f3da66175598 1149 HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 237:f3da66175598 1150 {
mbed_official 237:f3da66175598 1151 PCD_EPTypeDef *ep;
mbed_official 237:f3da66175598 1152
mbed_official 237:f3da66175598 1153 if ((0x80 & ep_addr) == 0x80)
mbed_official 237:f3da66175598 1154 {
mbed_official 237:f3da66175598 1155 ep = &hpcd->IN_ep[ep_addr & 0x7F];
mbed_official 237:f3da66175598 1156 }
mbed_official 237:f3da66175598 1157 else
mbed_official 237:f3da66175598 1158 {
mbed_official 237:f3da66175598 1159 ep = &hpcd->OUT_ep[ep_addr];
mbed_official 237:f3da66175598 1160 }
mbed_official 237:f3da66175598 1161
mbed_official 237:f3da66175598 1162 ep->is_stall = 0;
mbed_official 237:f3da66175598 1163 ep->num = ep_addr & 0x7F;
mbed_official 237:f3da66175598 1164 ep->is_in = ((ep_addr & 0x80) == 0x80);
mbed_official 237:f3da66175598 1165
mbed_official 237:f3da66175598 1166 __HAL_LOCK(hpcd);
mbed_official 237:f3da66175598 1167
mbed_official 237:f3da66175598 1168 if (ep->is_in)
mbed_official 237:f3da66175598 1169 {
mbed_official 237:f3da66175598 1170 PCD_CLEAR_TX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 1171 PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_VALID);
mbed_official 237:f3da66175598 1172 }
mbed_official 237:f3da66175598 1173 else
mbed_official 237:f3da66175598 1174 {
mbed_official 237:f3da66175598 1175 PCD_CLEAR_RX_DTOG(hpcd->Instance, ep->num);
mbed_official 237:f3da66175598 1176 PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_VALID);
mbed_official 237:f3da66175598 1177 }
mbed_official 237:f3da66175598 1178 __HAL_UNLOCK(hpcd);
mbed_official 237:f3da66175598 1179
mbed_official 237:f3da66175598 1180 return HAL_OK;
mbed_official 237:f3da66175598 1181 }
mbed_official 237:f3da66175598 1182
mbed_official 237:f3da66175598 1183 /**
mbed_official 237:f3da66175598 1184 * @brief Flush an endpoint
mbed_official 237:f3da66175598 1185 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 1186 * @param ep_addr: endpoint address
mbed_official 237:f3da66175598 1187 * @retval HAL status
mbed_official 237:f3da66175598 1188 */
mbed_official 237:f3da66175598 1189 HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
mbed_official 237:f3da66175598 1190 {
mbed_official 237:f3da66175598 1191 return HAL_OK;
mbed_official 237:f3da66175598 1192 }
mbed_official 237:f3da66175598 1193
mbed_official 237:f3da66175598 1194 /**
mbed_official 237:f3da66175598 1195 * @brief HAL_PCD_ActiveRemoteWakeup : active remote wakeup signalling
mbed_official 237:f3da66175598 1196 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 1197 * @retval status
mbed_official 237:f3da66175598 1198 */
mbed_official 237:f3da66175598 1199 HAL_StatusTypeDef HAL_PCD_ActiveRemoteWakeup(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 1200 {
mbed_official 237:f3da66175598 1201 hpcd->Instance->CNTR |= USB_CNTR_RESUME;
mbed_official 237:f3da66175598 1202 return HAL_OK;
mbed_official 237:f3da66175598 1203 }
mbed_official 237:f3da66175598 1204
mbed_official 237:f3da66175598 1205 /**
mbed_official 237:f3da66175598 1206 * @brief HAL_PCD_DeActiveRemoteWakeup : de-active remote wakeup signalling
mbed_official 237:f3da66175598 1207 * @param hpcd: PCD handle
mbed_official 237:f3da66175598 1208 * @retval status
mbed_official 237:f3da66175598 1209 */
mbed_official 237:f3da66175598 1210 HAL_StatusTypeDef HAL_PCD_DeActiveRemoteWakeup(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 1211 {
mbed_official 237:f3da66175598 1212 hpcd->Instance->CNTR &= ~(USB_CNTR_RESUME);
mbed_official 237:f3da66175598 1213 return HAL_OK;
mbed_official 237:f3da66175598 1214 }
mbed_official 237:f3da66175598 1215
mbed_official 237:f3da66175598 1216 /**
mbed_official 237:f3da66175598 1217 * @}
mbed_official 237:f3da66175598 1218 */
mbed_official 237:f3da66175598 1219
mbed_official 237:f3da66175598 1220 /** @defgroup PCD_Group4 Peripheral State functions
mbed_official 237:f3da66175598 1221 * @brief Peripheral State functions
mbed_official 237:f3da66175598 1222 *
mbed_official 237:f3da66175598 1223 @verbatim
mbed_official 237:f3da66175598 1224 ===============================================================================
mbed_official 237:f3da66175598 1225 ##### Peripheral State functions #####
mbed_official 237:f3da66175598 1226 ===============================================================================
mbed_official 237:f3da66175598 1227 [..]
mbed_official 237:f3da66175598 1228 This subsection permit to get in run-time the status of the peripheral
mbed_official 237:f3da66175598 1229 and the data flow.
mbed_official 237:f3da66175598 1230
mbed_official 237:f3da66175598 1231 @endverbatim
mbed_official 237:f3da66175598 1232 * @{
mbed_official 237:f3da66175598 1233 */
mbed_official 237:f3da66175598 1234
mbed_official 237:f3da66175598 1235 /**
mbed_official 237:f3da66175598 1236 * @brief Return the PCD state
mbed_official 237:f3da66175598 1237 * @param hpcd : PCD handle
mbed_official 237:f3da66175598 1238 * @retval HAL state
mbed_official 237:f3da66175598 1239 */
mbed_official 237:f3da66175598 1240 PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd)
mbed_official 237:f3da66175598 1241 {
mbed_official 237:f3da66175598 1242 return hpcd->State;
mbed_official 237:f3da66175598 1243 }
mbed_official 237:f3da66175598 1244 /**
mbed_official 237:f3da66175598 1245 * @}
mbed_official 237:f3da66175598 1246 */
mbed_official 237:f3da66175598 1247
mbed_official 237:f3da66175598 1248
mbed_official 237:f3da66175598 1249 /**
mbed_official 237:f3da66175598 1250 * @}
mbed_official 237:f3da66175598 1251 */
mbed_official 237:f3da66175598 1252
mbed_official 237:f3da66175598 1253 #endif /* defined(STM32F302x8) || defined(STM32F302xC) || */
mbed_official 237:f3da66175598 1254 /* defined(STM32F303xC) || defined(STM32F373xC) */
mbed_official 237:f3da66175598 1255
mbed_official 237:f3da66175598 1256 #endif /* HAL_PCD_MODULE_ENABLED */
mbed_official 237:f3da66175598 1257 /**
mbed_official 237:f3da66175598 1258 * @}
mbed_official 237:f3da66175598 1259 */
mbed_official 237:f3da66175598 1260
mbed_official 237:f3da66175598 1261 /**
mbed_official 237:f3da66175598 1262 * @}
mbed_official 237:f3da66175598 1263 */
mbed_official 237:f3da66175598 1264
mbed_official 237:f3da66175598 1265 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/