/******************************************************************************* * Function Name : Mass_Storage_Out * Description : Mass Storage OUT transfer. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void Mass_Storage_Out (void) { u8 CMD; CMD = CBW.CB[0]; Data_Len = GetEPRxCount(ENDP2); PMAToUserBufferCopy(Bulk_Data_Buff, ENDP2_RXADDR, Data_Len); switch (Bot_State) { case BOT_IDLE: CBW_Decode(); break; case BOT_DATA_OUT: if (CMD == SCSI_WRITE10) { SCSI_Write10_Cmd(SCSI_LBA , SCSI_BlkLen); break; } Bot_Abort(DIR_OUT); Set_Scsi_Sense_Data(ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); break; default: Bot_Abort(BOTH_DIR); Set_Scsi_Sense_Data(ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); break; } }
/******************************************************************************* * Function Name : Mass_Storage_Out * Description : Mass Storage OUT transfer. * Input : None. * Output : None. * Return : None. //USB->设备 *******************************************************************************/ void Mass_Storage_Out (void) { u8 CMD; USB_STATUS_REG|=0X10;//标记轮询 CMD = CBW.CB[0]; Data_Len = GetEPRxCount(ENDP4); PMAToUserBufferCopy(Bulk_Data_Buff, ENDP4_RXADDR, Data_Len); //printf("Bot_State_out:%d;Data_Len=%d",Bot_State,Data_Len); switch (Bot_State) { case BOT_IDLE: CBW_Decode(); break; case BOT_DATA_OUT://USB发送数据到设备 if (CMD == SCSI_WRITE10) { USB_STATUS_REG|=0X01;//标记正在写数据 SCSI_Write10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen); break; } Bot_Abort(DIR_OUT); Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); break; default: Bot_Abort(BOTH_DIR); Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); break; } }
/******************************************************************************* * Function Name : Mass_Storage_Out * Description : Mass Storage OUT transfer. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void Mass_Storage_Out (void) { u8 CMD; CMD = CBW.CB[0]; Data_Len = USB_SIL_Read(EP2_OUT, Bulk_Data_Buff); switch (Bot_State) { case BOT_IDLE: CBW_Decode(); break; case BOT_DATA_OUT: if (CMD == SCSI_WRITE10) { SCSI_Write10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen); break; } Bot_Abort(DIR_OUT); Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); break; default: Bot_Abort(BOTH_DIR); Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); break; } }
/******************************************************************************* * Function Name : Mass_Storage_Out * Description : Mass Storage OUT transfer. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void Mass_Storage_Out (void) { uint8_t CMD; CMD = CBW.CB[0]; Data_Len = USB_SIL_Read(EP5_OUT, Bulk_Data_Buff); switch (Bot_State) { case BOT_IDLE: CBW_Decode(); break; case BOT_DATA_OUT: if (CMD == SCSI_WRITE10) { SCSI_Write10_Cmd(CBW.bLUN , SCSI_LBA , SCSI_BlkLen); break; } Bot_Abort(DIR_OUT); Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); break; default: Bot_Abort(BOTH_DIR); Set_Scsi_Sense_Data(CBW.bLUN, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); Set_CSW (CSW_PHASE_ERROR, SEND_CSW_DISABLE); break; } //az #ifndef STM32F10X_CL /* Enable the receive of data on EP3 */ SetEPRxValid(ENDP5); #endif /* STM32F10X_CL */ }