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

📄 rbc.c

📁 前一段参考本程序为AT91RM9200开发板添加了一个USB MSD Bulk-Only下载接口
💻 C
📖 第 1 页 / 共 2 页
字号:


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