📄 scsi2.c
字号:
/* set state machine */
BOTFSMstate = BOTFSM_DATAIN;
/* get the LogicBlockAddr in cbwcb (scsi2 read cmd) */
LBA_W32 = ((UINT8)(SCSI2_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_3)<<24)
+ ((UINT8)(SCSI2_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_2)<<16)
+ ((UINT8)(SCSI2_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_1)<<8)
+ (UINT8)(SCSI2_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_0);
/* get the numbers of LogicBlock */
LBA_Count = BOTXfer_wResidue/512;
/*
* read from CF card (raw mode)
* device = SCSI2_LUN
*/
devio_read(7+SCSI2_LUN, 0L+(LBA_W32), (unsigned char *)rwbuf, LBA_Count, 1);
//Uart_Printf("Read %d\n", SCSI2_LUN);
BOTXfer_pData = (INT8 *)rwbuf;
/* reset bulk in ep */
FLUSHTX1;
/* send data to the tx1 FIFO */
for(i=0; i<64; i++)
write_usb(TXD1,((INT8 *)BOTXfer_pData)[i]);
BOTXfer_pData += 64;
BOTXfer_wResidue -= 64;
/* enable TX, choose PID, and flip the data toggle */
TXEN1_PID;
return (TRUE);
#undef cdbRead
}
BOOLEAN SCSI2_Write(void)
{
#define cdbWrite SCSI2_CDB.RbcCdb_Write
extern UINT32 wlen;
/* get the transfer length in cbw */
BOTXfer_wResidue = CBW_wXferLen;
/* build csw to be sent later */
TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
//SCSI2_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
BOTFSMstate = BOTFSM_DataOut;
/* get the LogicBlockAddr in cbwcb (scsi2 read cmd) */
LBA_W32 = ((UINT8)(SCSI2_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_3)<<24)
+ ((UINT8)(SCSI2_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_2)<<16)
+ ((UINT8)(SCSI2_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_1)<<8)
+ (UINT8)(SCSI2_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_0);
/* get the numbers of LogicBlock */
LBA_Count = BOTXfer_wResidue/512;
/* reset write temp var to 0 */
wlen = 0;
//Uart_Printf("LBA_W32(write) %d LBA_Count %d\n", LBA_W32, LBA_Count);
return (TRUE);
#undef cdbWrite
}
BOOLEAN SCSI2_ReadCapacity(void)
{
#define cdbReadCap SCSI2_CDB.RbcCdb_ReadCapacity
INT8 i;
DEV_GEOMETRY gc;
/*
* get the disk total capacity
* use cdbReadCap command as temporary space to store capacity parameters
* device = SCSI2_LUN
*/
nand_perform_device_ioctl(7+SCSI2_LUN, DEVCTL_GET_GEOMETRY, &gc);
//Uart_Printf("ReadCapacity %d\n", SCSI2_LUN);
cdbReadCap.tmpVar.l[1] = gc.dev_geometry_lbas;
/* 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;
BOTXfer_wResidue = sizeof(READ_CAPACITY_DATA); //=8
BOTXfer_pData = (PINT8)&(cdbReadCap.tmpVar);
/* build CSW packet */
TPBulksup_ErrorHandler(CASE6, BOTXfer_wResidue);
//SCSI2_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
BOTFSMstate = BOTFSM_DATAIN;
/* reset bulk in ep */
FLUSHTX1;
/* following is for my 64MB Cf card */
//BOTXfer_pData[0]=0x00; BOTXfer_pData[1]=0x01;BOTXfer_pData[2]=0xec;
//BOTXfer_pData[3]=0x00;BOTXfer_pData[4]=0x00;BOTXfer_pData[5]=0x00;
//BOTXfer_pData[6]=0x02; BOTXfer_pData[7]=0x00;
for(i=0; i<8; i++)
write_usb(TXD1,((INT8 *)BOTXfer_pData)[i]); /*send data to the tx1 FIFO */
BOTXfer_wResidue = 0;
TXEN1_PID; //enable TX, choose PID, and flip the data toggle
return(TRUE);
#undef cdbReadCap
}
BOOLEAN SCSI2_Verify(void)
{
#define cdbVerifySCSI2 SCSI2_CDB.RbcCdb_Verify
/* builed CSW packet */
TPBulksup_ErrorHandler(CASE1,0);
//SCSI2_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
/* send CSW packet */
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef cdbVerifySCSI2
}
BOOLEAN SCSI2_Inquiry(void)
{
#define cdbInquirySPC SCSI2_CDB.SpcCdb_Inquiry
BOOLEAN retStatus = FALSE;
INT8 i;
BOTXfer_pData =(PINT8) &inquiryData;
BOTXfer_wResidue = 36;//sizeof(STD_INQUIRYDATA);
retStatus = TRUE;
if( BOTXfer_wResidue > CBW_wXferLen )
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
SCSI2_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
else if ( BOTXfer_wResidue == CBW_wXferLen )
{
//this is the case
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue); //set CSW
SCSI2_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
else
{
TPBulksup_ErrorHandler(CASE5,BOTXfer_wResidue);
SCSI2_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
}
BOTFSMstate = BOTFSM_DATAIN;// Goto USBFSM4BOT_DATAIN
FLUSHTX1;
for(i=0; i<36; i++)
write_usb(TXD1,((INT8 *)BOTXfer_pData)[i]); /*send data to the tx1 FIFO */
BOTXfer_wResidue = 0;
TXEN1_PID; //enable TX, choose PID, and flip the data toggle
return retStatus;
#undef cdbInquirySPC
}
BOOLEAN SCSI2_ModeSense(void)
{
#define cdbModeSenseSPC SCSI2_CDB.SpcCdb_ModeSense
BOOLEAN retStatus = FALSE;
INT8 i;
INT8 BOTXfer_Data[4];
BOTXfer_wResidue = 4;
BOTXfer_pData = BOTXfer_Data;
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
//SCSI2_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
BOTFSMstate = BOTFSM_DATAIN;
/* build modesens return data */
BOTXfer_Data[0]=0x03;BOTXfer_Data[1]=BOTXfer_Data[2]=BOTXfer_Data[3]=0;
FLUSHTX1;
for(i=0; i<4; i++)
write_usb(TXD1,((INT8 *)BOTXfer_pData)[i]); /*send data to the tx1 FIFO */
BOTXfer_wResidue =0;
TXEN1_PID; //enable TX, choose PID, and flip the data toggle
return retStatus;
#undef cdbModeSenseSPC
}
BOOLEAN SCSI2_TestUnit(void)
{
#define cdbTestUnit SCSI2_CDB.SpcCdb_TestUnit
TPBulksup_ErrorHandler(CASE1,0);
//SCSI2_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
#undef cdbTestUnit
}
BOOLEAN SCSI2_RequestSense(void)
{
#define cdbRequestSenseSPC SCSI2_CDB.SpcCdb_RequestSense
int i;
BOTXfer_pData =(PINT8)&Req_SenseData ;
BOTXfer_wResidue = 18;//sizeof(Req_SenseData);
/* build CSW packet */
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
BOTFSMstate = BOTFSM_DATAIN;
FLUSHTX1;
for(i=0; i<18; i++)
write_usb(TXD1,((INT8 *)BOTXfer_pData)[i]); /*send data to the tx1 FIFO */
BOTXfer_wResidue =0;
TXEN1_PID; //enable TX, choose PID, and flip the data toggle
return TRUE;
#undef cdbRequestSenseSPC
}
BOOLEAN SCSI2_Format(void)
{
/* build CSW packet */
TPBulksup_ErrorHandler(CASE1,0);
//SCSI2_BuildSenseData(SCSI_SENSE_MEDIUM_ERROR,SCSI_ADSENSE_FORMAT_ERROR,0x01);
/* send CSW packet */
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
return TRUE;
}
void SCSI2_BuildSenseData(INT8 SenseKey, INT8 ASC, INT8 ASCQ)
{
/*
SCSI2_SenseData.ResponseCode = SCSI_RESPONSECODE_CURRENT_ERROR;
SCSI2_SenseData.Valid = 0;
//SCSI2_SenseData.SegmentNum = 0;
SCSI2_SenseData.SenseKey = SenseKey;
//SCSI2_SenseData.Reserved0 = 0;
//SCSI2_SenseData.WrongLenIndicator = 0;
//SCSI2_SenseData.EndofMedium = 0;
//SCSI2_SenseData.FileMark = 0;
//SCSI2_SenseData.Info_0 = 0;
//SCSI2_SenseData.Info_1 = 0;
//SCSI2_SenseData.Info_2 = 0;
//SCSI2_SenseData.Info_3 = 0;
SCSI2_SenseData.AdditionalSenseLen = 0xa;
//SCSI2_SenseData.CommandSpecInfo_0 = 0;
//SCSI2_SenseData.CommandSpecInfo_1 = 0;
//SCSI2_SenseData.CommandSpecInfo_2 = 0;
//SCSI2_SenseData.CommandSpecInfo_3 = 0;
SCSI2_SenseData.ASC = ASC;
SCSI2_SenseData.ASCQ = ASCQ;
//SCSI2_SenseData.FieldReplacableUnitCode = 0;
//SCSI2_SenseData.SenseKeySpec_0 = 0;
//SCSI2_SenseData.SenseKeySpecValid = 0;
//SCSI2_SenseData.SenseKeySpec_1 = 0;
//SCSI2_SenseData.SenseKeySpec_2 = 0;
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -