mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

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

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

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

Import librarymbed

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

Committer:
mbed_official
Date:
Wed Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Parent:
441:d2c15dda23c1
Child:
630:825f75ca301e
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

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

Initial version of drivers for SAMR21

Who changed what in which revision?

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