GD32F10x USB-Device: E:/USB Libraries/GD32_USB_Device_Library/Core/src/usbd_core.c Source File

GD32F103 Firmware

usbd_core.c
Go to the documentation of this file.
1 
11 /* Includes ------------------------------------------------------------------*/
12 #include "usbd_core.h"
13 
14 /* Private variables ---------------------------------------------------------*/
15 extern uint8_t gAddress;
16 
39 {
40  USB_Cable_Config(ENABLE);
41  pudev->dev.device_cur_status = USB_STATUS_CONNECTED;
42 }
43 
50 {
51  USB_Cable_Config(DISABLE);
52  DR_StopDevice();
53  pudev->dev.device_cur_status = USB_STATUS_UNCONNECTED;
54 }
55 
65  USBD_Desc_cb_TypeDef *device_desc,
66  USBD_Class_cb_TypeDef *class_cb,
67  USBD_User_cb_TypeDef *user_cb)
68 {
69  USBD_DeInit(pudev);
70 
71  /* Device descriptor class and user callbacks */
72  pudev->dev.class_cb = class_cb;
73  pudev->dev.user_cb = user_cb;
74  pudev->dev.desc_cb = device_desc;
75 
76  /* Get serial string from the unique ID */
77  Get_SerialString();
78 
79  /* Disable remote wakeup feature */
80  pudev->dev.DevRemoteWakeup = 0;
81 
82  /* USB full-speed device */
83  pudev->dev.speed = USB_SPEED_FULL;
84 
85  /* Set device register */
86  DR_Init();
87 
88  /* Callback user function */
89  pudev->dev.user_cb->DeviceInit();
90 }
91 
98 {
99  return USBD_OK;
100 }
101 
108 {
109  USB_DEVICE_REQ req;
110 
111  USBD_ParseSetupRequest(pudev, &req);
112 
113  switch (req.bmRequestType & USB_REQ_MASK)
114  {
115  /* Standard device request */
116  case USB_STANDARD_REQ:
117  USBD_StdReq(pudev, &req);
118  break;
119 
120  /* Device class request */
121  case USB_CLASS_REQ:
122  USBD_DevClsReq(pudev, &req);
123  break;
124 
125  /* Vendor defined request */
126  case USB_VENDOR_REQ:
127  USBD_VdrDefReq(pudev, &req);
128  break;
129 
130  default:
131  USB_EP_Stall(pudev, 0x00);
132  break;
133  }
134  return USBD_OK;
135 }
136 
143 uint8_t USBD_DataOutStage (USB_DEVICE_HANDLE *pudev, uint8_t EpID)
144 {
145  USB_EP *ep = &pudev->dev.out_ep[EpID];
146 
147  if(EpID == 0)
148  {
149  if(pudev->dev.device_cur_state == USB_CTRL_DATA_OUT)
150  {
151  if(ep->xfer_len > ep->maxpacket)
152  {
153  /* One data packet has been received, update xfer_len */
154  ep->xfer_len -= ep->maxpacket;
155 
156  /* Continue to receive remain data */
157  USB_CtlContinueRx(pudev, ep->xfer_buf, ep->xfer_len);
158  }
159  else
160  {
161  if((pudev->dev.class_cb->EP0_RxReady != NULL)&&
162  (pudev->dev.device_cur_status == USB_STATUS_CONFIGURED))
163  {
164  /* Device class handle */
165  pudev->dev.class_cb->EP0_RxReady(pudev);
166  }
167 
168  /* Enter the control transaction status stage */
169  USB_CtlTransmitStatus(pudev);
170  }
171  }
172  else if( pudev->dev.device_cur_state == USB_CTRL_STATUS_OUT)
173  {
174  /* Clear endpoint status_out status */
175  _Clear_Status_Out(EP0);
176  }
177  }
178  else
179  {
180  if((pudev->dev.class_cb->DataOut != NULL)&&
181  (pudev->dev.device_cur_status == USB_STATUS_CONFIGURED))
182  {
183  pudev->dev.class_cb->DataOut(pudev, EpID);
184  }
185  }
186  return USBD_OK;
187 }
188 
195 uint8_t USBD_DataInStage (USB_DEVICE_HANDLE *pudev, uint8_t EpID)
196 {
197  USB_EP *ep = &pudev->dev.in_ep[EpID];
198 
199  if(EpID == 0)
200  {
201  if(pudev->dev.device_cur_state == USB_CTRL_DATA_IN)
202  {
203  if(ep->xfer_len > ep->maxpacket)
204  {
205  /* One data packet has been transmited, update xfer_len */
206  ep->xfer_len -= ep->maxpacket;
207 
208  /* Continue to receive remain data */
209  USB_CtlContinueTx(pudev, ep->xfer_buf, ep->xfer_len);
210  }
211  else
212  {
213  /* Transmit length is maxpacket multiple, so send zero length packet */
214  if(ep->xfer_len == ep->maxpacket)
215  {
216  ep->xfer_len = 0;
217  USB_CtlContinueTx(pudev, NULL, 0);
218  }
219  else
220  {
221  if((pudev->dev.class_cb->EP0_TxSent != NULL) &&
222  (pudev->dev.device_cur_status == USB_STATUS_CONFIGURED))
223  {
224  pudev->dev.class_cb->EP0_TxSent(pudev);
225  }
226  USB_CtlReceiveStatus(pudev);
227  }
228  }
229  }
230  else if((pudev->dev.device_cur_state == USB_CTRL_STATUS_IN) && (gAddress != 0))
231  {
232  USB_EP_SetAddress(pudev, gAddress);
233  gAddress = 0;
234  }
235  }
236  else
237  {
238  ep->xfer_len -= ep->xfer_count;
239 
240  if(ep->xfer_len == 0)
241  {
242  if((pudev->dev.class_cb->DataIn != NULL) &&
243  (pudev->dev.device_cur_status == USB_STATUS_CONFIGURED))
244  {
245  pudev->dev.class_cb->DataIn(pudev, EpID);
246  }
247  }
248  else
249  {
250  USB_EP_Tx(pudev, EpID, ep->xfer_buf, ep->xfer_len);
251  }
252  }
253  return USBD_OK;
254 }
255 
263 USBD_Status USBD_SetCfg (USB_DEVICE_HANDLE *pudev, uint8_t ConfigIndex)
264 {
265  /* Configure USB device class */
266  pudev->dev.class_cb->Init(pudev, ConfigIndex);
267 
268  pudev->dev.user_cb->DeviceConfigured();
269 
270  return USBD_OK;
271 }
272 
279 USBD_Status USBD_ClrCfg (USB_DEVICE_HANDLE *pudev, uint8_t ConfigIndex)
280 {
281  pudev->dev.class_cb->DeInit(pudev, ConfigIndex);
282 
283  return USBD_OK;
284 }
285 
302 /************************ (C) COPYRIGHT 2014 GIGADEVICE *****END OF FILE****/
303 
USB device class callback type define.
Definition: usb_core.h:148
void DR_StopDevice(void)
Device register configure when stop device.
Definition: usb_core.c:71
USBD_Status USBD_ClrCfg(USB_DEVICE_HANDLE *pudev, uint8_t ConfigIndex)
Clear current configuration.
Definition: usbd_core.c:279
void USB_EP_Tx(USB_CORE_HANDLE *pudev, uint8_t EpAddr, uint8_t *pbuf, uint16_t BufLen)
Endpoint prepare to transmit data.
Definition: usb_core.c:346
uint8_t USB_CtlReceiveStatus(USB_CORE_HANDLE *pudev)
Receive status stage on the control pipe.
Definition: usb_core.c:584
#define USB_STATUS_UNCONNECTED
USB device status.
Definition: usb_core.h:73
void USB_EP_SetAddress(USB_CORE_HANDLE *pudev, uint8_t Addr)
Set USB device and endpoints address.
Definition: usb_core.c:465
uint8_t USBD_SetupStage(USB_DEVICE_HANDLE *pudev)
Usb setup stage processing.
Definition: usbd_core.c:107
void USBD_Connect(USB_DEVICE_HANDLE *pudev)
Configure usb device to be connected.
Definition: usbd_core.c:38
void USBD_ParseSetupRequest(USB_DEVICE_HANDLE *pudev, USB_DEVICE_REQ *req)
Decode setup data packet.
Definition: usbd_enum.c:731
USB endpoint struct.
Definition: usb_core.h:101
USB device descriptor callback type define.
Definition: usb_core.h:133
void USBD_Init(USB_DEVICE_HANDLE *pudev, USBD_Desc_cb_TypeDef *device_desc, USBD_Class_cb_TypeDef *class_cb, USBD_User_cb_TypeDef *user_cb)
Initialize usb device stack.
Definition: usbd_core.c:64
uint8_t USBD_VdrDefReq(USB_DEVICE_HANDLE *pudev, USB_DEVICE_REQ *req)
Handle usb vendor request.
Definition: usbd_enum.c:130
uint8_t USB_CtlTransmitStatus(USB_CORE_HANDLE *pudev)
Transmit status stage on the control pipe.
Definition: usb_core.c:570
uint8_t USBD_StdReq(USB_DEVICE_HANDLE *pudev, USB_DEVICE_REQ *req)
Handle usb standard device request.
Definition: usbd_enum.c:78
uint8_t USBD_DataInStage(USB_DEVICE_HANDLE *pudev, uint8_t EpID)
Data in stage processing.
Definition: usbd_core.c:195
USBD_Status
USB device operation status.
Definition: usbd_core.h:40
uint8_t USBD_DataOutStage(USB_DEVICE_HANDLE *pudev, uint8_t EpID)
Data out stage processing.
Definition: usbd_core.c:143
uint8_t USBD_DevClsReq(USB_DEVICE_HANDLE *pudev, USB_DEVICE_REQ *req)
Handle device class request.
Definition: usbd_enum.c:92
USBD_Status USBD_SetCfg(USB_DEVICE_HANDLE *pudev, uint8_t ConfigIndex)
Device configuration and interface setting.
Definition: usbd_core.c:263
void USB_EP_Stall(USB_CORE_HANDLE *pudev, uint8_t EpID)
Set an endpoint to STALL status.
Definition: usb_core.c:405
uint8_t USB_CtlContinueTx(USB_CORE_HANDLE *pudev, uint8_t *pbuf, uint16_t Len)
Continue transmitting data on the control pipe.
Definition: usb_core.c:522
void USBD_Disconnect(USB_DEVICE_HANDLE *pudev)
Configure usb device to be unconnected.
Definition: usbd_core.c:49
USBD_Status USBD_DeInit(USB_DEVICE_HANDLE *pudev)
De-Initialize USB device stack.
Definition: usbd_core.c:97
void DR_Init(void)
Device register initialization.
Definition: usb_core.c:44
USB user callback type define.
Definition: usb_core.h:174
uint8_t USB_CtlContinueRx(USB_CORE_HANDLE *pudev, uint8_t *pbuf, uint16_t Len)
Continue receive data on the contrl pipe.
Definition: usb_core.c:556
USB device core function protoype.
USB standard device request struct.
Definition: usb_core.h:120
Generated on Fri Feb 6 2015 14:56:36 for GD32F10x USB-Device by   doxygen 1.8.8