USB CDC library for MBED on STM32

Dependents:   PushToGo-F429

Committer:
caoyuan9642
Date:
Sun Sep 09 19:03:18 2018 +0000
Revision:
0:7cf972f622d3
usb

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caoyuan9642 0:7cf972f622d3 1 /**
caoyuan9642 0:7cf972f622d3 2 ******************************************************************************
caoyuan9642 0:7cf972f622d3 3 * @file usbd_core.c
caoyuan9642 0:7cf972f622d3 4 * @author MCD Application Team
caoyuan9642 0:7cf972f622d3 5 * @version V2.4.2
caoyuan9642 0:7cf972f622d3 6 * @date 11-December-2015
caoyuan9642 0:7cf972f622d3 7 * @brief This file provides all the USBD core functions.
caoyuan9642 0:7cf972f622d3 8 ******************************************************************************
caoyuan9642 0:7cf972f622d3 9 * @attention
caoyuan9642 0:7cf972f622d3 10 *
caoyuan9642 0:7cf972f622d3 11 * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
caoyuan9642 0:7cf972f622d3 12 *
caoyuan9642 0:7cf972f622d3 13 * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
caoyuan9642 0:7cf972f622d3 14 * You may not use this file except in compliance with the License.
caoyuan9642 0:7cf972f622d3 15 * You may obtain a copy of the License at:
caoyuan9642 0:7cf972f622d3 16 *
caoyuan9642 0:7cf972f622d3 17 * http://www.st.com/software_license_agreement_liberty_v2
caoyuan9642 0:7cf972f622d3 18 *
caoyuan9642 0:7cf972f622d3 19 * Unless required by applicable law or agreed to in writing, software
caoyuan9642 0:7cf972f622d3 20 * distributed under the License is distributed on an "AS IS" BASIS,
caoyuan9642 0:7cf972f622d3 21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
caoyuan9642 0:7cf972f622d3 22 * See the License for the specific language governing permissions and
caoyuan9642 0:7cf972f622d3 23 * limitations under the License.
caoyuan9642 0:7cf972f622d3 24 *
caoyuan9642 0:7cf972f622d3 25 ******************************************************************************
caoyuan9642 0:7cf972f622d3 26 */
caoyuan9642 0:7cf972f622d3 27
caoyuan9642 0:7cf972f622d3 28 /* Includes ------------------------------------------------------------------*/
caoyuan9642 0:7cf972f622d3 29 #include "usbd_core.h"
caoyuan9642 0:7cf972f622d3 30
caoyuan9642 0:7cf972f622d3 31 /** @addtogroup STM32_USBD_DEVICE_LIBRARY
caoyuan9642 0:7cf972f622d3 32 * @{
caoyuan9642 0:7cf972f622d3 33 */
caoyuan9642 0:7cf972f622d3 34
caoyuan9642 0:7cf972f622d3 35
caoyuan9642 0:7cf972f622d3 36 /** @defgroup USBD_CORE
caoyuan9642 0:7cf972f622d3 37 * @brief usbd core module
caoyuan9642 0:7cf972f622d3 38 * @{
caoyuan9642 0:7cf972f622d3 39 */
caoyuan9642 0:7cf972f622d3 40
caoyuan9642 0:7cf972f622d3 41 /** @defgroup USBD_CORE_Private_TypesDefinitions
caoyuan9642 0:7cf972f622d3 42 * @{
caoyuan9642 0:7cf972f622d3 43 */
caoyuan9642 0:7cf972f622d3 44 /**
caoyuan9642 0:7cf972f622d3 45 * @}
caoyuan9642 0:7cf972f622d3 46 */
caoyuan9642 0:7cf972f622d3 47
caoyuan9642 0:7cf972f622d3 48
caoyuan9642 0:7cf972f622d3 49 /** @defgroup USBD_CORE_Private_Defines
caoyuan9642 0:7cf972f622d3 50 * @{
caoyuan9642 0:7cf972f622d3 51 */
caoyuan9642 0:7cf972f622d3 52
caoyuan9642 0:7cf972f622d3 53 /**
caoyuan9642 0:7cf972f622d3 54 * @}
caoyuan9642 0:7cf972f622d3 55 */
caoyuan9642 0:7cf972f622d3 56
caoyuan9642 0:7cf972f622d3 57
caoyuan9642 0:7cf972f622d3 58 /** @defgroup USBD_CORE_Private_Macros
caoyuan9642 0:7cf972f622d3 59 * @{
caoyuan9642 0:7cf972f622d3 60 */
caoyuan9642 0:7cf972f622d3 61 /**
caoyuan9642 0:7cf972f622d3 62 * @}
caoyuan9642 0:7cf972f622d3 63 */
caoyuan9642 0:7cf972f622d3 64
caoyuan9642 0:7cf972f622d3 65
caoyuan9642 0:7cf972f622d3 66
caoyuan9642 0:7cf972f622d3 67
caoyuan9642 0:7cf972f622d3 68 /** @defgroup USBD_CORE_Private_FunctionPrototypes
caoyuan9642 0:7cf972f622d3 69 * @{
caoyuan9642 0:7cf972f622d3 70 */
caoyuan9642 0:7cf972f622d3 71
caoyuan9642 0:7cf972f622d3 72 /**
caoyuan9642 0:7cf972f622d3 73 * @}
caoyuan9642 0:7cf972f622d3 74 */
caoyuan9642 0:7cf972f622d3 75
caoyuan9642 0:7cf972f622d3 76 /** @defgroup USBD_CORE_Private_Variables
caoyuan9642 0:7cf972f622d3 77 * @{
caoyuan9642 0:7cf972f622d3 78 */
caoyuan9642 0:7cf972f622d3 79
caoyuan9642 0:7cf972f622d3 80 /**
caoyuan9642 0:7cf972f622d3 81 * @}
caoyuan9642 0:7cf972f622d3 82 */
caoyuan9642 0:7cf972f622d3 83
caoyuan9642 0:7cf972f622d3 84 /** @defgroup USBD_CORE_Private_Functions
caoyuan9642 0:7cf972f622d3 85 * @{
caoyuan9642 0:7cf972f622d3 86 */
caoyuan9642 0:7cf972f622d3 87
caoyuan9642 0:7cf972f622d3 88 /**
caoyuan9642 0:7cf972f622d3 89 * @brief USBD_Init
caoyuan9642 0:7cf972f622d3 90 * Initializes the device stack and load the class driver
caoyuan9642 0:7cf972f622d3 91 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 92 * @param pdesc: Descriptor structure address
caoyuan9642 0:7cf972f622d3 93 * @param id: Low level core index
caoyuan9642 0:7cf972f622d3 94 * @retval None
caoyuan9642 0:7cf972f622d3 95 */
caoyuan9642 0:7cf972f622d3 96 USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id)
caoyuan9642 0:7cf972f622d3 97 {
caoyuan9642 0:7cf972f622d3 98 /* Check whether the USB Host handle is valid */
caoyuan9642 0:7cf972f622d3 99 if(pdev == NULL)
caoyuan9642 0:7cf972f622d3 100 {
caoyuan9642 0:7cf972f622d3 101 USBD_ErrLog("Invalid Device handle");
caoyuan9642 0:7cf972f622d3 102 return USBD_FAIL;
caoyuan9642 0:7cf972f622d3 103 }
caoyuan9642 0:7cf972f622d3 104
caoyuan9642 0:7cf972f622d3 105 /* Unlink previous class*/
caoyuan9642 0:7cf972f622d3 106 if(pdev->pClass != NULL)
caoyuan9642 0:7cf972f622d3 107 {
caoyuan9642 0:7cf972f622d3 108 pdev->pClass = NULL;
caoyuan9642 0:7cf972f622d3 109 }
caoyuan9642 0:7cf972f622d3 110
caoyuan9642 0:7cf972f622d3 111 /* Assign USBD Descriptors */
caoyuan9642 0:7cf972f622d3 112 if(pdesc != NULL)
caoyuan9642 0:7cf972f622d3 113 {
caoyuan9642 0:7cf972f622d3 114 pdev->pDesc = pdesc;
caoyuan9642 0:7cf972f622d3 115 }
caoyuan9642 0:7cf972f622d3 116
caoyuan9642 0:7cf972f622d3 117 /* Set Device initial State */
caoyuan9642 0:7cf972f622d3 118 pdev->dev_state = USBD_STATE_DEFAULT;
caoyuan9642 0:7cf972f622d3 119 pdev->id = id;
caoyuan9642 0:7cf972f622d3 120 /* Initialize low level driver */
caoyuan9642 0:7cf972f622d3 121 USBD_LL_Init(pdev);
caoyuan9642 0:7cf972f622d3 122
caoyuan9642 0:7cf972f622d3 123 return USBD_OK;
caoyuan9642 0:7cf972f622d3 124 }
caoyuan9642 0:7cf972f622d3 125
caoyuan9642 0:7cf972f622d3 126 /**
caoyuan9642 0:7cf972f622d3 127 * @brief USBD_DeInit
caoyuan9642 0:7cf972f622d3 128 * Re-Initialize th device library
caoyuan9642 0:7cf972f622d3 129 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 130 * @retval status: status
caoyuan9642 0:7cf972f622d3 131 */
caoyuan9642 0:7cf972f622d3 132 USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 133 {
caoyuan9642 0:7cf972f622d3 134 /* Set Default State */
caoyuan9642 0:7cf972f622d3 135 pdev->dev_state = USBD_STATE_DEFAULT;
caoyuan9642 0:7cf972f622d3 136
caoyuan9642 0:7cf972f622d3 137 /* Free Class Resources */
caoyuan9642 0:7cf972f622d3 138 pdev->pClass->DeInit(pdev, pdev->dev_config);
caoyuan9642 0:7cf972f622d3 139
caoyuan9642 0:7cf972f622d3 140 /* Stop the low level driver */
caoyuan9642 0:7cf972f622d3 141 USBD_LL_Stop(pdev);
caoyuan9642 0:7cf972f622d3 142
caoyuan9642 0:7cf972f622d3 143 /* Initialize low level driver */
caoyuan9642 0:7cf972f622d3 144 USBD_LL_DeInit(pdev);
caoyuan9642 0:7cf972f622d3 145
caoyuan9642 0:7cf972f622d3 146 return USBD_OK;
caoyuan9642 0:7cf972f622d3 147 }
caoyuan9642 0:7cf972f622d3 148
caoyuan9642 0:7cf972f622d3 149
caoyuan9642 0:7cf972f622d3 150 /**
caoyuan9642 0:7cf972f622d3 151 * @brief USBD_RegisterClass
caoyuan9642 0:7cf972f622d3 152 * Link class driver to Device Core.
caoyuan9642 0:7cf972f622d3 153 * @param pDevice : Device Handle
caoyuan9642 0:7cf972f622d3 154 * @param pclass: Class handle
caoyuan9642 0:7cf972f622d3 155 * @retval USBD Status
caoyuan9642 0:7cf972f622d3 156 */
caoyuan9642 0:7cf972f622d3 157 USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass)
caoyuan9642 0:7cf972f622d3 158 {
caoyuan9642 0:7cf972f622d3 159 USBD_StatusTypeDef status = USBD_OK;
caoyuan9642 0:7cf972f622d3 160 if(pclass != 0)
caoyuan9642 0:7cf972f622d3 161 {
caoyuan9642 0:7cf972f622d3 162 /* link the class to the USB Device handle */
caoyuan9642 0:7cf972f622d3 163 pdev->pClass = pclass;
caoyuan9642 0:7cf972f622d3 164 status = USBD_OK;
caoyuan9642 0:7cf972f622d3 165 }
caoyuan9642 0:7cf972f622d3 166 else
caoyuan9642 0:7cf972f622d3 167 {
caoyuan9642 0:7cf972f622d3 168 USBD_ErrLog("Invalid Class handle");
caoyuan9642 0:7cf972f622d3 169 status = USBD_FAIL;
caoyuan9642 0:7cf972f622d3 170 }
caoyuan9642 0:7cf972f622d3 171
caoyuan9642 0:7cf972f622d3 172 return status;
caoyuan9642 0:7cf972f622d3 173 }
caoyuan9642 0:7cf972f622d3 174
caoyuan9642 0:7cf972f622d3 175 /**
caoyuan9642 0:7cf972f622d3 176 * @brief USBD_Start
caoyuan9642 0:7cf972f622d3 177 * Start the USB Device Core.
caoyuan9642 0:7cf972f622d3 178 * @param pdev: Device Handle
caoyuan9642 0:7cf972f622d3 179 * @retval USBD Status
caoyuan9642 0:7cf972f622d3 180 */
caoyuan9642 0:7cf972f622d3 181 USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 182 {
caoyuan9642 0:7cf972f622d3 183
caoyuan9642 0:7cf972f622d3 184 /* Start the low level driver */
caoyuan9642 0:7cf972f622d3 185 USBD_LL_Start(pdev);
caoyuan9642 0:7cf972f622d3 186
caoyuan9642 0:7cf972f622d3 187 return USBD_OK;
caoyuan9642 0:7cf972f622d3 188 }
caoyuan9642 0:7cf972f622d3 189
caoyuan9642 0:7cf972f622d3 190 /**
caoyuan9642 0:7cf972f622d3 191 * @brief USBD_Stop
caoyuan9642 0:7cf972f622d3 192 * Stop the USB Device Core.
caoyuan9642 0:7cf972f622d3 193 * @param pdev: Device Handle
caoyuan9642 0:7cf972f622d3 194 * @retval USBD Status
caoyuan9642 0:7cf972f622d3 195 */
caoyuan9642 0:7cf972f622d3 196 USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 197 {
caoyuan9642 0:7cf972f622d3 198 /* Free Class Resources */
caoyuan9642 0:7cf972f622d3 199 pdev->pClass->DeInit(pdev, pdev->dev_config);
caoyuan9642 0:7cf972f622d3 200
caoyuan9642 0:7cf972f622d3 201 /* Stop the low level driver */
caoyuan9642 0:7cf972f622d3 202 USBD_LL_Stop(pdev);
caoyuan9642 0:7cf972f622d3 203
caoyuan9642 0:7cf972f622d3 204 return USBD_OK;
caoyuan9642 0:7cf972f622d3 205 }
caoyuan9642 0:7cf972f622d3 206
caoyuan9642 0:7cf972f622d3 207 /**
caoyuan9642 0:7cf972f622d3 208 * @brief USBD_RunTestMode
caoyuan9642 0:7cf972f622d3 209 * Launch test mode process
caoyuan9642 0:7cf972f622d3 210 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 211 * @retval status
caoyuan9642 0:7cf972f622d3 212 */
caoyuan9642 0:7cf972f622d3 213 USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 214 {
caoyuan9642 0:7cf972f622d3 215 return USBD_OK;
caoyuan9642 0:7cf972f622d3 216 }
caoyuan9642 0:7cf972f622d3 217
caoyuan9642 0:7cf972f622d3 218
caoyuan9642 0:7cf972f622d3 219 /**
caoyuan9642 0:7cf972f622d3 220 * @brief USBD_SetClassConfig
caoyuan9642 0:7cf972f622d3 221 * Configure device and start the interface
caoyuan9642 0:7cf972f622d3 222 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 223 * @param cfgidx: configuration index
caoyuan9642 0:7cf972f622d3 224 * @retval status
caoyuan9642 0:7cf972f622d3 225 */
caoyuan9642 0:7cf972f622d3 226
caoyuan9642 0:7cf972f622d3 227 USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
caoyuan9642 0:7cf972f622d3 228 {
caoyuan9642 0:7cf972f622d3 229 USBD_StatusTypeDef ret = USBD_FAIL;
caoyuan9642 0:7cf972f622d3 230
caoyuan9642 0:7cf972f622d3 231 if(pdev->pClass != NULL)
caoyuan9642 0:7cf972f622d3 232 {
caoyuan9642 0:7cf972f622d3 233 /* Set configuration and Start the Class*/
caoyuan9642 0:7cf972f622d3 234 if(pdev->pClass->Init(pdev, cfgidx) == 0)
caoyuan9642 0:7cf972f622d3 235 {
caoyuan9642 0:7cf972f622d3 236 ret = USBD_OK;
caoyuan9642 0:7cf972f622d3 237 }
caoyuan9642 0:7cf972f622d3 238 }
caoyuan9642 0:7cf972f622d3 239 return ret;
caoyuan9642 0:7cf972f622d3 240 }
caoyuan9642 0:7cf972f622d3 241
caoyuan9642 0:7cf972f622d3 242 /**
caoyuan9642 0:7cf972f622d3 243 * @brief USBD_ClrClassConfig
caoyuan9642 0:7cf972f622d3 244 * Clear current configuration
caoyuan9642 0:7cf972f622d3 245 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 246 * @param cfgidx: configuration index
caoyuan9642 0:7cf972f622d3 247 * @retval status: USBD_StatusTypeDef
caoyuan9642 0:7cf972f622d3 248 */
caoyuan9642 0:7cf972f622d3 249 USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
caoyuan9642 0:7cf972f622d3 250 {
caoyuan9642 0:7cf972f622d3 251 /* Clear configuration and De-initialize the Class process*/
caoyuan9642 0:7cf972f622d3 252 pdev->pClass->DeInit(pdev, cfgidx);
caoyuan9642 0:7cf972f622d3 253 return USBD_OK;
caoyuan9642 0:7cf972f622d3 254 }
caoyuan9642 0:7cf972f622d3 255
caoyuan9642 0:7cf972f622d3 256
caoyuan9642 0:7cf972f622d3 257 /**
caoyuan9642 0:7cf972f622d3 258 * @brief USBD_SetupStage
caoyuan9642 0:7cf972f622d3 259 * Handle the setup stage
caoyuan9642 0:7cf972f622d3 260 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 261 * @retval status
caoyuan9642 0:7cf972f622d3 262 */
caoyuan9642 0:7cf972f622d3 263 USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup)
caoyuan9642 0:7cf972f622d3 264 {
caoyuan9642 0:7cf972f622d3 265
caoyuan9642 0:7cf972f622d3 266 USBD_ParseSetupRequest(&pdev->request, psetup);
caoyuan9642 0:7cf972f622d3 267
caoyuan9642 0:7cf972f622d3 268 pdev->ep0_state = USBD_EP0_SETUP;
caoyuan9642 0:7cf972f622d3 269 pdev->ep0_data_len = pdev->request.wLength;
caoyuan9642 0:7cf972f622d3 270
caoyuan9642 0:7cf972f622d3 271 switch (pdev->request.bmRequest & 0x1F)
caoyuan9642 0:7cf972f622d3 272 {
caoyuan9642 0:7cf972f622d3 273 case USB_REQ_RECIPIENT_DEVICE:
caoyuan9642 0:7cf972f622d3 274 USBD_StdDevReq (pdev, &pdev->request);
caoyuan9642 0:7cf972f622d3 275 break;
caoyuan9642 0:7cf972f622d3 276
caoyuan9642 0:7cf972f622d3 277 case USB_REQ_RECIPIENT_INTERFACE:
caoyuan9642 0:7cf972f622d3 278 USBD_StdItfReq(pdev, &pdev->request);
caoyuan9642 0:7cf972f622d3 279 break;
caoyuan9642 0:7cf972f622d3 280
caoyuan9642 0:7cf972f622d3 281 case USB_REQ_RECIPIENT_ENDPOINT:
caoyuan9642 0:7cf972f622d3 282 USBD_StdEPReq(pdev, &pdev->request);
caoyuan9642 0:7cf972f622d3 283 break;
caoyuan9642 0:7cf972f622d3 284
caoyuan9642 0:7cf972f622d3 285 default:
caoyuan9642 0:7cf972f622d3 286 USBD_LL_StallEP(pdev , pdev->request.bmRequest & 0x80);
caoyuan9642 0:7cf972f622d3 287 break;
caoyuan9642 0:7cf972f622d3 288 }
caoyuan9642 0:7cf972f622d3 289 return USBD_OK;
caoyuan9642 0:7cf972f622d3 290 }
caoyuan9642 0:7cf972f622d3 291
caoyuan9642 0:7cf972f622d3 292 /**
caoyuan9642 0:7cf972f622d3 293 * @brief USBD_DataOutStage
caoyuan9642 0:7cf972f622d3 294 * Handle data OUT stage
caoyuan9642 0:7cf972f622d3 295 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 296 * @param epnum: endpoint index
caoyuan9642 0:7cf972f622d3 297 * @retval status
caoyuan9642 0:7cf972f622d3 298 */
caoyuan9642 0:7cf972f622d3 299 USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata)
caoyuan9642 0:7cf972f622d3 300 {
caoyuan9642 0:7cf972f622d3 301 USBD_EndpointTypeDef *pep;
caoyuan9642 0:7cf972f622d3 302
caoyuan9642 0:7cf972f622d3 303 if(epnum == 0)
caoyuan9642 0:7cf972f622d3 304 {
caoyuan9642 0:7cf972f622d3 305 pep = &pdev->ep_out[0];
caoyuan9642 0:7cf972f622d3 306
caoyuan9642 0:7cf972f622d3 307 if ( pdev->ep0_state == USBD_EP0_DATA_OUT)
caoyuan9642 0:7cf972f622d3 308 {
caoyuan9642 0:7cf972f622d3 309 if(pep->rem_length > pep->maxpacket)
caoyuan9642 0:7cf972f622d3 310 {
caoyuan9642 0:7cf972f622d3 311 pep->rem_length -= pep->maxpacket;
caoyuan9642 0:7cf972f622d3 312
caoyuan9642 0:7cf972f622d3 313 USBD_CtlContinueRx (pdev,
caoyuan9642 0:7cf972f622d3 314 pdata,
caoyuan9642 0:7cf972f622d3 315 MIN(pep->rem_length ,pep->maxpacket));
caoyuan9642 0:7cf972f622d3 316 }
caoyuan9642 0:7cf972f622d3 317 else
caoyuan9642 0:7cf972f622d3 318 {
caoyuan9642 0:7cf972f622d3 319 if((pdev->pClass->EP0_RxReady != NULL)&&
caoyuan9642 0:7cf972f622d3 320 (pdev->dev_state == USBD_STATE_CONFIGURED))
caoyuan9642 0:7cf972f622d3 321 {
caoyuan9642 0:7cf972f622d3 322 pdev->pClass->EP0_RxReady(pdev);
caoyuan9642 0:7cf972f622d3 323 }
caoyuan9642 0:7cf972f622d3 324 USBD_CtlSendStatus(pdev);
caoyuan9642 0:7cf972f622d3 325 }
caoyuan9642 0:7cf972f622d3 326 }
caoyuan9642 0:7cf972f622d3 327 }
caoyuan9642 0:7cf972f622d3 328 else if((pdev->pClass->DataOut != NULL)&&
caoyuan9642 0:7cf972f622d3 329 (pdev->dev_state == USBD_STATE_CONFIGURED))
caoyuan9642 0:7cf972f622d3 330 {
caoyuan9642 0:7cf972f622d3 331 pdev->pClass->DataOut(pdev, epnum);
caoyuan9642 0:7cf972f622d3 332 }
caoyuan9642 0:7cf972f622d3 333 return USBD_OK;
caoyuan9642 0:7cf972f622d3 334 }
caoyuan9642 0:7cf972f622d3 335
caoyuan9642 0:7cf972f622d3 336 /**
caoyuan9642 0:7cf972f622d3 337 * @brief USBD_DataInStage
caoyuan9642 0:7cf972f622d3 338 * Handle data in stage
caoyuan9642 0:7cf972f622d3 339 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 340 * @param epnum: endpoint index
caoyuan9642 0:7cf972f622d3 341 * @retval status
caoyuan9642 0:7cf972f622d3 342 */
caoyuan9642 0:7cf972f622d3 343 USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, uint8_t *pdata)
caoyuan9642 0:7cf972f622d3 344 {
caoyuan9642 0:7cf972f622d3 345 USBD_EndpointTypeDef *pep;
caoyuan9642 0:7cf972f622d3 346
caoyuan9642 0:7cf972f622d3 347 if(epnum == 0)
caoyuan9642 0:7cf972f622d3 348 {
caoyuan9642 0:7cf972f622d3 349 pep = &pdev->ep_in[0];
caoyuan9642 0:7cf972f622d3 350
caoyuan9642 0:7cf972f622d3 351 if ( pdev->ep0_state == USBD_EP0_DATA_IN)
caoyuan9642 0:7cf972f622d3 352 {
caoyuan9642 0:7cf972f622d3 353 if(pep->rem_length > pep->maxpacket)
caoyuan9642 0:7cf972f622d3 354 {
caoyuan9642 0:7cf972f622d3 355 pep->rem_length -= pep->maxpacket;
caoyuan9642 0:7cf972f622d3 356
caoyuan9642 0:7cf972f622d3 357 USBD_CtlContinueSendData (pdev,
caoyuan9642 0:7cf972f622d3 358 pdata,
caoyuan9642 0:7cf972f622d3 359 pep->rem_length);
caoyuan9642 0:7cf972f622d3 360
caoyuan9642 0:7cf972f622d3 361 /* Prepare endpoint for premature end of transfer */
caoyuan9642 0:7cf972f622d3 362 USBD_LL_PrepareReceive (pdev,
caoyuan9642 0:7cf972f622d3 363 0,
caoyuan9642 0:7cf972f622d3 364 NULL,
caoyuan9642 0:7cf972f622d3 365 0);
caoyuan9642 0:7cf972f622d3 366 }
caoyuan9642 0:7cf972f622d3 367 else
caoyuan9642 0:7cf972f622d3 368 { /* last packet is MPS multiple, so send ZLP packet */
caoyuan9642 0:7cf972f622d3 369 if((pep->total_length % pep->maxpacket == 0) &&
caoyuan9642 0:7cf972f622d3 370 (pep->total_length >= pep->maxpacket) &&
caoyuan9642 0:7cf972f622d3 371 (pep->total_length < pdev->ep0_data_len ))
caoyuan9642 0:7cf972f622d3 372 {
caoyuan9642 0:7cf972f622d3 373
caoyuan9642 0:7cf972f622d3 374 USBD_CtlContinueSendData(pdev , NULL, 0);
caoyuan9642 0:7cf972f622d3 375 pdev->ep0_data_len = 0;
caoyuan9642 0:7cf972f622d3 376
caoyuan9642 0:7cf972f622d3 377 /* Prepare endpoint for premature end of transfer */
caoyuan9642 0:7cf972f622d3 378 USBD_LL_PrepareReceive (pdev,
caoyuan9642 0:7cf972f622d3 379 0,
caoyuan9642 0:7cf972f622d3 380 NULL,
caoyuan9642 0:7cf972f622d3 381 0);
caoyuan9642 0:7cf972f622d3 382 }
caoyuan9642 0:7cf972f622d3 383 else
caoyuan9642 0:7cf972f622d3 384 {
caoyuan9642 0:7cf972f622d3 385 if((pdev->pClass->EP0_TxSent != NULL)&&
caoyuan9642 0:7cf972f622d3 386 (pdev->dev_state == USBD_STATE_CONFIGURED))
caoyuan9642 0:7cf972f622d3 387 {
caoyuan9642 0:7cf972f622d3 388 pdev->pClass->EP0_TxSent(pdev);
caoyuan9642 0:7cf972f622d3 389 }
caoyuan9642 0:7cf972f622d3 390 USBD_CtlReceiveStatus(pdev);
caoyuan9642 0:7cf972f622d3 391 }
caoyuan9642 0:7cf972f622d3 392 }
caoyuan9642 0:7cf972f622d3 393 }
caoyuan9642 0:7cf972f622d3 394 if (pdev->dev_test_mode == 1)
caoyuan9642 0:7cf972f622d3 395 {
caoyuan9642 0:7cf972f622d3 396 USBD_RunTestMode(pdev);
caoyuan9642 0:7cf972f622d3 397 pdev->dev_test_mode = 0;
caoyuan9642 0:7cf972f622d3 398 }
caoyuan9642 0:7cf972f622d3 399 }
caoyuan9642 0:7cf972f622d3 400 else if((pdev->pClass->DataIn != NULL)&&
caoyuan9642 0:7cf972f622d3 401 (pdev->dev_state == USBD_STATE_CONFIGURED))
caoyuan9642 0:7cf972f622d3 402 {
caoyuan9642 0:7cf972f622d3 403 pdev->pClass->DataIn(pdev, epnum);
caoyuan9642 0:7cf972f622d3 404 }
caoyuan9642 0:7cf972f622d3 405 return USBD_OK;
caoyuan9642 0:7cf972f622d3 406 }
caoyuan9642 0:7cf972f622d3 407
caoyuan9642 0:7cf972f622d3 408 /**
caoyuan9642 0:7cf972f622d3 409 * @brief USBD_LL_Reset
caoyuan9642 0:7cf972f622d3 410 * Handle Reset event
caoyuan9642 0:7cf972f622d3 411 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 412 * @retval status
caoyuan9642 0:7cf972f622d3 413 */
caoyuan9642 0:7cf972f622d3 414
caoyuan9642 0:7cf972f622d3 415 USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 416 {
caoyuan9642 0:7cf972f622d3 417 /* Open EP0 OUT */
caoyuan9642 0:7cf972f622d3 418 USBD_LL_OpenEP(pdev,
caoyuan9642 0:7cf972f622d3 419 0x00,
caoyuan9642 0:7cf972f622d3 420 USBD_EP_TYPE_CTRL,
caoyuan9642 0:7cf972f622d3 421 USB_MAX_EP0_SIZE);
caoyuan9642 0:7cf972f622d3 422
caoyuan9642 0:7cf972f622d3 423 pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE;
caoyuan9642 0:7cf972f622d3 424
caoyuan9642 0:7cf972f622d3 425 /* Open EP0 IN */
caoyuan9642 0:7cf972f622d3 426 USBD_LL_OpenEP(pdev,
caoyuan9642 0:7cf972f622d3 427 0x80,
caoyuan9642 0:7cf972f622d3 428 USBD_EP_TYPE_CTRL,
caoyuan9642 0:7cf972f622d3 429 USB_MAX_EP0_SIZE);
caoyuan9642 0:7cf972f622d3 430
caoyuan9642 0:7cf972f622d3 431 pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE;
caoyuan9642 0:7cf972f622d3 432 /* Upon Reset call user call back */
caoyuan9642 0:7cf972f622d3 433 pdev->dev_state = USBD_STATE_DEFAULT;
caoyuan9642 0:7cf972f622d3 434
caoyuan9642 0:7cf972f622d3 435 if (pdev->pClassData)
caoyuan9642 0:7cf972f622d3 436 pdev->pClass->DeInit(pdev, pdev->dev_config);
caoyuan9642 0:7cf972f622d3 437
caoyuan9642 0:7cf972f622d3 438
caoyuan9642 0:7cf972f622d3 439 return USBD_OK;
caoyuan9642 0:7cf972f622d3 440 }
caoyuan9642 0:7cf972f622d3 441
caoyuan9642 0:7cf972f622d3 442
caoyuan9642 0:7cf972f622d3 443
caoyuan9642 0:7cf972f622d3 444
caoyuan9642 0:7cf972f622d3 445 /**
caoyuan9642 0:7cf972f622d3 446 * @brief USBD_LL_Reset
caoyuan9642 0:7cf972f622d3 447 * Handle Reset event
caoyuan9642 0:7cf972f622d3 448 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 449 * @retval status
caoyuan9642 0:7cf972f622d3 450 */
caoyuan9642 0:7cf972f622d3 451 USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed)
caoyuan9642 0:7cf972f622d3 452 {
caoyuan9642 0:7cf972f622d3 453 pdev->dev_speed = speed;
caoyuan9642 0:7cf972f622d3 454 return USBD_OK;
caoyuan9642 0:7cf972f622d3 455 }
caoyuan9642 0:7cf972f622d3 456
caoyuan9642 0:7cf972f622d3 457 /**
caoyuan9642 0:7cf972f622d3 458 * @brief USBD_Suspend
caoyuan9642 0:7cf972f622d3 459 * Handle Suspend event
caoyuan9642 0:7cf972f622d3 460 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 461 * @retval status
caoyuan9642 0:7cf972f622d3 462 */
caoyuan9642 0:7cf972f622d3 463
caoyuan9642 0:7cf972f622d3 464 USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 465 {
caoyuan9642 0:7cf972f622d3 466 pdev->dev_old_state = pdev->dev_state;
caoyuan9642 0:7cf972f622d3 467 pdev->dev_state = USBD_STATE_SUSPENDED;
caoyuan9642 0:7cf972f622d3 468 return USBD_OK;
caoyuan9642 0:7cf972f622d3 469 }
caoyuan9642 0:7cf972f622d3 470
caoyuan9642 0:7cf972f622d3 471 /**
caoyuan9642 0:7cf972f622d3 472 * @brief USBD_Resume
caoyuan9642 0:7cf972f622d3 473 * Handle Resume event
caoyuan9642 0:7cf972f622d3 474 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 475 * @retval status
caoyuan9642 0:7cf972f622d3 476 */
caoyuan9642 0:7cf972f622d3 477
caoyuan9642 0:7cf972f622d3 478 USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 479 {
caoyuan9642 0:7cf972f622d3 480 pdev->dev_state = pdev->dev_old_state;
caoyuan9642 0:7cf972f622d3 481 return USBD_OK;
caoyuan9642 0:7cf972f622d3 482 }
caoyuan9642 0:7cf972f622d3 483
caoyuan9642 0:7cf972f622d3 484 /**
caoyuan9642 0:7cf972f622d3 485 * @brief USBD_SOF
caoyuan9642 0:7cf972f622d3 486 * Handle SOF event
caoyuan9642 0:7cf972f622d3 487 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 488 * @retval status
caoyuan9642 0:7cf972f622d3 489 */
caoyuan9642 0:7cf972f622d3 490
caoyuan9642 0:7cf972f622d3 491 USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 492 {
caoyuan9642 0:7cf972f622d3 493 if(pdev->dev_state == USBD_STATE_CONFIGURED)
caoyuan9642 0:7cf972f622d3 494 {
caoyuan9642 0:7cf972f622d3 495 if(pdev->pClass->SOF != NULL)
caoyuan9642 0:7cf972f622d3 496 {
caoyuan9642 0:7cf972f622d3 497 pdev->pClass->SOF(pdev);
caoyuan9642 0:7cf972f622d3 498 }
caoyuan9642 0:7cf972f622d3 499 }
caoyuan9642 0:7cf972f622d3 500 return USBD_OK;
caoyuan9642 0:7cf972f622d3 501 }
caoyuan9642 0:7cf972f622d3 502
caoyuan9642 0:7cf972f622d3 503 /**
caoyuan9642 0:7cf972f622d3 504 * @brief USBD_IsoINIncomplete
caoyuan9642 0:7cf972f622d3 505 * Handle iso in incomplete event
caoyuan9642 0:7cf972f622d3 506 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 507 * @retval status
caoyuan9642 0:7cf972f622d3 508 */
caoyuan9642 0:7cf972f622d3 509 USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum)
caoyuan9642 0:7cf972f622d3 510 {
caoyuan9642 0:7cf972f622d3 511 return USBD_OK;
caoyuan9642 0:7cf972f622d3 512 }
caoyuan9642 0:7cf972f622d3 513
caoyuan9642 0:7cf972f622d3 514 /**
caoyuan9642 0:7cf972f622d3 515 * @brief USBD_IsoOUTIncomplete
caoyuan9642 0:7cf972f622d3 516 * Handle iso out incomplete event
caoyuan9642 0:7cf972f622d3 517 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 518 * @retval status
caoyuan9642 0:7cf972f622d3 519 */
caoyuan9642 0:7cf972f622d3 520 USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum)
caoyuan9642 0:7cf972f622d3 521 {
caoyuan9642 0:7cf972f622d3 522 return USBD_OK;
caoyuan9642 0:7cf972f622d3 523 }
caoyuan9642 0:7cf972f622d3 524
caoyuan9642 0:7cf972f622d3 525 /**
caoyuan9642 0:7cf972f622d3 526 * @brief USBD_DevConnected
caoyuan9642 0:7cf972f622d3 527 * Handle device connection event
caoyuan9642 0:7cf972f622d3 528 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 529 * @retval status
caoyuan9642 0:7cf972f622d3 530 */
caoyuan9642 0:7cf972f622d3 531 USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 532 {
caoyuan9642 0:7cf972f622d3 533 return USBD_OK;
caoyuan9642 0:7cf972f622d3 534 }
caoyuan9642 0:7cf972f622d3 535
caoyuan9642 0:7cf972f622d3 536 /**
caoyuan9642 0:7cf972f622d3 537 * @brief USBD_DevDisconnected
caoyuan9642 0:7cf972f622d3 538 * Handle device disconnection event
caoyuan9642 0:7cf972f622d3 539 * @param pdev: device instance
caoyuan9642 0:7cf972f622d3 540 * @retval status
caoyuan9642 0:7cf972f622d3 541 */
caoyuan9642 0:7cf972f622d3 542 USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev)
caoyuan9642 0:7cf972f622d3 543 {
caoyuan9642 0:7cf972f622d3 544 /* Free Class Resources */
caoyuan9642 0:7cf972f622d3 545 pdev->dev_state = USBD_STATE_DEFAULT;
caoyuan9642 0:7cf972f622d3 546 pdev->pClass->DeInit(pdev, pdev->dev_config);
caoyuan9642 0:7cf972f622d3 547
caoyuan9642 0:7cf972f622d3 548 return USBD_OK;
caoyuan9642 0:7cf972f622d3 549 }
caoyuan9642 0:7cf972f622d3 550 /**
caoyuan9642 0:7cf972f622d3 551 * @}
caoyuan9642 0:7cf972f622d3 552 */
caoyuan9642 0:7cf972f622d3 553
caoyuan9642 0:7cf972f622d3 554
caoyuan9642 0:7cf972f622d3 555 /**
caoyuan9642 0:7cf972f622d3 556 * @}
caoyuan9642 0:7cf972f622d3 557 */
caoyuan9642 0:7cf972f622d3 558
caoyuan9642 0:7cf972f622d3 559
caoyuan9642 0:7cf972f622d3 560 /**
caoyuan9642 0:7cf972f622d3 561 * @}
caoyuan9642 0:7cf972f622d3 562 */
caoyuan9642 0:7cf972f622d3 563
caoyuan9642 0:7cf972f622d3 564 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
caoyuan9642 0:7cf972f622d3 565
caoyuan9642 0:7cf972f622d3 566