GD32F10x USB-Device: E:/USB Libraries/GD32_USB_Device_Library/Class/msc/src/usbd_msc_core.c Source File

GD32F103 Firmware

usbd_msc_core.c
Go to the documentation of this file.
1 
11 /* Includes ------------------------------------------------------------------*/
12 #include "usbd_msc_core.h"
13 
33 static uint8_t USBD_MSC_Init (void *pudev, uint8_t cfgidx);
34 static uint8_t USBD_MSC_DeInit (void *pudev, uint8_t cfgidx);
35 static uint8_t USBD_MSC_GetClassDescriptor (void *pudev, USB_DEVICE_REQ *req);
36 static uint8_t USBD_MSC_ClassReqHandle (void *pudev, USB_DEVICE_REQ *req);
37 static uint8_t USBD_MSC_GetInterface (void *pudev, USB_DEVICE_REQ *req);
38 static uint8_t USBD_MSC_SetInterface (void *pudev, USB_DEVICE_REQ *req);
39 static uint8_t USBD_MSC_DataIn (void *pudev, uint8_t EpID);
40 static uint8_t USBD_MSC_DataOut (void *pudev, uint8_t EpID);
41 static uint8_t *USBD_MSC_GetCfgDesc (uint8_t USBSpeed, uint16_t *len);
42 static uint8_t USBD_MSC_ClearFeature (void *pudev, USB_DEVICE_REQ *req);
43 
44 USBD_Class_cb_TypeDef USBD_MSC_cb =
45 {
46  USBD_MSC_Init,
47  USBD_MSC_DeInit,
48  USBD_MSC_GetClassDescriptor,
49  USBD_MSC_ClassReqHandle,
50  USBD_MSC_GetInterface,
51  USBD_MSC_SetInterface,
52  NULL, /* EP0_TxSent */
53  NULL, /* EP0_RxReady */
54  USBD_MSC_DataIn,
55  USBD_MSC_DataOut,
56  NULL, /* SOF */
57  USBD_MSC_GetCfgDesc,
58  USBD_MSC_ClearFeature
59 };
60 
61 /* USB Mass storage device configuration descriptor set */
62 const uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZE] =
63 {
64  0x09, /* bLength: configuration descriptor size */
65  USB_DESCTYPE_CONFIGURATION, /* bDescriptorType: configuration descriptor type */
66  USB_MSC_CONFIG_DESC_SIZE, /* wTotalLength: configuration descriptor set total length */
67  0x00,
68  0x01, /* bNumInterfaces: 1 interface */
69  0x01, /* bConfigurationValue: configuration value */
70  0x04, /* iConfiguration: index of string descriptor describing the configuration */
71  0xC0, /* bmAttributes: device attributes (bus powered and not support remote wakeup) */
72  0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */
73 
74  /******************** interface descriptor ********************/
75  0x09, /* bLength: interface descriptor size */
76  USB_DESCTYPE_INTERFACE, /* bDescriptorType: interface descriptor type*/
77  0x00, /* bInterfaceNumber: number of interface */
78  0x00, /* bAlternateSetting: alternate setting */
79  0x02, /* bNumEndpoints: use 2 endpoints for Tx and Rx */
80  0x08, /* bInterfaceClass: MSC Class */
81  0x06, /* bInterfaceSubClass: SCSI transparent*/
82  0x50, /* nInterfaceProtocol: Bulk-only transport */
83  0x05, /* iInterface: index of interface string descriptor */
84 
85  /******************** Mass storage endpoint descriptor ********************/
86  0x07, /* bLength: Endpoint Descriptor size */
87  USB_DESCTYPE_ENDPOINT, /* bDescriptorType: endpoint descriptor type */
88  MSC_IN_EP, /* bEndpointAddress: endpoint address (EP1_IN) */
89  0x02, /* bmAttributes: endpoint attribute(bulk endpoint) */
90  LOWBYTE(MSC_DATA_PACKET_SIZE), /* wMaxPacketSize: 64 bytes max */
91  HIGHBYTE(MSC_DATA_PACKET_SIZE),
92  0x00, /* bInterval: polling interval is ignored */
93 
94  0x07, /* bLength: Endpoint Descriptor size */
95  USB_DESCTYPE_ENDPOINT, /* bDescriptorType: endpoint descriptor type */
96  MSC_OUT_EP, /*bEndpointAddress: endpoint address (EP2_OUT) */
97  0x02, /* bmAttributes: endpoint attribute(bulk endpoint) */
98  LOWBYTE(MSC_DATA_PACKET_SIZE), /* wMaxPacketSize: 64 bytes max */
99  HIGHBYTE(MSC_DATA_PACKET_SIZE),
100  0x00 /* bInterval: polling interval is ignored */
101 };
102 
103 static uint8_t USBD_MSC_MaxLun = 0;
104 static uint8_t USBD_MSC_AltSet = 0;
105 
120 static uint8_t USBD_MSC_Init (void *pudev, uint8_t cfgidx)
121 {
122  USB_EP_BufConfig(pudev, MSC_IN_EP, USB_SNG_BUFTYPE, MSC_TX_ADDRESS);
123  USB_EP_BufConfig(pudev, MSC_OUT_EP, USB_SNG_BUFTYPE, MSC_RX_ADDRESS);
124 
125  /* Open EP IN */
126  USB_EP_Init(pudev,
127  MSC_IN_EP,
128  USB_EPTYPE_BULK,
129  MSC_EPIN_SIZE);
130 
131  /* Open EP OUT */
132  USB_EP_Init(pudev,
133  MSC_OUT_EP,
134  USB_EPTYPE_BULK,
135  MSC_EPOUT_SIZE);
136 
137  /* Init the BBB layer */
138  MSC_BBB_Init(pudev);
139 
140  return USBD_OK;
141 }
142 
149 static uint8_t USBD_MSC_DeInit (void *pudev, uint8_t cfgidx)
150 {
151  /* Close MSC EPs */
152  USB_EP_DeInit(pudev, MSC_IN_EP);
153  USB_EP_DeInit(pudev, MSC_OUT_EP);
154 
155  /* Un Init the BBB layer */
156  MSC_BBB_DeInit(pudev);
157 
158  return USBD_OK;
159 }
160 
167 static uint8_t USBD_MSC_ClassReqHandle (void *pudev, USB_DEVICE_REQ *req)
168 {
169  switch (req->bRequest)
170  {
171  case BBB_GET_MAX_LUN :
172  if((req->wValue == 0) &&
173  (req->wLength == 1) &&
174  ((req->bmRequestType & 0x80) == 0x80))
175  {
176  USBD_MSC_MaxLun = USBD_STORAGE_fops->GetMaxLun();
177  if(USBD_MSC_MaxLun > 0)
178  {
179  USB_CtlTx(pudev, &USBD_MSC_MaxLun, 1);
180  }
181  else
182  {
183  USBD_EnumError(pudev, req);
184  return USBD_FAIL;
185  }
186  }
187  else
188  {
189  USBD_EnumError(pudev, req);
190  return USBD_FAIL;
191  }
192  break;
193 
194  case BBB_RESET :
195  if((req->wValue == 0) &&
196  (req->wLength == 0) &&
197  ((req->bmRequestType & 0x80) != 0x80))
198  {
199  MSC_BBB_Reset(pudev);
200  }
201  else
202  {
203  USBD_EnumError(pudev, req);
204  return USBD_FAIL;
205  }
206  break;
207 
208  default:
209  USBD_EnumError(pudev, req);
210  return USBD_FAIL;
211  }
212 
213  return USBD_OK;
214 }
215 
222 static uint8_t USBD_MSC_GetClassDescriptor (void *pudev, USB_DEVICE_REQ *req)
223 {
224  return USBD_OK;
225 }
226 
233 static uint8_t USBD_MSC_GetInterface (void *pudev, USB_DEVICE_REQ *req)
234 {
235  USB_CtlTx (pudev, (uint8_t *)&USBD_MSC_AltSet, 1);
236 
237  return USBD_OK;
238 }
239 
246 static uint8_t USBD_MSC_SetInterface (void *pudev, USB_DEVICE_REQ *req)
247 {
248  USBD_MSC_AltSet = (uint8_t)(req->wValue);
249 
250  return USBD_OK;
251 }
252 
259 static uint8_t USBD_MSC_ClearFeature (void *pudev, USB_DEVICE_REQ *req)
260 {
261  MSC_BBB_CplClrFeature(pudev, (uint8_t)req->wIndex);
262 
263  return USBD_OK;
264 }
265 
272 static uint8_t USBD_MSC_DataIn (void *pudev, uint8_t EpID)
273 {
274  MSC_BBB_DataIn(pudev, EpID);
275 
276  return USBD_OK;
277 }
278 
285 static uint8_t USBD_MSC_DataOut (void *pudev, uint8_t EpID)
286 {
287  MSC_BBB_DataOut(pudev, EpID);
288 
289  return USBD_OK;
290 }
291 
298 static uint8_t *USBD_MSC_GetCfgDesc (uint8_t speed, uint16_t *len)
299 {
300  *len = sizeof (USBD_MSC_CfgDesc);
301 
302  return (uint8_t *)USBD_MSC_CfgDesc;
303 }
304 
325 /************************ (C) COPYRIGHT 2014 GIGADEVICE *****END OF FILE****/
USB device class callback type define.
Definition: usb_core.h:148
void MSC_BBB_DeInit(USB_DEVICE_HANDLE *pudev)
De-Initialize the BBB Machine.
Definition: usbd_msc_bot.c:101
Header file for the usbd_msc_core.c file.
void MSC_BBB_Init(USB_DEVICE_HANDLE *pudev)
Initialize the BBB process.
Definition: usbd_msc_bot.c:66
void MSC_BBB_CplClrFeature(USB_DEVICE_HANDLE *pudev, uint8_t EpID)
Complete the clear feature request.
Definition: usbd_msc_bot.c:291
void USB_EP_DeInit(USB_CORE_HANDLE *pudev, uint8_t EpAddr)
Configure the endpoint when it is disabled.
Definition: usb_core.c:251
void USB_EP_Init(USB_CORE_HANDLE *pudev, uint8_t EpAddr, uint8_t EpType, uint16_t EpMps)
Endpoint initialization.
Definition: usb_core.c:152
void MSC_BBB_Reset(USB_DEVICE_HANDLE *pudev)
Reset the BBB machine.
Definition: usbd_msc_bot.c:85
void MSC_BBB_DataOut(USB_DEVICE_HANDLE *pudev, uint8_t EpID)
Handle BBB OUT data stage.
Definition: usbd_msc_bot.c:142
uint8_t USB_CtlTx(USB_CORE_HANDLE *pudev, uint8_t *pbuf, uint16_t Len)
Transmit data on the control pipe.
Definition: usb_core.c:504
void MSC_BBB_DataIn(USB_DEVICE_HANDLE *pudev, uint8_t EpID)
Handle BBB IN data stage.
Definition: usbd_msc_bot.c:112
#define USB_SNG_BUFTYPE
USB endpoint kind.
Definition: usb_core.h:52
void USB_EP_BufConfig(USB_CORE_HANDLE *pudev, uint8_t EpAddr, uint8_t EpKind, uint32_t BufAddr)
Configure buffer for endpoint.
Definition: usb_core.c:98
void USBD_EnumError(USB_DEVICE_HANDLE *pudev, USB_DEVICE_REQ *req)
Handle usb enumeration error event.
Definition: usbd_enum.c:749
USB standard device request struct.
Definition: usb_core.h:120
Generated on Fri Feb 6 2015 14:56:35 for GD32F10x USB-Device by   doxygen 1.8.8