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

GD32F103 Firmware

usbd_msc_bot.c
Go to the documentation of this file.
1 
12 /* Includes ------------------------------------------------------------------*/
13 #include "usbd_msc_bot.h"
14 
34 uint16_t MSC_BBB_DataLen;
35 uint8_t MSC_BBB_State;
36 uint8_t MSC_BBB_Status;
37 uint8_t MSC_BBB_Data[MSC_MEDIA_PACKET_SIZE];
38 
39 MSC_BBB_CBW_TypeDef MSC_BBB_cbw;
40 MSC_BBB_CSW_TypeDef MSC_BBB_csw;
41 
49 static void MSC_BBB_CBW_Decode (USB_DEVICE_HANDLE *pudev);
50 
51 static void MSC_BBB_SendData (USB_DEVICE_HANDLE *pudev,
52  uint8_t *pbuf,
53  uint16_t Len);
54 
55 static void MSC_BBB_Abort (USB_DEVICE_HANDLE *pudev);
56 
67 {
68  MSC_BBB_State = BBB_IDLE;
69  MSC_BBB_Status = BBB_STATUS_NORMAL;
70 
71  USBD_STORAGE_fops->Init(0);
72 
73  /* Prepare endpoint to receive first BBB CBW */
74  USB_EP_Rx (pudev,
75  MSC_OUT_EP,
76  (uint8_t *)&MSC_BBB_cbw,
77  BBB_CBW_LENGTH);
78 }
79 
86 {
87  MSC_BBB_State = BBB_IDLE;
88  MSC_BBB_Status = BBB_STATUS_RECOVERY;
89 
90  USB_EP_Rx (pudev,
91  MSC_OUT_EP,
92  (uint8_t *)&MSC_BBB_cbw,
93  BBB_CBW_LENGTH);
94 }
95 
102 {
103  MSC_BBB_State = BBB_IDLE;
104 }
105 
112 void MSC_BBB_DataIn (USB_DEVICE_HANDLE *pudev, uint8_t EpID)
113 {
114  switch (MSC_BBB_State)
115  {
116  case BBB_DATA_IN:
117  if(SCSI_ProcessCmd(pudev,
118  MSC_BBB_cbw.bCBWLUN,
119  &MSC_BBB_cbw.CBWCB[0]) < 0)
120  {
121  MSC_BBB_SendCSW(pudev, CSW_CMD_FAILED);
122  }
123 // SCSI_ProcessRead(MSC_BBB_cbw.bCBWLUN);
124  break;
125 
126  case BBB_SEND_DATA:
127  case BBB_LAST_DATA_IN:
128  MSC_BBB_SendCSW (pudev, CSW_CMD_PASSED);
129  break;
130 
131  default:
132  break;
133  }
134 }
135 
142 void MSC_BBB_DataOut (USB_DEVICE_HANDLE *pudev, uint8_t EpID)
143 {
144  switch (MSC_BBB_State)
145  {
146  case BBB_IDLE:
147  MSC_BBB_CBW_Decode(pudev);
148  break;
149 
150  case BBB_DATA_OUT:
151  if(SCSI_ProcessCmd(pudev,
152  MSC_BBB_cbw.bCBWLUN,
153  &MSC_BBB_cbw.CBWCB[0]) < 0)
154  {
155  MSC_BBB_SendCSW(pudev, CSW_CMD_FAILED);
156  }
157 // SCSI_ProcessWrite(MSC_BBB_cbw.bCBWLUN);
158  break;
159 
160  default:
161  break;
162  }
163 }
164 
170 static void MSC_BBB_CBW_Decode (USB_DEVICE_HANDLE *pudev)
171 {
172  uint16_t RxLen = pudev->dev.out_ep[MSC_OUT_EP].xfer_count;
173 
174  MSC_BBB_csw.dCSWTag = MSC_BBB_cbw.dCBWTag;
175  MSC_BBB_csw.dCSWDataResidue = MSC_BBB_cbw.dCBWDataTransferLength;
176 
177  if ((RxLen != BBB_CBW_LENGTH) ||
178  (MSC_BBB_cbw.dCBWSignature != BBB_CBW_SIGNATURE) ||
179  (MSC_BBB_cbw.bCBWLUN > 1) ||
180  (MSC_BBB_cbw.bCBWCBLength < 1) ||
181  (MSC_BBB_cbw.bCBWCBLength > 16))
182  {
183  SCSI_SenseCode(MSC_BBB_cbw.bCBWLUN,
184  ILLEGAL_REQUEST,
185  INVALID_CDB);
186 
187  MSC_BBB_Status = BBB_STATUS_ERROR;
188  MSC_BBB_Abort(pudev);
189  }
190  else
191  {
192  if(SCSI_ProcessCmd(pudev,
193  MSC_BBB_cbw.bCBWLUN,
194  &MSC_BBB_cbw.CBWCB[0]) < 0)
195  {
196  MSC_BBB_Abort(pudev);
197  }
198  else if ((MSC_BBB_State != BBB_DATA_IN) &&
199  (MSC_BBB_State != BBB_DATA_OUT) &&
200  (MSC_BBB_State != BBB_LAST_DATA_IN))
201  {
202  if(MSC_BBB_DataLen > 0)
203  {
204  MSC_BBB_SendData(pudev,
205  MSC_BBB_Data,
206  MSC_BBB_DataLen);
207  }
208  else if (MSC_BBB_DataLen == 0)
209  {
210  MSC_BBB_SendCSW (pudev, CSW_CMD_PASSED);
211  }
212  }
213  }
214 }
215 
223 static void MSC_BBB_SendData (USB_DEVICE_HANDLE *pudev,
224  uint8_t* buf,
225  uint16_t Len)
226 {
227  Len = MIN(MSC_BBB_cbw.dCBWDataTransferLength, Len);
228 
229  MSC_BBB_csw.dCSWDataResidue -= Len;
230  MSC_BBB_csw.bCSWStatus = CSW_CMD_PASSED;
231  MSC_BBB_State = BBB_SEND_DATA;
232 
233  USB_EP_Tx(pudev, MSC_IN_EP, buf, Len);
234 }
235 
242 void MSC_BBB_SendCSW (USB_DEVICE_HANDLE *pudev, uint8_t CSW_Status)
243 {
244  MSC_BBB_csw.dCSWSignature = BBB_CSW_SIGNATURE;
245  MSC_BBB_csw.bCSWStatus = CSW_Status;
246  MSC_BBB_State = BBB_IDLE;
247 
248  USB_EP_Tx(pudev,
249  MSC_IN_EP,
250  (uint8_t *)&MSC_BBB_csw,
251  BBB_CSW_LENGTH);
252 
253  USB_EP_Rx(pudev,
254  MSC_OUT_EP,
255  (uint8_t *)&MSC_BBB_cbw,
256  BBB_CBW_LENGTH);
257 }
258 
264 static void MSC_BBB_Abort (USB_DEVICE_HANDLE *pudev)
265 {
266  if ((MSC_BBB_cbw.bmCBWFlags == 0) &&
267  (MSC_BBB_cbw.dCBWDataTransferLength != 0) &&
268  (MSC_BBB_Status == BBB_STATUS_NORMAL))
269  {
270  USB_EP_Stall(pudev, MSC_OUT_EP);
271  }
272 
273  USB_EP_Stall(pudev, MSC_IN_EP);
274 
275  if(MSC_BBB_Status == BBB_STATUS_ERROR)
276  {
277  USB_EP_Rx (pudev,
278  MSC_OUT_EP,
279  (uint8_t *)&MSC_BBB_cbw,
280  BBB_CBW_LENGTH);
281  }
282 }
283 
291 void MSC_BBB_CplClrFeature (USB_DEVICE_HANDLE *pudev, uint8_t EpID)
292 {
293  if(MSC_BBB_Status == BBB_STATUS_ERROR)/* Bad CBW Signature */
294  {
295  USB_EP_Stall(pudev, MSC_IN_EP);
296  MSC_BBB_Status = BBB_STATUS_NORMAL;
297  }
298  else if(((EpID & 0x80) == 0x80) && (MSC_BBB_Status != BBB_STATUS_RECOVERY))
299  {
300  MSC_BBB_SendCSW (pudev, CSW_CMD_FAILED);
301  }
302 }
303 
328 /************************ (C) COPYRIGHT 2014 GIGADEVICE *****END OF FILE****/
void SCSI_SenseCode(uint8_t Lun, uint8_t SKey, uint8_t ASC)
Load the last error code in the error list.
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
void MSC_BBB_DataIn(USB_DEVICE_HANDLE *pudev, uint8_t EpID)
Handle BBB IN data stage.
Definition: usbd_msc_bot.c:112
void MSC_BBB_Reset(USB_DEVICE_HANDLE *pudev)
Reset the BBB machine.
Definition: usbd_msc_bot.c:85
void MSC_BBB_CplClrFeature(USB_DEVICE_HANDLE *pudev, uint8_t EpID)
Complete the clear feature request.
Definition: usbd_msc_bot.c:291
void MSC_BBB_SendCSW(USB_DEVICE_HANDLE *pudev, uint8_t CSW_Status)
Send the CSW(command status wrapper)
Definition: usbd_msc_bot.c:242
void MSC_BBB_DataOut(USB_DEVICE_HANDLE *pudev, uint8_t EpID)
Handle BBB OUT data stage.
Definition: usbd_msc_bot.c:142
int8_t SCSI_ProcessCmd(USB_DEVICE_HANDLE *pudev, uint8_t Lun, uint8_t *cmd)
Process SCSI commands.
Definition: usbd_msc_scsi.c:87
void MSC_BBB_DeInit(USB_DEVICE_HANDLE *pudev)
De-Initialize the BBB Machine.
Definition: usbd_msc_bot.c:101
void USB_EP_Stall(USB_CORE_HANDLE *pudev, uint8_t EpID)
Set an endpoint to STALL status.
Definition: usb_core.c:405
Header file for the usbd_msc_bot.c file.
void USB_EP_Rx(USB_CORE_HANDLE *pudev, uint8_t EpAddr, uint8_t *pbuf, uint16_t BufLen)
Endpoint prepare to receive data.
Definition: usb_core.c:309
void MSC_BBB_Init(USB_DEVICE_HANDLE *pudev)
Initialize the BBB process.
Definition: usbd_msc_bot.c:66
Generated on Fri Feb 6 2015 14:56:35 for GD32F10x USB-Device by   doxygen 1.8.8