📄 rbc.c
字号:
spcReaLong.FormattableLength_1 = 0x02;
spcReaLong.FormattableLength_0 = 0x00;
BOTXfer_pData = (PINT8)&(spcReaLong);
TPBulksup_ErrorHandler(CASE1,BOTXfer_wResidue);
//RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_INVALID_CDB,0);
BOTFSMstate = USBFSM4BOT_DATAIN;
return 1;
#undef spcReaLong
}
uint8 RBC_Read(void)
{
#define cdbRead RBC_CDB.RbcCdb_Read
Hal4ATA_SectCntInBlk = ATADevExt_IDData.MaximumBlockTransfer << BITNUM4EP2PKT_PER_SECTOR;
// Setting ATA Hardware
ATABF_IDEXfer_dir = 1;
Hal4ATA_ReadWriteSetting();
// config TPBulkXfer Paras
Xfer_Space &= BOTXFERSPACE_MASK;//0x0F
BOTXfer_atATA = 1;
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
//RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
BOTFSMstate = USBFSM4BOT_DATAIN;
return (TRUE);
#undef cdbRead
}
uint8 RBC_Write(void)
{
#define cdbWrite RBC_CDB.RbcCdb_Write
Hal4ATA_SectCntInBlk = ATADevExt_IDData.MaximumBlockTransfer << BITNUM4EP2PKT_PER_SECTOR;
// Setting ATA Hardware
ATABF_IDEXfer_dir = 0;
Hal4ATA_ReadWriteSetting();
// Config TPBulkXfer Paras
Xfer_Space &= BOTXFERSPACE_MASK;//0x0F
BOTXfer_atATA = 1;
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
//RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
BOTFSMstate = USBFSM4BOT_DATAOUT;
return (TRUE);
#undef cdbWrite
}
uint8 RBC_ReadCapacity(void)
{
#define cdbReadCap RBC_CDB.RbcCdb_ReadCapacity
// Calculate last sector.
cdbReadCap.tmpVar.l[1] = ((INT32)ATADevExt_IDData.CurrentSectorCapacity.u0) - 1;
/* store it in big endian */
cdbReadCap.tmpVar.CapData.LBA_3 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c3;
cdbReadCap.tmpVar.CapData.LBA_2 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c2;
cdbReadCap.tmpVar.CapData.LBA_1 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c1;
cdbReadCap.tmpVar.CapData.LBA_0 = ( INT8 ) cdbReadCap.tmpVar.l0[1].chars0.c0;
// Bytes Per Block is 512Bytes
// 00020000 is 0x200 in big endian
cdbReadCap.tmpVar.CapData.BlockLen_3 = 0;
cdbReadCap.tmpVar.CapData.BlockLen_2 = 0;
cdbReadCap.tmpVar.CapData.BlockLen_1 = 0x02;
cdbReadCap.tmpVar.CapData.BlockLen_0 = 0;
// Adjust TPBulkXfer Paras
Xfer_Space &= BOTXFERSPACE_MASK;//0x0F
BOTXfer_atRAM = 1;
BOTXfer_wResidue = sizeof(READ_CAPACITY_DATA);//8
BOTXfer_pData = (PINT8)&(cdbReadCap.tmpVar);
TPBulksup_ErrorHandler(CASE6, BOTXfer_wResidue);
//RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
BOTFSMstate = USBFSM4BOT_DATAIN;
return(TRUE);
#undef cdbReadCap
}
uint8 RBC_OnOffUnit(void)
{
#define cdbOnOffUnit RBC_CDB.RbcCdb_OnOffUnit
//BOTXfer_wResidue = 0;
switch(cdbOnOffUnit.Flags.bits1.PowerConditions)
{
case PWR_NOCHANGE:
switch(cdbOnOffUnit.Flags.bits1.MediumState)
{
case MEDIUM_LOAD:
break;
case MEDIUM_UNLOAD:
break;
case MEDIUM_STOP:
break;
case MEDIUM_READY:
break;
}
break;
case PWR_ACTIVE:
break;
case PWR_IDLE:
break;
case PWR_STANDBY:
break;
case PWR_SLEEP:
break;
case PWR_DEVCTRL:
default:
break;
}
RBC_PropertyData.bits.MediumState = cdbOnOffUnit.Flags.bits1.MediumState;
RBC_PropertyData.bits.PowerState = cdbOnOffUnit.Flags.bits1.PowerConditions;
TPBulksup_ErrorHandler(CASE1,0);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef cdbOnOffUnit
}
uint8 RBC_SyncCache(void)
{
#define cdbSyncRBC RBC_CDB.RbcCdb_SyncCache
//BOTXfer_wResidue = 0;
TPBulksup_ErrorHandler(CASE1,0);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef cdbSyncRBC
}
uint8 RBC_Verify(void)
{
#define cdbVerifyRBC RBC_CDB.RbcCdb_Verify
if( CBW_wXferLen == 0 )
{
//BOTXfer_wResidue = 0;
TPBulksup_ErrorHandler(CASE1,0);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
}
else
{
/*
// Config TPBulkXfer Paras
*/
Xfer_Space &= BOTXFERSPACE_MASK;//0x0F
BOTXfer_atROM = 1;
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
BOTFSMstate = USBFSM4BOT_DATAOUT;
}
return TRUE;
#undef cdbVerifyRBC
}
////////////////////////////////////////////////////////////////////////////////////
// SCSI Primary Command Support
////////////////////////////////////////////////////////////////////////////////////
uint8 SPC_Inquiry(void)//0x12
{
#define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
uint8 retStatus = FALSE;
if(cdbInquirySPC.EnableVPD)
{
switch(cdbInquirySPC.PageCode)
{
case VPDPAGE_SERIAL_NUMBER:
BOTXfer_pData =(PINT8) &SerialPage;
BOTXfer_wResidue = sizeof(VPD_SERIAL_PAGE);//28
break;
case VPDPAGE_DEVICE_IDENTITY:
retStatus = TRUE;
BOTXfer_pData = (PINT8)&DeviceIDPage;
BOTXfer_wResidue = sizeof(VPD_DEVICE_ID_PAGE);//40
break;
default:
//retStatus = FALSE;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_ILLEGAL_COMMAND,0x00);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return retStatus;
}
}
else if(cdbInquirySPC.CmdSupportData)
{
//retStatus = FALSE;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_ILLEGAL_COMMAND,0x00);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return retStatus;
}
else
{
BOTXfer_pData =(PINT8) &inquiryData;
BOTXfer_wResidue = sizeof(STD_INQUIRYDATA);//96
}
retStatus = TRUE;
Xfer_Space &= BOTXFERSPACE_MASK;////0x0F
BOTXfer_atROM = 1;
if( BOTXfer_wResidue > CBW_wXferLen )
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
else if ( BOTXfer_wResidue == CBW_wXferLen )
{
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
else
{
TPBulksup_ErrorHandler(CASE5,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
BOTFSMstate = USBFSM4BOT_DATAIN;// Goto USBFSM4BOT_DATAIN
return retStatus;
#undef cdbInquirySPC
}
uint8 SPC_ModeSelect(void)
{
#define cdbModeSelectSPC RBC_CDB.SpcCdb_ModeSelect
uint8 retStatus = FALSE;
//
//Just Retrieve and discard data from USB FIFO
Xfer_Space &= BOTXFERSPACE_MASK;//0x0F
BOTXfer_atROM = 1;
BOTXfer_pData = (PINT8)0;
BOTXfer_wResidue = cdbModeSelectSPC.ParameterLen;
if(cdbModeSelectSPC.SavePage != 1)
{
if(CBW_wXferLen < BOTXfer_wResidue)
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE13,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_INVALID_PARAMETER,0);
//retStatus = FALSE;
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return retStatus;
}
else if(CBW_wXferLen == BOTXfer_wResidue)
{
TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
retStatus = TRUE;
}
else
{
TPBulksup_ErrorHandler(CASE11,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
retStatus = TRUE;
}
BOTFSMstate = USBFSM4BOT_DATAOUT;
}
else
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_INVALID_CDB,0);
//retStatus = FALSE;
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
}
return retStatus;
#undef cdbModeSelectSPC
}
uint8 SPC_ModeSense(void)
{
#define cdbModeSenseSPC RBC_CDB.SpcCdb_ModeSense
uint8 retStatus = FALSE;
if(cdbModeSenseSPC.PageCode == MODE_PAGE_RBC_DEVICE_PARAMETERS )
{
switch(cdbModeSenseSPC.PageControl)
{
case PAGECTRL_CHANGEABLE:
BOTXfer_pData =(PINT8) &ParaHeadMask;
BOTXfer_wResidue = sizeof(PARAMETER_LIST_LENGTH);//8
break;
case PAGECTRL_DEFAULT:
case PAGECTRL_CURRENT:
BOTXfer_pData =(PINT8) &DefaultParaHead;
BOTXfer_wResidue = sizeof(PARAMETER_LIST_LENGTH);//8
break;
case PAGECTRL_SAVED:
default:
//retStatus = FALSE;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_SAVE_ERROR,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
break;
}
if(CBW_wXferLen < BOTXfer_wResidue)
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
else if(CBW_wXferLen == BOTXfer_wResidue)
{
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
else
{
TPBulksup_ErrorHandler(CASE5,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
retStatus = TRUE;
BOTFSMstate = USBFSM4BOT_DATAIN;// Goto USBFSM4BOT_DATAIN
}
else
{
//retStatus = FALSE;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_INVALID_CDB,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
}
return retStatus;
#undef cdbModeSenseSPC
}
uint8 SPC_LockMedia(void)
{
#define cdbLockSPC RBC_CDB.SpcCdb_Remove
RBC_PropertyData.bits.MediumRemovFlag = cdbLockSPC.Prevent;
//if (RBC_PropertyData.bits.MediumRemovFlag == 01)
// IDE_CS = 0;
//else
//IDE_CS = 1;
TPBulksup_ErrorHandler(CASE1,0);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef cdbLockSPC
}
uint8 SPC_TestUnit(void)
{
#define cdbTestUnit RBC_CDB.SpcCdb_TestUnit
if( ATABF_IsAttached )
{
TPBulksup_ErrorHandler(CASE1,0);
// RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
else
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
// RBC_BuildSenseData(SCSI_SENSE_NOT_READY,SCSI_ADSENSE_NO_MEDIA_IN_DEVICE,0);
}
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef cdbTestUnit
}
uint8 SPC_RequestSense(void)
{
#define cdbRequestSenseSPC RBC_CDB.SpcCdb_RequestSense
/*
// Adjust TPBulkXfer Paras
*/
Xfer_Space &= BOTXFERSPACE_MASK;//0x0F
// BOTXfer_atRAM = 1;
BOTXfer_atROM = 1;
BOTXfer_pData =(PINT8)&Req_SenseData ;
//BOTXfer_wResidue = sizeof(Req_SenseData);//18
BOTXfer_wResidue = 0x12;
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
BOTFSMstate = USBFSM4BOT_DATAIN;
return TRUE;
#undef cdbRequestSenseSPC
}
//Optional
uint8 RBC_Format(void)
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
// RBC_BuildSenseData(SCSI_SENSE_MEDIUM_ERROR,SCSI_ADSENSE_FORMAT_ERROR,0x01);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
}
uint8 SPC_Reserve6(void)
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_ILLEGAL_COMMAND,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
}
uint8 SPC_Release6(void)
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_ILLEGAL_COMMAND,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
}
uint8 SPC_PersisReserveIn(void)
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_ILLEGAL_COMMAND,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
}
uint8 SPC_PersisReserveOut(void)
{
//Just Retrieve and discard data from USB FIFO
Xfer_Space &= BOTXFERSPACE_MASK;//0x0F
BOTXfer_atROM = 1;
BOTXfer_pData = (PINT8)0;
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_ILLEGAL_COMMAND,0);
BOTFSMstate = USBFSM4BOT_DATAOUT;
return TRUE;
}
uint8 SPC_WriteBuff(void)
{
#define cdbWriteBuff RBC_CDB.SpcCdb_WriteBuffer
//Just Retrieve and discard data from USB FIFO
Xfer_Space &= BOTXFERSPACE_MASK;//0x0F
BOTXfer_atROM = 1;
BOTXfer_pData = (PINT8)0;
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
// RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_CMDSEQ_ERROR,0);
BOTFSMstate = USBFSM4BOT_DATAOUT;
return TRUE;
#undef cdbWriteBuff
}
//void RBC_BuildSenseData(INT8 SenseKey, INT8 ASC, INT8 ASCQ)
//{
/*
RBC_SenseData.ResponseCode = SCSI_RESPONSECODE_CURRENT_ERROR;
RBC_SenseData.Valid = 0;
//RBC_SenseData.SegmentNum = 0;
RBC_SenseData.SenseKey = SenseKey;
//RBC_SenseData.Reserved0 = 0;
//RBC_SenseData.WrongLenIndicator = 0;
//RBC_SenseData.EndofMedium = 0;
//RBC_SenseData.FileMark = 0;
//RBC_SenseData.Info_0 = 0;
//RBC_SenseData.Info_1 = 0;
//RBC_SenseData.Info_2 = 0;
//RBC_SenseData.Info_3 = 0;
RBC_SenseData.AdditionalSenseLen = 0xa;
//RBC_SenseData.CommandSpecInfo_0 = 0;
//RBC_SenseData.CommandSpecInfo_1 = 0;
//RBC_SenseData.CommandSpecInfo_2 = 0;
//RBC_SenseData.CommandSpecInfo_3 = 0;
RBC_SenseData.ASC = ASC;
RBC_SenseData.ASCQ = ASCQ;
//RBC_SenseData.FieldReplacableUnitCode = 0;
//RBC_SenseData.SenseKeySpec_0 = 0;
//RBC_SenseData.SenseKeySpecValid = 0;
//RBC_SenseData.SenseKeySpec_1 = 0;
//RBC_SenseData.SenseKeySpec_2 = 0;
*/
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -