doscsicommand.c

来自「16位单片机H8的例子源代码」· C语言 代码 · 共 309 行

C
309
字号
/*
****************************************************************************
					H I T A C H I    P R O P R I E T A R Y

	COPYRIGHT (c)	2001 BY Semiconductor & Integrated Circuits,Hitachi,Ltd.
						---  ALL RIGHTS RESERVED  ---

	File Name	:DoSCSICommand.c
	Working		:Judging and Executing SCSI Command
	Modified	:Rev 2001_11_28 {Author : T.Ishikawa}
	Modified	:Rev 2001_09_28 {Author : T.Ishikawa}
	Created		:Rev 1.0 {Author : T.Ishikawa[2001.Jan.10]}
****************************************************************************
*/

#ifndef SysMemMap
#include	"SysMemMap.h"
#endif	/*	SysMemMap	*/

#ifndef CatProType
#include	"CatProType.h"
#endif	/*	CatProType	*/

#include	"SetSCSIInfo.h"



/*	Prototype	*/
unsigned long				DecBotCmd(void);



/*	Contents	*/
/***************************************************************************
Function Name	:DecBotCmd(unsigned long,unsigned char)
Working			:Judging and Executing SCSI Command
Return Value	:unsigned long
Modified		:{Author : T.Ishikawa[2001.Nov.28]}
Modified		:{Author : T.Ishikawa[2001.Aug.09]}
Created			:{Author : T.Ishikawa[2001.Jan.10]}
***************************************************************************/
unsigned long	DecBotCmd(void) {

	unsigned char	counter;
	long			workValue = 0;	/*	SCSI Commands returnable data size in Data Stage	*/
	PBRDataType*	pbrAcsess;		/*	PBR physical address	*/
	
	/*	what is SCSI command ?	*/
	switch (cbwDataGVar->cbwMeaningType.cmdOpeCode) {
		case 0x12:	/*	INQUIRY	report drive information	*/
			/*	clear REQUEST SENSE value	*/
			reqSensDataGVar[2] = 0x00;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x00;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			
			if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
			/*	command direction does not according with Data Transport direction	*/
				/*	set up data buffer pointers	*/
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
				dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
				dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64];
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			
			if (cbwDataGVar->cbwMeaningType.cmd1 != 0x00) {
				error();
			}
			workValue = (unsigned char)cbwDataGVar->cbwMeaningType.cmd4;
			
			/*	Allocation Length has report data byte size	*/
			if ((EpInfo[SET_BOT_USE_OUT_EP].PresentState == TRANS_OUT) & (workValue == 0x00000000)) {
				error();
			}

			/*	set up data buffer pointers	*/
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = &ansInquiryData[workValue];
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = &ansInquiryData[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = &ansInquiryData[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &ansInquiryData[96];
			if (dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr > dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr) {
			/*	HOST expectant data length > Function expectant data length	*/
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr;
			}
			workValue = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr - dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr;	/*	transfer data size	*/
			break;
		case 0x5A:	/*	MODE SENSE(10) COMMAND	*/
			/*	clear REQUEST SENSE value	*/
			reqSensDataGVar[2] = 0x00;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x00;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			
			if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
			/*	command direction does not according with Data Transport direction	*/
				/*	set up data buffer pointers	*/
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
				dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
				dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64];	/*	data buffer size is 64byte	*/
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			
			workValue = ConvRealn((unsigned char*)&cbwDataGVar->cbwMeaningType.cmd7,2);
			
			counter = 0;
			while (counter < 7) {
				counter++;
				returnData->byteVal[counter] = 0x00;
			}
			returnData->byteVal[7] = 0x08;
			
				/*	set up data buffer pointers	*/
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = &returnData->byteVal[workValue];
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = &returnData->byteVal[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = &returnData->byteVal[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[63];
			
			if (dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr > dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr) {
			/*	HOST expectant data length > Function expectant data length	*/
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr;
			}
			break;
		case 0x2A:	/*	WRITE(10) COMMAND	*/
			/*	clear REQUEST SENSE value	*/
			reqSensDataGVar[2] = 0x00;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x00;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			
			if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_OUT) {
			/*	command direction does not according with Data Transport direction	*/
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			
			/*	set up data buffer pointers	*/
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = (unsigned char*)&botDataGVar.sectorType[ConvRealn(&cbwDataGVar->cbwMeaningType.cmd2,4)];
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = (unsigned char*)&botDataGVar.sectorType[((ConvRealn(&cbwDataGVar->cbwMeaningType.cmd2,4)) + (ConvRealn(&cbwDataGVar->cbwMeaningType.cmd7,2)))];
			dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = (unsigned char*)&botDataGVar.sectorType[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = (unsigned char*)(&botDataGVar.sectorType[DISK_ALL_SECTOR] + 1);
			
			workValue = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr - dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
			break;
		case 0x03:	/*	REQUEST SENSE COMMAND	*/
			/*	clear REQUEST SENSE value	*/
			reqSensDataGVar[2] = 0x00;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x00;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			
			if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
			/*	command direction does not according with Data Transport direction	*/
				/*	set up data buffer pointers	*/
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
				dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
				dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64];
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			
			for (workValue = 0; workValue <= 17; workValue++) {
				returnData->byteVal[workValue] = reqSensDataGVar[workValue];
			}
			
			/*	set up data buffer pointers	*/
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = &returnData->byteVal[workValue];
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = &returnData->byteVal[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = &returnData->byteVal[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[63];
			break;
		case 0x28:	/*	READ(10) COMMAND		*/
			/*	clear REQUEST SENSE value	*/
			reqSensDataGVar[2] = 0x00;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x00;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			
			if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
			/*	command direction does not according with Data Transport direction	*/
				/*	set up data buffer pointers	*/
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
				dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
				dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64];
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			
			/*	set up data buffer pointers	*/
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = (unsigned char*)&botDataGVar.sectorType[(ConvRealn(&cbwDataGVar->cbwMeaningType.cmd2,4) + ConvRealn(&cbwDataGVar->cbwMeaningType.cmd7,2))];
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = (unsigned char*)&botDataGVar.sectorType[ConvRealn(&cbwDataGVar->cbwMeaningType.cmd2,4)];
			dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = (unsigned char*)&botDataGVar.sectorType[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = (unsigned char*)(&botDataGVar.sectorType[DISK_ALL_SECTOR] + 1);
			
			workValue = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr - dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr;
			break;
		case 0x2F:	/*	VERIFY(10) COMMAND	*/
			workValue = 0;
			
			/*	in case BytChk bit is "0", confirm designated sector
				in case BytChk bit is "1", return "PARAMETER VALUE INVALID"	*/
			if ((cbwDataGVar->cbwMeaningType.cmd1 & ~0x02) == 0x00) {
				/*	clear REQUEST SENSE value	*/
				reqSensDataGVar[2] = 0x00;	/*	Sense Key	*/
				reqSensDataGVar[12] = 0x00;	/*	Additional Sense Code	*/
				reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			}
			else {
				/*	in case BytChk bit is "1", return "PARAMETER VALUE INVALID"
					set REQUEST SENSE value	*/
				reqSensDataGVar[2] = 0x05;	/*	Sense Key	*/
				reqSensDataGVar[12] = 0x26;	/*	Additional Sense Code	*/
				reqSensDataGVar[13] = 0x02;	/*	Additional Sense Code Qualifier	*/
				/*	make CSW BCSWStatus	*/
				cswDataGVar->cswMeaningType.bCSWStatus = 0x01;
			}
			
			if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_OUT) {
			/*	command direction does not according with Data Transport direction	*/
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
			}
			break;
		case 0x25:	/*	READ CAPACITY	report logical blocks length and a block byte length	*/
			/*	clear REQUEST SENSE value	*/
			reqSensDataGVar[2] = 0x00;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x00;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			
			if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_IN) {
			/*	command direction does not according with Data Transport direction	*/
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr = &returnData->byteVal[0];
				dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.endPtr = &returnData->byteVal[63];
				dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.WriteType.startPtr;
				dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[64];
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			
			/*	make return value using MBR--LBA--PBR--Disk_Parameter	*/
			pbrAcsess = (PBRDataType*)&botDataGVar.sectorType[(ConvReflexn(&mbrAcsess.mbrMeaningType.pt1[8],4))];	/*	calculate PBR_head Physical Address	*/
			readCapaData[0] = ConvReflexn(&pbrAcsess->pbrMeaningType.allSector[0],2);
			readCapaData[1] = ConvReflexn(&pbrAcsess->pbrMeaningType.bytePerSector[0],2);
			workValue = 8;
			
			/*	set up data buffer pointers	*/
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = (unsigned char*)(&readCapaData[1] + 1);
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = (unsigned char*)&readCapaData[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = (unsigned char*)&readCapaData[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = (unsigned char*)(&readCapaData[1] + 1);
			
			break;
		case 0x1E:	/*	PREVENT/ALLOW MEDIUM REMOVAL COMMAND	*/
			/*	clear REQUEST SENSE value	*/
			reqSensDataGVar[2] = 0x00;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x00;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			
			if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_OUT) {
			/*	command direction does not according with Data Transport direction	*/
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			
			workValue = 0;
			
			break;
		case 0x00:	/*	TEST UNIT READY		*/
			/*	clear REQUEST SENSE value	*/
			reqSensDataGVar[2] = 0x00;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x00;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			
			if (EpInfo[SET_BOT_USE_OUT_EP].PresentState != TRANS_OUT) {
			/*	command direction does not according with Data Transport direction	*/
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			
			workValue = 0;
			
			break;
		default:	/*	not support commands	*/
			/*	set REQUEST SENSE value	*/
			/*	INVALID FIELD IN CDB	*/
			reqSensDataGVar[2] = 0x05;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x24;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			
			/*	clear work area	*/
			workValue = 16;
			while (workValue >= 0) {
				returnData->longVal[workValue] = 0x00000000;
				workValue--;
			}
			
			/*	make CSW BCSWStatus	*/
			cswDataGVar->cswMeaningType.bCSWStatus = 0x01;
			
			/*	set up data buffer pointers	*/
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.endPtr = &returnData->byteVal[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].AccessDataType.ReadType.startPtr = &returnData->byteVal[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].beginAriaPtr = &returnData->byteVal[0];
			dataBuffGPtr[SET_BOT_DATA_INFO].endAriaPtr = &returnData->byteVal[63];
			workValue = 0;
			break;
	}
	return workValue;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?