APM:Libraries
usbd_core.c
Go to the documentation of this file.
1 
28 /* Includes ------------------------------------------------------------------*/
29 #include "usbd_core.h"
30 #include "usbd_req.h"
31 #include "usbd_ioreq.h"
32 #include "usb_dcd_int.h"
33 #include "usb_bsp.h"
34 
75 static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev);
76 static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
77 static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
78 static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev);
79 static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev);
80 static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev);
81 static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev);
82 #ifdef VBUS_SENSING_ENABLED
83 static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev);
84 static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev);
85 #endif
86 static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev);
87 static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev);
88 static uint8_t USBD_RunTestMode (USB_OTG_CORE_HANDLE *pdev) ;
98 
100 {
104  USBD_SOF,
105  USBD_Reset,
106  USBD_Suspend,
107  USBD_Resume,
110 #ifdef VBUS_SENSING_ENABLED
111  USBD_DevConnected,
112  USBD_DevDisconnected,
113 #endif
114 };
115 
135  const USB_OTG_CORE_ID_TypeDef coreID,
136  const USBD_DEVICE *pDevice,
137  const USBD_Class_cb_TypeDef *class_cb,
138  const USBD_Usr_cb_TypeDef *usr_cb)
139 {
140  /* Hardware Init */
141  USB_OTG_BSP_Init(pdev);
142 
143  USBD_DeInit(pdev);
144 
145  /*Register class and user callbacks */
146  pdev->dev.class_cb = class_cb;
147  pdev->dev.usr_cb = usr_cb;
148  pdev->dev.usr_device = pDevice;
149 
150  /* set USB OTG core params */
151  DCD_Init(pdev , coreID);
152 
153  /* Upon Init call usr callback */
154  pdev->dev.usr_cb->Init();
155 
156  /* Enable Interrupts */
158 }
159 
167 {
168  /* Software Init */
169 
170  return USBD_OK;
171 }
172 
180 {
181  USB_SETUP_REQ req;
182 
183  USBD_ParseSetupRequest(pdev , &req);
184 
185  switch (req.bmRequest & 0x1F)
186  {
188  USBD_StdDevReq (pdev, &req);
189  break;
190 
192  USBD_StdItfReq(pdev, &req);
193  break;
194 
196  USBD_StdEPReq(pdev, &req);
197  break;
198 
199  default:
200  DCD_EP_Stall(pdev , req.bmRequest & 0x80);
201  break;
202  }
203  return USBD_OK;
204 }
205 
213 static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
214 {
215  USB_OTG_EP *ep;
216 
217  if(epnum == 0)
218  {
219  ep = &pdev->dev.out_ep[0];
220  if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT)
221  {
222  if(ep->rem_data_len > ep->maxpacket)
223  {
224  ep->rem_data_len -= ep->maxpacket;
225 
226  if(pdev->cfg.dma_enable == 1)
227  {
228  /* in slave mode this, is handled by the RxSTSQLvl ISR */
229  ep->xfer_buff += ep->maxpacket;
230  }
231  USBD_CtlContinueRx (pdev,
232  ep->xfer_buff,
233  MIN(ep->rem_data_len ,ep->maxpacket));
234  }
235  else
236  {
237  if((pdev->dev.class_cb->EP0_RxReady != NULL)&&
239  {
240  pdev->dev.class_cb->EP0_RxReady(pdev);
241  }
242  USBD_CtlSendStatus(pdev);
243  }
244  }
245  }
246  else if((pdev->dev.class_cb->DataOut != NULL)&&
248  {
249  pdev->dev.class_cb->DataOut(pdev, epnum);
250  }
251  return USBD_OK;
252 }
253 
261 static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum)
262 {
263  USB_OTG_EP *ep;
264 
265  if(epnum == 0)
266  {
267  ep = &pdev->dev.in_ep[0];
268  if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN)
269  {
270  if(ep->rem_data_len > ep->maxpacket)
271  {
272  ep->rem_data_len -= ep->maxpacket;
273  if(pdev->cfg.dma_enable == 1)
274  {
275  /* in slave mode this, is handled by the TxFifoEmpty ISR */
276  ep->xfer_buff += ep->maxpacket;
277  }
279  ep->xfer_buff,
280  ep->rem_data_len);
281  }
282  else
283  { /* last packet is MPS multiple, so send ZLP packet */
284  if((ep->total_data_len % ep->maxpacket == 0) &&
285  (ep->total_data_len >= ep->maxpacket) &&
286  (ep->total_data_len < ep->ctl_data_len ))
287  {
288 
289  USBD_CtlContinueSendData(pdev , NULL, 0);
290  ep->ctl_data_len = 0;
291  }
292  else
293  {
294  if((pdev->dev.class_cb->EP0_TxSent != NULL)&&
296  {
297  pdev->dev.class_cb->EP0_TxSent(pdev);
298  }
299  USBD_CtlReceiveStatus(pdev);
300  }
301  }
302  }
303  if (pdev->dev.test_mode == 1)
304  {
305  USBD_RunTestMode(pdev);
306  pdev->dev.test_mode = 0;
307  }
308  }
309  else if((pdev->dev.class_cb->DataIn != NULL)&&
311  {
312  pdev->dev.class_cb->DataIn(pdev, epnum);
313  }
314  return USBD_OK;
315 }
316 
317 
318 
319 
326 static uint8_t USBD_RunTestMode (USB_OTG_CORE_HANDLE *pdev)
327 {
329  return USBD_OK;
330 }
331 
339 static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev)
340 {
341  /* Open EP0 OUT */
342  DCD_EP_Open(pdev,
343  0x00,
345  EP_TYPE_CTRL);
346 
347  /* Open EP0 IN */
348  DCD_EP_Open(pdev,
349  0x80,
351  EP_TYPE_CTRL);
352 
353  /* Upon Reset call usr call back */
355  pdev->dev.usr_cb->DeviceReset(pdev->cfg.speed);
356 
357  return USBD_OK;
358 }
359 
367 static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev)
368 {
369  /* Upon Resume call usr call back */
370  pdev->dev.usr_cb->DeviceResumed();
371  pdev->dev.device_status = pdev->dev.device_old_status;
373  return USBD_OK;
374 }
375 
376 
384 static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev)
385 {
386  pdev->dev.device_old_status = pdev->dev.device_status;
388  /* Upon Resume call usr call back */
389  pdev->dev.usr_cb->DeviceSuspended();
390  return USBD_OK;
391 }
392 
393 
401 static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev)
402 {
403  if(pdev->dev.class_cb->SOF)
404  {
405  pdev->dev.class_cb->SOF(pdev);
406  }
407  return USBD_OK;
408 }
418 {
419  pdev->dev.class_cb->Init(pdev, cfgidx);
420 
421  /* Upon set config call usr call back */
422  pdev->dev.usr_cb->DeviceConfigured();
423  return USBD_OK;
424 }
425 
434 {
435  pdev->dev.class_cb->DeInit(pdev, cfgidx);
436  return USBD_OK;
437 }
438 
446 {
447  pdev->dev.class_cb->IsoINIncomplete(pdev);
448  return USBD_OK;
449 }
450 
458 {
459  pdev->dev.class_cb->IsoOUTIncomplete(pdev);
460  return USBD_OK;
461 }
462 
463 #ifdef VBUS_SENSING_ENABLED
464 
470 static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev)
471 {
472  pdev->dev.usr_cb->DeviceConnected();
473  pdev->dev.connection_status = 1;
474  return USBD_OK;
475 }
476 
483 static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev)
484 {
485  pdev->dev.usr_cb->DeviceDisconnected();
486  pdev->dev.class_cb->DeInit(pdev, 0);
487  pdev->dev.connection_status = 0;
488  return USBD_OK;
489 }
490 #endif
491 
505 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
506 
static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev)
USBD_IsoOUTIncomplete Handle iso out incomplete event.
Definition: usbd_core.c:457
#define USB_OTG_DEFAULT
Definition: usb_dcd.h:56
USBD_Status USBD_StdItfReq(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
USBD_StdItfReq Handle standard usb interface requests.
Definition: usbd_req.c:200
Specific api&#39;s relative to the used hardware platform.
header file for the usbd_req.c file
uint8_t(* Init)(void *pdev, uint8_t cfgidx)
Definition: usb_core.h:212
uint8_t(* EP0_RxReady)(void *pdev)
Definition: usb_core.h:217
void(* DeviceConfigured)(void)
Definition: usb_core.h:242
uint8_t(* DataIn)(void *pdev, uint8_t epnum)
Definition: usb_core.h:219
USBD_Status
Definition: usbd_core.h:51
static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev)
USBD_IsoINIncomplete Handle iso in incomplete event.
Definition: usbd_core.c:445
uint32_t ctl_data_len
Definition: usb_core.h:154
uint8_t(* DataOut)(void *pdev, uint8_t epnum)
Definition: usb_core.h:220
static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
USBD_DataOutStage Handle data out stage.
Definition: usbd_core.c:213
static uint8_t USBD_RunTestMode(USB_OTG_CORE_HANDLE *pdev)
USBD_RunTestMode Launch test mode process.
Definition: usbd_core.c:326
void(* DeviceDisconnected)(void)
Definition: usb_core.h:247
USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx)
USBD_ClrCfg Clear current configuration.
Definition: usbd_core.c:433
void DCD_Init(USB_OTG_CORE_HANDLE *pdev, USB_OTG_CORE_ID_TypeDef coreID)
Definition: usb_dcd.c:91
#define EP_TYPE_CTRL
Definition: usb_defines.h:140
void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev)
Definition: usb.c:310
USB_OTG_CORE_ID_TypeDef
Definition: usb_defines.h:186
void(* DeviceReset)(uint8_t speed)
Definition: usb_core.h:241
#define USB_OTG_SUSPENDED
Definition: usb_dcd.h:59
void(* Init)(void)
Definition: usb_core.h:240
uint8_t device_state
Definition: usb_core.h:255
uint8_t test_mode
Definition: usb_core.h:260
#define USB_OTG_MAX_EP0_SIZE
Definition: usb_regs.h:71
#define MIN(a, b)
Definition: usb_conf.h:215
USB_OTG_CORE_CFGS cfg
Definition: usb_core.h:298
uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type)
Configure an EP.
Definition: usb_dcd.c:155
Peripheral Device Interface Layer.
uint8_t speed
Definition: usb_core.h:166
#define USB_OTG_EP0_DATA_OUT
Definition: usb_core.h:55
__IO USB_OTG_DCTL_TypeDef SET_TEST_MODE
Definition: usbd_core.c:97
USB_OTG_EP in_ep[USB_OTG_MAX_TX_FIFOS]
Definition: usb_core.h:262
static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev)
USBD_SOF Handle SOF event.
Definition: usbd_core.c:401
uint8_t(* DeInit)(void *pdev, uint8_t cfgidx)
Definition: usb_core.h:213
#define USB_OTG_WRITE_REG32(reg, value)
Definition: usb_defines.h:222
uint8_t * xfer_buff
Definition: usb_core.h:147
void(* DeviceSuspended)(void)
Definition: usb_core.h:243
#define USB_REQ_RECIPIENT_DEVICE
Definition: usbd_def.h:72
void USBD_Init(USB_OTG_CORE_HANDLE *pdev, const USB_OTG_CORE_ID_TypeDef coreID, const USBD_DEVICE *pDevice, const USBD_Class_cb_TypeDef *class_cb, const USBD_Usr_cb_TypeDef *usr_cb)
USBD_Init Initailizes the device stack and load the class driver.
Definition: usbd_core.c:134
uint8_t device_old_status
Definition: usb_core.h:257
USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev)
USBD_DeInit Re-Initialize th device library.
Definition: usbd_core.c:166
void USBD_ParseSetupRequest(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
USBD_ParseSetupRequest Copy buffer into setup structure.
Definition: usbd_req.c:780
static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev)
USBD_Reset Handle Reset event.
Definition: usbd_core.c:339
__IO uint32_t DCTL
Definition: usb_regs.h:116
void(* DeviceResumed)(void)
Definition: usb_core.h:244
uint8_t bmRequest
Definition: usb_core.h:182
static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev)
USBD_Suspend Handle Suspend event.
Definition: usbd_core.c:384
static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
USBD_DataInStage Handle data in stage.
Definition: usbd_core.c:261
DCD_DEV dev
Definition: usb_core.h:301
USBD_Status USBD_CtlContinueSendData(USB_OTG_CORE_HANDLE *pdev, uint8_t *pbuf, uint16_t len)
USBD_CtlContinueSendData continue sending data on the ctl pipe.
Definition: usbd_ioreq.c:118
uint8_t(* IsoINIncomplete)(void *pdev)
Definition: usb_core.h:222
uint8_t connection_status
Definition: usb_core.h:259
uint8_t dma_enable
Definition: usb_core.h:167
const USBD_DEVICE * usr_device
Definition: usb_core.h:267
uint32_t DCD_EP_Stall(USB_OTG_CORE_HANDLE *pdev, uint8_t epnum)
Stall an endpoint.
Definition: usb_dcd.c:296
#define NULL
Definition: hal_types.h:59
header file for the usbd_ioreq.c file
uint8_t(* IsoOUTIncomplete)(void *pdev)
Definition: usb_core.h:223
uint32_t maxpacket
Definition: usb_core.h:145
USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb
Definition: usbd_core.c:99
void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev)
Definition: usb.c:383
uint32_t rem_data_len
Definition: usb_core.h:152
static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev)
USBD_SetupStage Handle the setup stage.
Definition: usbd_core.c:179
USB_OTG_EP out_ep[USB_OTG_MAX_TX_FIFOS]
Definition: usb_core.h:263
#define USB_OTG_EP0_DATA_IN
Definition: usb_core.h:54
#define USB_REQ_RECIPIENT_INTERFACE
Definition: usbd_def.h:73
USBD_Status USBD_CtlSendStatus(USB_OTG_CORE_HANDLE *pdev)
USBD_CtlSendStatus send zero lzngth packet on the ctl pipe.
Definition: usbd_ioreq.c:183
USBD_Status USBD_CtlReceiveStatus(USB_OTG_CORE_HANDLE *pdev)
USBD_CtlReceiveStatus receive zero lzngth packet on the ctl pipe.
Definition: usbd_ioreq.c:203
uint8_t(* EP0_TxSent)(void *pdev)
Definition: usb_core.h:216
uint8_t device_status
Definition: usb_core.h:256
uint32_t total_data_len
Definition: usb_core.h:153
const USBD_Class_cb_TypeDef * class_cb
Definition: usb_core.h:265
const USBD_Usr_cb_TypeDef * usr_cb
Definition: usb_core.h:266
void(* DeviceConnected)(void)
Definition: usb_core.h:246
#define USB_OTG_CONFIGURED
Definition: usb_dcd.h:58
uint8_t(* SOF)(void *pdev)
Definition: usb_core.h:221
USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx)
USBD_SetCfg Configure device and start the interface.
Definition: usbd_core.c:417
#define USB_REQ_RECIPIENT_ENDPOINT
Definition: usbd_def.h:74
USBD_Status USBD_CtlContinueRx(USB_OTG_CORE_HANDLE *pdev, uint8_t *pbuf, uint16_t len)
USBD_CtlContinueRx continue receive data on the ctl pipe.
Definition: usbd_ioreq.c:165
USBD_Status USBD_StdEPReq(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
USBD_StdEPReq Handle standard usb endpoint requests.
Definition: usbd_req.c:237
USB_OTG_CORE_REGS regs
Definition: usb_core.h:299
Header file for usbd_core.c.
USBD_Status USBD_StdDevReq(USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req)
USBD_StdDevReq Handle standard usb device requests.
Definition: usbd_req.c:149
USBD_DCD_INT_cb_TypeDef * USBD_DCD_INT_fops
Definition: usbd_core.c:116
USB_OTG_DREGS * DREGS
Definition: usb_regs.h:225
static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev)
USBD_Resume Handle Resume event.
Definition: usbd_core.c:367