mbed library sources, include can_api for nucleo-f091rc

Dependents:   CanNucleoF0_example

Fork of mbed-src by mbed official

Committer:
ptpaterson
Date:
Thu Jan 07 05:49:05 2016 +0000
Revision:
645:13c87cbecd54
Parent:
610:813dcc80987e
corrected freeze on CAN_RECEIVE_IT

Who changed what in which revision?

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