STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
usbd_core.c
Go to the documentation of this file.
1 
28 /* Includes ------------------------------------------------------------------*/
29 #include "usbd_core.h"
30 
97 {
98  /* Check whether the USB Host handle is valid */
99  if(pdev == NULL)
100  {
101  USBD_ErrLog("Invalid Device handle");
102  return USBD_FAIL;
103  }
104 
105  /* Unlink previous class*/
106  if(pdev->pClass != NULL)
107  {
108  pdev->pClass = NULL;
109  }
110 
111  /* Assign USBD Descriptors */
112  if(pdesc != NULL)
113  {
114  pdev->pDesc = pdesc;
115  }
116 
117  /* Set Device initial State */
119  pdev->id = id;
120  /* Initialize low level driver */
121  USBD_LL_Init(pdev);
122 
123  return USBD_OK;
124 }
125 
133 {
134  /* Set Default State */
136 
137  /* Free Class Resources */
138  pdev->pClass->DeInit(pdev, pdev->dev_config);
139 
140  /* Stop the low level driver */
141  USBD_LL_Stop(pdev);
142 
143  /* Initialize low level driver */
144  USBD_LL_DeInit(pdev);
145 
146  return USBD_OK;
147 }
148 
149 
158 {
159  USBD_StatusTypeDef status = USBD_OK;
160  if(pclass != 0)
161  {
162  /* link the class to the USB Device handle */
163  pdev->pClass = pclass;
164  status = USBD_OK;
165  }
166  else
167  {
168  USBD_ErrLog("Invalid Class handle");
169  status = USBD_FAIL;
170  }
171 
172  return status;
173 }
174 
182 {
183 
184  /* Start the low level driver */
185  USBD_LL_Start(pdev);
186 
187  return USBD_OK;
188 }
189 
197 {
198  /* Free Class Resources */
199  pdev->pClass->DeInit(pdev, pdev->dev_config);
200 
201  /* Stop the low level driver */
202  USBD_LL_Stop(pdev);
203 
204  return USBD_OK;
205 }
206 
214 {
215  return USBD_OK;
216 }
217 
218 
228 {
230 
231  if(pdev->pClass != NULL)
232  {
233  /* Set configuration and Start the Class*/
234  if(pdev->pClass->Init(pdev, cfgidx) == 0)
235  {
236  ret = USBD_OK;
237  }
238  }
239  return ret;
240 }
241 
250 {
251  /* Clear configuration and De-initialize the Class process*/
252  pdev->pClass->DeInit(pdev, cfgidx);
253  return USBD_OK;
254 }
255 
256 
264 {
265 
266  USBD_ParseSetupRequest(&pdev->request, psetup);
267 
268  pdev->ep0_state = USBD_EP0_SETUP;
269  pdev->ep0_data_len = pdev->request.wLength;
270 
271  switch (pdev->request.bmRequest & 0x1F)
272  {
274  USBD_StdDevReq (pdev, &pdev->request);
275  break;
276 
278  USBD_StdItfReq(pdev, &pdev->request);
279  break;
280 
282  USBD_StdEPReq(pdev, &pdev->request);
283  break;
284 
285  default:
286  USBD_LL_StallEP(pdev , pdev->request.bmRequest & 0x80);
287  break;
288  }
289  return USBD_OK;
290 }
291 
299 USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata)
300 {
302 
303  if(epnum == 0)
304  {
305  pep = &pdev->ep_out[0];
306 
307  if ( pdev->ep0_state == USBD_EP0_DATA_OUT)
308  {
309  if(pep->rem_length > pep->maxpacket)
310  {
311  pep->rem_length -= pep->maxpacket;
312 
313  USBD_CtlContinueRx (pdev,
314  pdata,
315  MIN(pep->rem_length ,pep->maxpacket));
316  }
317  else
318  {
319  if((pdev->pClass->EP0_RxReady != NULL)&&
320  (pdev->dev_state == USBD_STATE_CONFIGURED))
321  {
322  pdev->pClass->EP0_RxReady(pdev);
323  }
324  USBD_CtlSendStatus(pdev);
325  }
326  }
327  }
328  else if((pdev->pClass->DataOut != NULL)&&
329  (pdev->dev_state == USBD_STATE_CONFIGURED))
330  {
331  pdev->pClass->DataOut(pdev, epnum);
332  }
333  return USBD_OK;
334 }
335 
343 USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, uint8_t *pdata)
344 {
346 
347  if(epnum == 0)
348  {
349  pep = &pdev->ep_in[0];
350 
351  if ( pdev->ep0_state == USBD_EP0_DATA_IN)
352  {
353  if(pep->rem_length > pep->maxpacket)
354  {
355  pep->rem_length -= pep->maxpacket;
356 
358  pdata,
359  pep->rem_length);
360 
361  /* Prepare endpoint for premature end of transfer */
363  0,
364  NULL,
365  0);
366  }
367  else
368  { /* last packet is MPS multiple, so send ZLP packet */
369  if((pep->total_length % pep->maxpacket == 0) &&
370  (pep->total_length >= pep->maxpacket) &&
371  (pep->total_length < pdev->ep0_data_len ))
372  {
373 
374  USBD_CtlContinueSendData(pdev , NULL, 0);
375  pdev->ep0_data_len = 0;
376 
377  /* Prepare endpoint for premature end of transfer */
379  0,
380  NULL,
381  0);
382  }
383  else
384  {
385  if((pdev->pClass->EP0_TxSent != NULL)&&
386  (pdev->dev_state == USBD_STATE_CONFIGURED))
387  {
388  pdev->pClass->EP0_TxSent(pdev);
389  }
390  USBD_CtlReceiveStatus(pdev);
391  }
392  }
393  }
394  if (pdev->dev_test_mode == 1)
395  {
396  USBD_RunTestMode(pdev);
397  pdev->dev_test_mode = 0;
398  }
399  }
400  else if((pdev->pClass->DataIn != NULL)&&
401  (pdev->dev_state == USBD_STATE_CONFIGURED))
402  {
403  pdev->pClass->DataIn(pdev, epnum);
404  }
405  return USBD_OK;
406 }
407 
416 {
417  /* Open EP0 OUT */
418  USBD_LL_OpenEP(pdev,
419  0x00,
422 
423  pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE;
424 
425  /* Open EP0 IN */
426  USBD_LL_OpenEP(pdev,
427  0x80,
430 
431  pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE;
432  /* Upon Reset call user call back */
434 
435  if (pdev->pClassData)
436  pdev->pClass->DeInit(pdev, pdev->dev_config);
437 
438 
439  return USBD_OK;
440 }
441 
442 
443 
444 
452 {
453  pdev->dev_speed = speed;
454  return USBD_OK;
455 }
456 
465 {
466  pdev->dev_old_state = pdev->dev_state;
468  return USBD_OK;
469 }
470 
479 {
480  pdev->dev_state = pdev->dev_old_state;
481  return USBD_OK;
482 }
483 
492 {
493  if(pdev->dev_state == USBD_STATE_CONFIGURED)
494  {
495  if(pdev->pClass->SOF != NULL)
496  {
497  pdev->pClass->SOF(pdev);
498  }
499  }
500  return USBD_OK;
501 }
502 
510 {
511  return USBD_OK;
512 }
513 
521 {
522  return USBD_OK;
523 }
524 
532 {
533  return USBD_OK;
534 }
535 
543 {
544  /* Free Class Resources */
546  pdev->pClass->DeInit(pdev, pdev->dev_config);
547 
548  return USBD_OK;
549 }
564 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
565 
uint32_t maxpacket
Definition: usbd_def.h:221
USBD_StatusTypeDef
Definition: usbd_def.h:194
USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev)
USBD_CtlSendStatus send zero lzngth packet on the ctl pipe.
Definition: usbd_ioreq.c:177
USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
USBD_StdEPReq Handle standard usb endpoint requests.
Definition: usbd_ctlreq.c:207
uint8_t dev_old_state
Definition: usbd_def.h:237
USBD_EndpointTypeDef ep_in[15]
Definition: usbd_def.h:232
uint8_t bmRequest
Definition: usbd_def.h:151
uint8_t(* EP0_RxReady)(struct _USBD_HandleTypeDef *pdev)
Definition: usbd_def.h:167
USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev)
USBD_SOF Handle SOF event.
Definition: usbd_core.c:491
USBD_SpeedTypeDef
Definition: usbd_def.h:186
USBD_SetupReqTypedef request
Definition: usbd_def.h:243
uint8_t(* DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum)
Definition: usbd_def.h:170
USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum)
USBD_IsoINIncomplete Handle iso in incomplete event.
Definition: usbd_core.c:509
USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum)
USBD_IsoOUTIncomplete Handle iso out incomplete event.
Definition: usbd_core.c:520
uint8_t(* Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx)
Definition: usbd_def.h:162
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
Starts the Low Level portion of the Device driver.
Definition: usbd_conf.c:448
void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata)
USBD_ParseSetupRequest Copy buffer into setup structure.
Definition: usbd_ctlreq.c:698
USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata)
USBD_DataInStage Handle data in stage.
Definition: usbd_core.c:343
#define USB_REQ_RECIPIENT_DEVICE
Definition: usbd_def.h:78
#define USB_REQ_RECIPIENT_ENDPOINT
Definition: usbd_def.h:80
USBD_DescriptorsTypeDef * pDesc
Definition: usbd_def.h:244
uint32_t dev_config
Definition: usbd_def.h:228
USBD_SpeedTypeDef dev_speed
Definition: usbd_def.h:231
USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev)
USBD_DevConnected Handle device connection event.
Definition: usbd_core.c:531
USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
USBD_SetClassConfig Configure device and start the interface.
Definition: usbd_core.c:227
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size)
Prepares an endpoint for reception.
Definition: usbd_conf.c:591
USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
Initializes the Low Level portion of the Device driver.
Definition: usbd_conf.c:363
#define USBD_STATE_DEFAULT
Definition: usbd_def.h:118
#define USB_REQ_RECIPIENT_INTERFACE
Definition: usbd_def.h:79
USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata)
USBD_DataOutStage Handle data OUT stage.
Definition: usbd_core.c:299
#define NULL
Definition: usbd_def.h:53
#define USBD_EP0_DATA_OUT
Definition: usbd_def.h:128
USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup)
USBD_SetupStage Handle the setup stage.
Definition: usbd_core.c:263
uint8_t(* EP0_TxSent)(struct _USBD_HandleTypeDef *pdev)
Definition: usbd_def.h:166
USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev)
USBD_DevDisconnected Handle device disconnection event.
Definition: usbd_core.c:542
USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev)
USBD_LL_Reset Handle Reset event.
Definition: usbd_core.c:415
USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev)
USBD_Start Start the USB Device Core.
Definition: usbd_core.c:181
uint16_t wLength
Definition: usbd_def.h:155
#define USBD_EP_TYPE_CTRL
Definition: usbd_def.h:133
uint32_t ep0_state
Definition: usbd_def.h:234
USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
Sets a Stall condition on an endpoint of the Low Level Driver.
Definition: usbd_conf.c:516
USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint16_t len)
USBD_CtlContinueSendData continue sending data on the ctl pipe.
Definition: usbd_ioreq.c:117
USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
USBD_StdDevReq Handle standard usb device requests.
Definition: usbd_ctlreq.c:119
uint8_t(* DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum)
Definition: usbd_def.h:169
USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev)
USBD_Stop Stop the USB Device Core.
Definition: usbd_core.c:196
USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
USBD_ClrClassConfig Clear current configuration.
Definition: usbd_core.c:249
uint32_t ep0_data_len
Definition: usbd_def.h:235
USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed)
USBD_LL_Reset Handle Reset event.
Definition: usbd_core.c:451
#define USBD_EP0_DATA_IN
Definition: usbd_def.h:127
USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id)
USBD_Init Initializes the device stack and load the class driver.
Definition: usbd_core.c:96
USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
USBD_StdItfReq Handle standard usb interface requests.
Definition: usbd_ctlreq.c:170
USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev)
USBD_CtlReceiveStatus receive zero lzngth packet on the ctl pipe.
Definition: usbd_ioreq.c:195
uint32_t rem_length
Definition: usbd_def.h:220
USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev)
USBD_Resume Handle Resume event.
Definition: usbd_core.c:478
#define USB_MAX_EP0_SIZE
Definition: usbd_def.h:115
USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev)
USBD_RunTestMode Launch test mode process.
Definition: usbd_core.c:213
uint8_t dev_test_mode
Definition: usbd_def.h:240
USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass)
USBD_RegisterClass Link class driver to Device Core.
Definition: usbd_core.c:157
USBD_ClassTypeDef * pClass
Definition: usbd_def.h:245
USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev)
USBD_Suspend Handle Suspend event.
Definition: usbd_core.c:464
USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev)
Stops the Low Level portion of the Device driver.
Definition: usbd_conf.c:459
#define USBD_STATE_SUSPENDED
Definition: usbd_def.h:121
#define USBD_EP0_SETUP
Definition: usbd_def.h:126
USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps)
Opens an endpoint of the Low Level Driver.
Definition: usbd_conf.c:473
#define USBD_ErrLog(...)
Definition: usbd_conf.h:92
#define USBD_STATE_CONFIGURED
Definition: usbd_def.h:120
USBD_EndpointTypeDef ep_out[15]
Definition: usbd_def.h:233
uint8_t(* SOF)(struct _USBD_HandleTypeDef *pdev)
Definition: usbd_def.h:171
USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint16_t len)
USBD_CtlContinueRx continue receive data on the ctl pipe.
Definition: usbd_ioreq.c:160
Header file for usbd_core.c file.
USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev)
USBD_DeInit Re-Initialize th device library.
Definition: usbd_core.c:132
#define MIN(a, b)
Definition: usbd_def.h:265
uint8_t(* DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx)
Definition: usbd_def.h:163
USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)
De-Initializes the Low Level portion of the Device driver.
Definition: usbd_conf.c:437
uint32_t total_length
Definition: usbd_def.h:219