SPKT

Dependencies:   F746_GUI SD_PlayerSkeleton F746_SAI_IO

Committer:
phungductung
Date:
Tue Jun 04 21:37:21 2019 +0000
Revision:
0:8ede47d38d10
SPKT

Who changed what in which revision?

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