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

📄 doscsicommand.c

📁 瑞萨单片机开发软代码.非常实用小巧的平台,很多应用都可以在上面实现.
💻 C
📖 第 1 页 / 共 2 页
字号:
		case 0x23:	/*	READ FORMAT CAPACITY	report a list of possible format capacities	*/
			if (EpInfo[USE_OUT_EP].PresentState != TRANS_IN) 
			{	/*	command direction does not according with Data Transport direction	*/
				BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
				BufPtr[DATA_INFO].ePtr = &returnData->byteVal[63];
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			// since this is a fixed size stroage mdeia, so just return its block length and block size
			
		    // no. of block form MBR
		    readFormatCapData[6] = MBRCache.Buf[0x1cb];
		    readFormatCapData[7] = MBRCache.Buf[0x1ca];
		    
		    // Descriptor type
		    readFormatCapData[8] = 0x02;                      // indicated it is formatted media
		    
		    // Block length
		    readFormatCapData[10] = 0x02;
		    readFormatCapData[11] = 0x00;
			
			/*	set up data buffer pointers	*/
			BufPtr[DATA_INFO].ePtr = &readFormatCapData[11];
			BufPtr[DATA_INFO].sPtr = &readFormatCapData[0];              
            
            // Only 11 bytes need to send
            workValue = 12;
//            cbwDataGVar->cbwType.dCBWDataTransferLength = workValue;

			// In case workValue > max end-point size
			Cache->ReadCache.Modified = 0;

			// clear REQUEST_SENSE value
			reqSensDataGVar[2] = 0x00;	//	Sense Key	
			reqSensDataGVar[12] = 0x00;	//	Additional Sense Code	
			reqSensDataGVar[13] = 0x00;	//	Additional Sense Code Qualifier	
			break;
	
		case 0x25:	/*	READ CAPACITY	report logical blocks length and a block byte length	*/

			if (EpInfo[USE_OUT_EP].PresentState != TRANS_IN) 
			{	/*	command direction does not according with Data Transport direction	*/
				BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
				BufPtr[DATA_INFO].ePtr = &returnData->byteVal[63];
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}

			/*	UNIT is NOT READY	*/
			if ((unit_state[0] & 0x01) == 0x01){
				SetBotCmdErr(NOT_READY,0);
				workValue = 0;			
				break;
			}
			
			workValue = 0;
			for(c=3;c>=0;c--)
			{
				workValue *= 0x100;
				workValue += MBRCache.Buf[0x1ca+c];
			}
			readCapaData[0] = workValue;	
			readCapaData[1] = BPS_SIZE;
			workValue = 8;

			// In case workValue > max end-point size
			Cache->ReadCache.Modified = 0;
			
			/*	set up data buffer pointers	*/
			BufPtr[DATA_INFO].ePtr = (unsigned char*)(&readCapaData[1] + 1);
			BufPtr[DATA_INFO].sPtr = (unsigned char*)&readCapaData[0];
			
			// clear REQUEST_SENSE value
			reqSensDataGVar[2] = 0x00;	//	Sense Key	
			reqSensDataGVar[12] = 0x00;	//	Additional Sense Code	
			reqSensDataGVar[13] = 0x00;	//	Additional Sense Code Qualifier	
			break;

		case 0x28:	/*	READ(10) COMMAND		*/
			if (EpInfo[USE_OUT_EP].PresentState != TRANS_IN) 
			{	/*	command direction does not according with Data Transport direction	*/
				/*	set up data buffer pointers	*/
				BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
				BufPtr[DATA_INFO].ePtr = &returnData->byteVal[63];
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}

			/*	UNIT is NOT READY	*/
			if ((unit_state[0] & 0x01) == 0x01){
				SetBotCmdErr(NOT_READY,0);
				workValue = 0;			
				break;
			}

			/*	set up data buffer pointers	*/
			//redirect storage's sector to logical working sector
			workValue = ConvRealn((unsigned char*)&cbwDataGVar->cbwType.cmd7,2);
			Cache->ReadCache.Sectors = workValue;   
			
			if(Cache->ReadCache.Sectors == 0)
			{//read size is zero => error    
				BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
				BufPtr[DATA_INFO].ePtr = &returnData->byteVal[63];
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
			Cache->ReadCache.Addr = ConvRealn(&cbwDataGVar->cbwType.cmd2,4);
			Cache->ReadCache.Addr *= BPS_SIZE;     
			
			// set up data buffer pointer 
			SCSI_READ();
			
			workValue *= BPS_SIZE;

			// clear REQUEST SENSE value
			reqSensDataGVar[2] = 0x00;	//	Sense Key	
			reqSensDataGVar[12] = 0x00;	//	Additional Sense Code	
			reqSensDataGVar[13] = 0x00;	//	Additional Sense Code Qualifier	
			break;

		case 0x2A:	/*	WRITE(10) COMMAND	*/
			if (EpInfo[USE_OUT_EP].PresentState != TRANS_OUT) {
			/*	command direction does not according with Data Transport direction	*/
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}

			/*	UNIT is NOT READY	*/
			if ((unit_state[0] & 0x01) == 0x01){
				SetBotCmdErr(NOT_READY,0);			
				workValue = 0;			
				break;
			}
			
			if (write_protect==0) {
    			 reqSensDataGVar[2] = 0x00;		//	Sense Key	
	     		 reqSensDataGVar[12] = 0x00;	//	Additional Sense Code	
		    	 reqSensDataGVar[13] = 0x00;	//	Additional Sense Code Qualifier	
			} else {
			     // below setting is "Conditional Write Protect"
			     reqSensDataGVar[2] = 0x07;		//	Sense Key	
			     reqSensDataGVar[12] = 0x27;	//	Additional Sense Code	
    			 reqSensDataGVar[13] = 0x00;	//	Additional Sense Code Qualifier	    
    			 report_wp=1;
    		}	 

			workValue = ConvRealn((unsigned char*)&cbwDataGVar->cbwType.cmd7,2);
			Cache->WriteCache.Sectors = workValue;            

			/*	set up data buffer pointers	*/
			workValue = SCSI_WRITE();
			break;

		case 0x2F:	/*	VERIFY(10) COMMAND	*/
			workValue = 0;
			
			if (EpInfo[USE_OUT_EP].PresentState != TRANS_OUT) 
			{	/*	command direction does not according with Data Transport direction	*/
				cswDataGVar->cswMeaningType.bCSWStatus = 0x02;
				break;
			}
                      
			/*	UNIT is NOT READY	*/
			if ((unit_state[0] & 0x01) == 0x01){
				SetBotCmdErr(NOT_READY,0);			
				workValue = 0;			
				break;
			}

			/*	in case BytChk bit is "0", confirm designated sector
				in case BytChk bit is "1", return "PARAMETER VALUE INVALID"	*/
			if ((cbwDataGVar->cbwType.cmd1 & ~0x02) != 0x00) 
			{
				/*	in case BytChk bit is "1", return "PARAMETER VALUE INVALID"
					set REQUEST SENSE value	*/
				SetBotCmdErr(INVALID_1,0);
				workValue = 0;			
				break;
			}

			//	in case BytChk bit is "0", confirm designated sector
            //  clear REQUEST SENSE value
			reqSensDataGVar[2] = 0x00;	//	Sense Key	
			reqSensDataGVar[12] = 0x00;	//	Additional Sense Code	
			reqSensDataGVar[13] = 0x00;	//	Additional Sense Code Qualifier	
			break;

		default:	/*	not support commands	*/
			/*	INVALID FIELD IN CDB	*/          
			
			SetBotCmdErr(INVALID_0,0);
			workValue = 0;
			
			SCI_Str("\r\nSCMD-");
	        SCI_HexB(cbwDataGVar->cbwType.cmdOpeCode);
			break;
	}
	return workValue;
}

/***************************************************************************
Function Name	:SetBotCmdErr(BotCmdErrType,unsigned char)
Working			:Set BOT Cmd Err (NOT READY)
Return Value	:void
Created			:{Author : A.Ikeya	[2002.May.28]}

***************************************************************************/
void	SetBotCmdErr(unsigned char BotCmdErr,unsigned char UnitNum)
{
	int i;	

	switch (BotCmdErr){
		case INVALID_0:
			/*	INVALID FIELD IN CDB	*/
			reqSensDataGVar[2] = 0x05;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x24;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			break;
		case INVALID_1:
			/*	in case BytChk bit is "1", return "PARAMETER VALUE INVALID"
				set REQUEST SENSE value	*/
			reqSensDataGVar[2] = 0x05;	/*	Sense Key	*//*	Invalid comand	*/
			reqSensDataGVar[12] = 0x26;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x02;	/*	Additional Sense Code Qualifier	*/
			break;
		case NOT_READY:
			reqSensDataGVar[2] = 0x02;	/*	Sense Key	*//*	NOT READY	*/
			reqSensDataGVar[12] = 0x3A;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			break;
		default:
			/*	INVALID FIELD IN CDB	*/
			reqSensDataGVar[2] = 0x05;	/*	Sense Key	*/
			reqSensDataGVar[12] = 0x24;	/*	Additional Sense Code	*/
			reqSensDataGVar[13] = 0x00;	/*	Additional Sense Code Qualifier	*/
			break;
	}


	/*	clear work area	*/
	
	for(i = 0; i < 16; i++) {
		returnData->longVal[i] = 0x00000000;
	}
	/*	make CSW BCSWStatus	*/
	cswDataGVar->cswMeaningType.bCSWStatus = 0x01;
	
	/*	set up data buffer pointers	*/
	BufPtr[DATA_INFO].ePtr = &returnData->byteVal[0];
	BufPtr[DATA_INFO].sPtr = &returnData->byteVal[0];
}

⌨️ 快捷键说明

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