/** * @brief MSC_BOT_CBW_Decode * Decode the CBW command and set the BOT state machine accordingtly * @param pdev: device instance * @retval None */ static void MSC_BOT_CBW_Decode (USBD_HandleTypeDef *pdev) { USBD_MSC_BOT_HandleTypeDef *hmsc = &((usbd_cdc_msc_hid_state_t*)pdev->pClassData)->MSC_BOT_ClassData; hmsc->csw.dTag = hmsc->cbw.dTag; hmsc->csw.dDataResidue = hmsc->cbw.dDataLength; if ((USBD_LL_GetRxDataSize (pdev ,MSC_OUT_EP) != USBD_BOT_CBW_LENGTH) || (hmsc->cbw.dSignature != USBD_BOT_CBW_SIGNATURE)|| (hmsc->cbw.bLUN > 1) || (hmsc->cbw.bCBLength < 1) || (hmsc->cbw.bCBLength > 16)) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); hmsc->bot_status = USBD_BOT_STATUS_ERROR; MSC_BOT_Abort(pdev); } else { if(SCSI_ProcessCmd(pdev, hmsc->cbw.bLUN, &hmsc->cbw.CB[0]) < 0) { if(hmsc->bot_state == USBD_BOT_NO_DATA) { MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_FAILED); } else { MSC_BOT_Abort(pdev); } } /*Burst xfer handled internally*/ else if ((hmsc->bot_state != USBD_BOT_DATA_IN) && (hmsc->bot_state != USBD_BOT_DATA_OUT) && (hmsc->bot_state != USBD_BOT_LAST_DATA_IN)) { if (hmsc->bot_data_length > 0) { MSC_BOT_SendData(pdev, hmsc->bot_data, hmsc->bot_data_length); } else if (hmsc->bot_data_length == 0) { MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_PASSED); } } } }
/** * @brief MSC_BOT_CBW_Decode * Decode the CBW command and set the BOT state machine accordingtly * @param pdev: device instance * @retval None */ static void MSC_BOT_CBW_Decode (USB_OTG_CORE_HANDLE *pdev) { MSC_BOT_csw.dTag = MSC_BOT_cbw.dTag; MSC_BOT_csw.dDataResidue = MSC_BOT_cbw.dDataLength; if ((USBD_GetRxCount (pdev ,MSC_OUT_EP) != BOT_CBW_LENGTH) || (MSC_BOT_cbw.dSignature != BOT_CBW_SIGNATURE)|| (MSC_BOT_cbw.bLUN > 1) || (MSC_BOT_cbw.bCBLength < 1) || (MSC_BOT_cbw.bCBLength > 16)) { SCSI_SenseCode(MSC_BOT_cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); MSC_BOT_Status = BOT_STATE_ERROR; MSC_BOT_Abort(pdev); } else { if(SCSI_ProcessCmd(pdev, MSC_BOT_cbw.bLUN, &MSC_BOT_cbw.CB[0]) < 0) { MSC_BOT_Abort(pdev); } /*Burst xfer handled internally*/ else if ((MSC_BOT_State != BOT_DATA_IN) && (MSC_BOT_State != BOT_DATA_OUT) && (MSC_BOT_State != BOT_LAST_DATA_IN)) { if (MSC_BOT_DataLen > 0) { MSC_BOT_SendData(pdev, MSC_BOT_Data, MSC_BOT_DataLen); } else if (MSC_BOT_DataLen == 0) { MSC_BOT_SendCSW (pdev, CSW_CMD_PASSED); } } } }