📄 rbc.c
字号:
Hal4ATA_SectCntInBlk = ATADevExt_IDData.MaximumBlockTransfer << BITNUM4EP2PKT_PER_SECTOR;
/*
// Setting ATA Hardware
*/
/*
ATABF_IDEXfer_dir = 1;
while(TRUE)
{
//Hal4ATA_ReadWriteSetting();
for (b=0; b!=20;b++)
{
Hal4Sys_ATAPortOutB(0x52,0);
Hal4Sys_ATAPortOutB(0x53,b);
Hal4Sys_ATAPortOutB(0x54,0);
Hal4Sys_ATAPortOutB(0x55,0);
Hal4Sys_ATAPortOutB(0x56,0);
Hal4Sys_ATAPortOutB(0x57, IDE_COMMAND_READ);
P1 = 0xD0;
for (a=512 ; a!=0 ; a--)
{
ATA_RD_N = 0;
temp = P0;
temp1=P2;
ATA_RD_N = 1;
P0 = 0xFF;
}
}
}
/*
// config TPBulkXfer Paras
*/
/*
Xfer_Space &= BOTXFERSPACE_MASK;
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
}
*/
BOOLEAN 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;
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
}
BOOLEAN RBC_ReadCapacity(void)
{
#define cdbReadCap RBC_CDB.RbcCdb_ReadCapacity
/*
// Calculate last sector.
*/
cdbReadCap.tmpVar.l[1] = ((INT32)ATADevExt_IDData.CurrentSectorCapacity.u0) - 1;
// 32bits info
//ATADevExt_IDData.CurrentSectorCapacity.ints.i0 = Hal4Sys_ATADataPortInW()
//ATADevExt_IDData.CurrentSectorCapacity.ints.i1 = Hal4Sys_ATADataPortInW()
/* struct
{
INT8 c3; // MSB for 8051 Keil C
INT8 c2;
INT8 c1;
INT8 c0; // LSB for 8051 Keil C
} chars0;
*/
/* 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;
BOTXfer_atRAM = 1;
BOTXfer_wResidue = sizeof(READ_CAPACITY_DATA);
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
}
BOOLEAN 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
}
BOOLEAN 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
}
BOOLEAN 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;
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
////////////////////////////////////////////////////////////////////////////////////
*/
BOOLEAN SPC_Inquiry(void)
{
#define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
BOOLEAN retStatus = FALSE;
if(cdbInquirySPC.EnableVPD)
{
switch(cdbInquirySPC.PageCode)
{
case VPDPAGE_SERIAL_NUMBER:
BOTXfer_pData =(PINT8) &SerialPage;
BOTXfer_wResidue = sizeof(VPD_SERIAL_PAGE);
break;
case VPDPAGE_DEVICE_IDENTITY:
retStatus = TRUE;
BOTXfer_pData = (PINT8)&DeviceIDPage;
BOTXfer_wResidue = sizeof(VPD_DEVICE_ID_PAGE);
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);
}
retStatus = TRUE;
Xfer_Space &= BOTXFERSPACE_MASK;
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
}
BOOLEAN SPC_ModeSelect(void)
{
#define cdbModeSelectSPC RBC_CDB.SpcCdb_ModeSelect
BOOLEAN retStatus = FALSE;
//
//Just Retrieve and discard data from USB FIFO
Xfer_Space &= BOTXFERSPACE_MASK;
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
}
BOOLEAN SPC_ModeSense(void)
{
#define cdbModeSenseSPC RBC_CDB.SpcCdb_ModeSense
BOOLEAN 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);
break;
case PAGECTRL_DEFAULT:
case PAGECTRL_CURRENT:
BOTXfer_pData =(PINT8) &DefaultParaHead;
BOTXfer_wResidue = sizeof(PARAMETER_LIST_LENGTH);
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
}
BOOLEAN 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
}
BOOLEAN 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
}
BOOLEAN SPC_RequestSense(void)
{
#define cdbRequestSenseSPC RBC_CDB.SpcCdb_RequestSense
/*
// Adjust TPBulkXfer Paras
*/
Xfer_Space &= BOTXFERSPACE_MASK;
// BOTXfer_atRAM = 1;
BOTXfer_atROM = 1;
BOTXfer_pData =(PINT8)&Req_SenseData ;
BOTXfer_wResidue = sizeof(Req_SenseData);
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
BOTFSMstate = USBFSM4BOT_DATAIN;
return TRUE;
#undef cdbRequestSenseSPC
}
//Optional
BOOLEAN 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;
}
BOOLEAN 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;
}
BOOLEAN 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;
}
BOOLEAN 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;
}
BOOLEAN SPC_PersisReserveOut(void)
{
//Just Retrieve and discard data from USB FIFO
Xfer_Space &= BOTXFERSPACE_MASK;
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;
}
BOOLEAN SPC_WriteBuff(void)
{
#define cdbWriteBuff RBC_CDB.SpcCdb_WriteBuffer
//Just Retrieve and discard data from USB FIFO
Xfer_Space &= BOTXFERSPACE_MASK;
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 + -