📄 rbc.c
字号:
unsigned int i;
#define cdbWrite RBC_CDB.RbcCdb_Write
Start_LBA = cdbWrite.LBA_0 +
cdbWrite.LBA_1*0x100 +
cdbWrite.LBA_2*0x10000 +
cdbWrite.LBA_3*0x1000000;
UartSendData(0xaa);
UartSendData(cdbWrite.LBA_0);
UartSendData(cdbWrite.LBA_1);
UartSendData(cdbWrite.LBA_2);
UartSendData(cdbWrite.LBA_3);
UartSendData(0xbb);
Current_LBA = Start_LBA;
SectorCount =cdbWrite.XferLength_0 + cdbWrite.XferLength_1 * 0x100;
if (Start_LBA < 0x60)
{
NF_EraseBackBlock();
if( (Current_LBA & 0x1f ) != 0 ) //Start Sector not First Sector in Block
{
NF_BackBlockHead(Current_LBA-1);
}
if( (SectorCount + (Current_LBA & 0x1f)) < 0x20 )
{
NF_BackBlockTail(Current_LBA);
}
BOTXfer_wResidue = CBW_wXferLen;
BOTXfer_pData = g_RWBuf;
TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
BOTXfer_atNF =TRUE;
BOTFSMstate= USBFSM4BOT_DATAOUT;
}
else
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
DMA_D12toNF(Start_LBA, SectorCount);
BOTXfer_wResidue=0x00;
TPBulk_CSWHandler(); // Goto USBFSM4BOT_CSWPROC;
}
return (TRUE);
#undef cdbWrite
}
unsigned int RBC_ReadCapacity(void)
{
#define cdbReadCap RBC_CDB.RbcCdb_ReadCapacity
/*
// Calculate last sector.
*/
/* store it in big endian */
cdbReadCap.tmpVar.CapData.LBA_3 = (NF_SECTOR_TOTAL_NUM >> 24)&0xff;
cdbReadCap.tmpVar.CapData.LBA_2 = (NF_SECTOR_TOTAL_NUM >> 16)&0xff;
cdbReadCap.tmpVar.CapData.LBA_1 = (NF_SECTOR_TOTAL_NUM >> 8)&0xff;
cdbReadCap.tmpVar.CapData.LBA_0 = (NF_SECTOR_TOTAL_NUM )&0xff;
/*
// 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
*/
BOTXfer_wResidue = sizeof(READ_CAPACITY_DATA);
BOTXfer_pData = (unsigned int)&(cdbReadCap.tmpVar);
TPBulksup_ErrorHandler(CASE6, BOTXfer_wResidue);
BOTXfer_atROMorRAM=TRUE;
BOTFSMstate=USBFSM4BOT_DATAIN;
return(TRUE);
#undef cdbReadCap
}
unsigned int 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);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef cdbOnOffUnit
}
unsigned int RBC_SyncCache(void)
{
#define cdbSyncRBC RBC_CDB.RbcCdb_SyncCache
//BOTXfer_wResidue = 0;
TPBulksup_ErrorHandler(CASE1,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef cdbSyncRBC
}
unsigned int RBC_Verify(void)
{
#define cdbVerifyRBC RBC_CDB.RbcCdb_Verify
if( CBW_wXferLen == 0 )
{
//BOTXfer_wResidue = 0;
TPBulksup_ErrorHandler(CASE1,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
}
else
{
/*
// Config TPBulkXfer Paras
*/
BOTXfer_atROMorRAM = TRUE;
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
BOTFSMstate= USBFSM4BOT_DATAOUT;
}
return TRUE;
#undef cdbVerifyRBC
}
/*
////////////////////////////////////////////////////////////////////////////////////
// SCSI Primary Command Support
////////////////////////////////////////////////////////////////////////////////////
*/
unsigned int SPC_Inquiry(void)
{
#define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
unsigned int retStatus = FALSE;
if(cdbInquirySPC.EnableVPD)
{
switch(cdbInquirySPC.PageCode)
{
case VPDPAGE_SERIAL_NUMBER:
BOTXfer_pData =(unsigned int) &SerialPage;
BOTXfer_wResidue = sizeof(VPD_SERIAL_PAGE);
break;
case VPDPAGE_DEVICE_IDENTITY:
retStatus = TRUE;
BOTXfer_pData = (unsigned int)&DeviceIDPage;
BOTXfer_wResidue = sizeof(VPD_DEVICE_ID_PAGE);
break;
default:
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return retStatus;
}
}
else if(cdbInquirySPC.CmdSupportData)
{
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
TPBulk_CSWHandler(); // Goto USBFSM4BOT_CSWPROC;
return retStatus;
}
else
{
BOTXfer_pData = (unsigned int) &inquiryData;
BOTXfer_wResidue = sizeof(STD_INQUIRYDATA);
}
retStatus = TRUE;
BOTXfer_atROMorRAM = TRUE;
// BOTXfer_wResidue = CBW_wXferLen;//modify
if( BOTXfer_wResidue > CBW_wXferLen )
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
}
else if ( BOTXfer_wResidue == CBW_wXferLen )
{
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
}
else
{
TPBulksup_ErrorHandler(CASE5,BOTXfer_wResidue);
}
BOTFSMstate=USBFSM4BOT_DATAIN;// Goto USBFSM4BOT_DATAIN
return retStatus;
#undef cdbInquirySPC
}
unsigned int SPC_ModeSelect(void)
{
#define cdbModeSelectSPC RBC_CDB.SpcCdb_ModeSelect
unsigned int retStatus = FALSE;
//
//Just Retrieve and discard data from USB FIFO
BOTXfer_atROMorRAM = TRUE;
BOTXfer_pData = (unsigned int)0;
BOTXfer_wResidue = cdbModeSelectSPC.ParameterLen;
if(cdbModeSelectSPC.SavePage != 1)
{
if(CBW_wXferLen < BOTXfer_wResidue)
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE13,BOTXfer_wResidue);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return retStatus;
}
else if(CBW_wXferLen == BOTXfer_wResidue)
{
TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
retStatus = TRUE;
}
else
{
TPBulksup_ErrorHandler(CASE11,BOTXfer_wResidue);
retStatus = TRUE;
}
BOTFSMstate= USBFSM4BOT_DATAOUT;
}
else
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
}
return retStatus;
#undef cdbModeSelectSPC
}
unsigned int SPC_ModeSense(void)
{
#define cdbModeSenseSPC RBC_CDB.SpcCdb_ModeSense
unsigned int retStatus = FALSE;
if(cdbModeSenseSPC.PageCode == MODE_PAGE_RBC_DEVICE_PARAMETERS )
{
switch(cdbModeSenseSPC.PageControl)
{
case PAGECTRL_CHANGEABLE:
BOTXfer_pData =(unsigned int) &ParaHeadMask;
BOTXfer_wResidue = sizeof(PARAMETER_LIST_LENGTH);
break;
case PAGECTRL_DEFAULT:
case PAGECTRL_CURRENT:
BOTXfer_pData =(unsigned int) &DefaultParaHead;
BOTXfer_wResidue = sizeof(PARAMETER_LIST_LENGTH);
break;
case PAGECTRL_SAVED:
default:
//retStatus = FALSE;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
break;
}
if(CBW_wXferLen < BOTXfer_wResidue)
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
}
else if(CBW_wXferLen == BOTXfer_wResidue)
{
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
}
else
{
TPBulksup_ErrorHandler(CASE5,BOTXfer_wResidue);
}
retStatus = TRUE;
BOTFSMstate=USBFSM4BOT_DATAIN;// Goto USBFSM4BOT_DATAIN
}
else
{
//retStatus = FALSE;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
}
return retStatus;
#undef cdbModeSenseSPC
}
unsigned int SPC_LockMedia(void)
{
#define cdbLockSPC RBC_CDB.SpcCdb_Remove
RBC_PropertyData.bits.MediumRemovFlag = cdbLockSPC.Prevent;
if (RBC_PropertyData.bits.MediumRemovFlag == 01)
; //enable(allow) the removal of the medium
else
; //disable(prevent)removal of the mddium
TPBulksup_ErrorHandler(CASE1,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef cdbLockSPC
}
unsigned int SPC_TestUnit(void)
{
#define cdbTestUnit RBC_CDB.SpcCdb_TestUnit
#define READY 1
/*
if(READY)
{
TPBulksup_ErrorHandler(CASE1,0);
}
else
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
}
*/
TPBulksup_ErrorHandler(CASE1,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef READY
#undef cdbTestUnit
}
unsigned int SPC_RequestSense(void)
{
#define cdbRequestSenseSPC RBC_CDB.SpcCdb_RequestSense
/*
// Adjust TPBulkXfer Paras
*/
BOTXfer_atROMorRAM = TRUE;
BOTXfer_pData =(unsigned int)&Req_SenseData ;
BOTXfer_wResidue = sizeof(Req_SenseData);
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
BOTFSMstate=USBFSM4BOT_DATAIN;
return TRUE;
#undef cdbRequestSenseSPC
}
//Optional
unsigned int RBC_Format(void)
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
}
unsigned int SPC_Reserve6(void)
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
}
unsigned int SPC_Release6(void)
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
}
unsigned int SPC_PersisReserveIn(void)
{
TPBulksup_ErrorHandler(CASECMDFAIL,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
}
unsigned int SPC_PersisReserveOut(void)
{
//Just Retrieve and discard data from USB FIFO
BOTXfer_atROMorRAM = TRUE;
BOTXfer_pData = (unsigned int)0;
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
// BOTFSM_DataOut=TRUE;
return TRUE;
}
unsigned int SPC_WriteBuff(void)
{
#define cdbWriteBuff RBC_CDB.SpcCdb_WriteBuffer
//Just Retrieve and discard data from USB FIFO
BOTXfer_atROMorRAM = TRUE;
BOTXfer_pData = (unsigned int)0;
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
// BOTFSM_DataOut=TRUE;
return TRUE;
#undef cdbWriteBuff
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -