⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsi2.c

📁 ertfs文件系统里面既有完整ucos程序
💻 C
📖 第 1 页 / 共 2 页
字号:

	/* 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 + -