STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
usbd_msc_bot.c
Go to the documentation of this file.
1 
28 /* Includes ------------------------------------------------------------------*/
29 #include "usbd_msc_bot.h"
30 #include "usbd_msc.h"
31 #include "usbd_msc_scsi.h"
32 #include "usbd_ioreq.h"
33 
81 static void MSC_BOT_CBW_Decode (USBD_HandleTypeDef *pdev);
82 
83 static void MSC_BOT_SendData (USBD_HandleTypeDef *pdev,
84  uint8_t* pbuf,
85  uint16_t len);
86 
87 static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev);
106 {
108 
109  hmsc->bot_state = USBD_BOT_IDLE;
111 
112  hmsc->scsi_sense_tail = 0;
113  hmsc->scsi_sense_head = 0;
114 
115  ((USBD_StorageTypeDef *)pdev->pUserData)->Init(0);
116 
119 
120  /* Prapare EP to Receive First BOT Cmd */
123  (uint8_t *)&hmsc->cbw,
125 }
126 
134 {
136 
137  hmsc->bot_state = USBD_BOT_IDLE;
139 
140  /* Prapare EP to Receive First BOT Cmd */
143  (uint8_t *)&hmsc->cbw,
145 }
146 
154 {
156  hmsc->bot_state = USBD_BOT_IDLE;
157 }
158 
167  uint8_t epnum)
168 {
170 
171  switch (hmsc->bot_state)
172  {
173  case USBD_BOT_DATA_IN:
174  if(SCSI_ProcessCmd(pdev,
175  hmsc->cbw.bLUN,
176  &hmsc->cbw.CB[0]) < 0)
177  {
179  }
180  break;
181 
182  case USBD_BOT_SEND_DATA:
185 
186  break;
187 
188  default:
189  break;
190  }
191 }
200  uint8_t epnum)
201 {
203 
204  switch (hmsc->bot_state)
205  {
206  case USBD_BOT_IDLE:
207  MSC_BOT_CBW_Decode(pdev);
208  break;
209 
210  case USBD_BOT_DATA_OUT:
211 
212  if(SCSI_ProcessCmd(pdev,
213  hmsc->cbw.bLUN,
214  &hmsc->cbw.CB[0]) < 0)
215  {
217  }
218 
219  break;
220 
221  default:
222  break;
223  }
224 }
225 
232 static void MSC_BOT_CBW_Decode (USBD_HandleTypeDef *pdev)
233 {
235 
236  hmsc->csw.dTag = hmsc->cbw.dTag;
237  hmsc->csw.dDataResidue = hmsc->cbw.dDataLength;
238 
241  (hmsc->cbw.bLUN > 1) ||
242  (hmsc->cbw.bCBLength < 1) ||
243  (hmsc->cbw.bCBLength > 16))
244  {
245 
246  SCSI_SenseCode(pdev,
247  hmsc->cbw.bLUN,
249  INVALID_CDB);
250 
252  MSC_BOT_Abort(pdev);
253 
254  }
255  else
256  {
257  if(SCSI_ProcessCmd(pdev,
258  hmsc->cbw.bLUN,
259  &hmsc->cbw.CB[0]) < 0)
260  {
261  if(hmsc->bot_state == USBD_BOT_NO_DATA)
262  {
263  MSC_BOT_SendCSW (pdev,
265  }
266  else
267  {
268  MSC_BOT_Abort(pdev);
269  }
270  }
271  /*Burst xfer handled internally*/
272  else if ((hmsc->bot_state != USBD_BOT_DATA_IN) &&
273  (hmsc->bot_state != USBD_BOT_DATA_OUT) &&
274  (hmsc->bot_state != USBD_BOT_LAST_DATA_IN))
275  {
276  if (hmsc->bot_data_length > 0)
277  {
278  MSC_BOT_SendData(pdev,
279  hmsc->bot_data,
280  hmsc->bot_data_length);
281  }
282  else if (hmsc->bot_data_length == 0)
283  {
284  MSC_BOT_SendCSW (pdev,
286  }
287  }
288  }
289 }
290 
299 static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev,
300  uint8_t* buf,
301  uint16_t len)
302 {
304 
305  len = MIN (hmsc->cbw.dDataLength, len);
306  hmsc->csw.dDataResidue -= len;
309 
310  USBD_LL_Transmit (pdev, MSC_EPIN_ADDR, buf, len);
311 }
312 
321  uint8_t CSW_Status)
322 {
324 
326  hmsc->csw.bStatus = CSW_Status;
327  hmsc->bot_state = USBD_BOT_IDLE;
328 
329  USBD_LL_Transmit (pdev,
330  MSC_EPIN_ADDR,
331  (uint8_t *)&hmsc->csw,
333 
334  /* Prepare EP to Receive next Cmd */
337  (uint8_t *)&hmsc->cbw,
339 
340 }
341 
349 static void MSC_BOT_Abort (USBD_HandleTypeDef *pdev)
350 {
352 
353  if ((hmsc->cbw.bmFlags == 0) &&
354  (hmsc->cbw.dDataLength != 0) &&
356  {
358  }
360 
361  if(hmsc->bot_status == USBD_BOT_STATUS_ERROR)
362  {
365  (uint8_t *)&hmsc->cbw,
367  }
368 }
369 
378 void MSC_BOT_CplClrFeature (USBD_HandleTypeDef *pdev, uint8_t epnum)
379 {
381 
382  if(hmsc->bot_status == USBD_BOT_STATUS_ERROR )/* Bad CBW Signature */
383  {
386  }
387  else if(((epnum & 0x80) == 0x80) && ( hmsc->bot_status != USBD_BOT_STATUS_RECOVERY))
388  {
390  }
391 
392 }
407 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
#define USBD_BOT_CBW_LENGTH
Definition: usbd_msc_bot.h:61
#define USBD_BOT_STATUS_ERROR
Definition: usbd_msc_bot.h:73
uint8_t bot_data[MSC_MEDIA_PACKET]
Definition: usbd_msc.h:93
USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
Flushes an endpoint of the Low Level Driver.
Definition: usbd_conf.c:504
#define USBD_BOT_NO_DATA
Definition: usbd_msc_bot.h:57
void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_t ASC)
SCSI_SenseCode Load the last error code in the error list.
void MSC_BOT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
MSC_BOT_DataIn Handle BOT IN data stage.
Definition: usbd_msc_bot.c:166
void MSC_BOT_Reset(USBD_HandleTypeDef *pdev)
MSC_BOT_Reset Reset the BOT Machine.
Definition: usbd_msc_bot.c:133
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
Returns the last transferred packet size.
Definition: usbd_conf.c:606
USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size)
Transmits data over an endpoint.
Definition: usbd_conf.c:574
#define USBD_BOT_STATUS_NORMAL
Definition: usbd_msc_bot.h:71
void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, uint8_t epnum)
MSC_BOT_CplClrFeature Complete the clear feature request.
Definition: usbd_msc_bot.c:378
#define ILLEGAL_REQUEST
Definition: usbd_msc_scsi.h:90
#define USBD_BOT_IDLE
Definition: usbd_msc_bot.h:52
#define USBD_BOT_SEND_DATA
Definition: usbd_msc_bot.h:56
void MSC_BOT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum)
MSC_BOT_DataOut Process MSC OUT data.
Definition: usbd_msc_bot.c:199
if(LCD_Lock==DISABLE)
Definition: lcd_log.c:249
#define USBD_BOT_CSW_SIGNATURE
Definition: usbd_msc_bot.h:60
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
#define USBD_BOT_LAST_DATA_IN
Definition: usbd_msc_bot.h:55
Header for the usbd_msc.c file.
void MSC_BOT_DeInit(USBD_HandleTypeDef *pdev)
MSC_BOT_DeInit Deinitialize the BOT Machine.
Definition: usbd_msc_bot.c:153
#define USBD_BOT_CBW_SIGNATURE
Definition: usbd_msc_bot.h:59
Definition: pbuf.h:108
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
#define USBD_BOT_CSW_LENGTH
Definition: usbd_msc_bot.h:62
#define USBD_CSW_CMD_FAILED
Definition: usbd_msc_bot.h:67
Header for the usbd_msc_scsi.c file.
int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd)
SCSI_ProcessCmd Process SCSI commands.
Header file for the usbd_ioreq.c file.
#define USBD_BOT_DATA_IN
Definition: usbd_msc_bot.h:54
#define USBD_BOT_DATA_OUT
Definition: usbd_msc_bot.h:53
USBD_MSC_BOT_CBWTypeDef cbw
Definition: usbd_msc.h:94
void MSC_BOT_Init(USBD_HandleTypeDef *pdev)
MSC_BOT_Init Initialize the BOT Process.
Definition: usbd_msc_bot.c:105
#define USBD_CSW_CMD_PASSED
Definition: usbd_msc_bot.h:66
USBD_MSC_BOT_CSWTypeDef csw
Definition: usbd_msc.h:95
Header for the usbd_msc_bot.c file.
#define MSC_EPIN_ADDR
Definition: usbd_msc.h:62
void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, uint8_t CSW_Status)
MSC_BOT_SendCSW Send the Command Status Wrapper.
Definition: usbd_msc_bot.c:320
#define INVALID_CDB
#define MIN(a, b)
Definition: usbd_def.h:265
#define MSC_EPOUT_ADDR
Definition: usbd_msc.h:63
#define USBD_BOT_STATUS_RECOVERY
Definition: usbd_msc_bot.h:72