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

📄 scsi.c

📁 处理器采用的是LPC2378
💻 C
字号:
#include "config.h"
#include "D13Config.h"
#include "D13CI.h"
#include "Chap_9.h"
#include "SCSI.h"
#include "NFLASH.h"


INT8U  BULKLength;
unsigned char BulkPhase = 0;
unsigned char BulkStausPhase;
unsigned int  dCBWDaTrLen;
unsigned int WritePageBuffLen = 0;
unsigned char  setcsw[13];
extern unsigned int WriteResidueVal,WriteResidueValcopy;
extern unsigned int  ReadResidueVal;
extern INT32U offset,offsetr,offsetd,times1,times2,datalen;
INT32U temp;
//unsigned char CommandPhase = 1
//unsigned char xdata WritePageBuff[512];
//uint8 bulkbuff[512];
//uint8 temp1[512],temp2[512];
/***********************************************************
SCSI命令回复代码
***********************************************************/
INT8U SCSI_INQUIRY[36]=
{
 0x00,
 0x80,
 //0x02,
 //0x02,
 0x00,
 0x01,
 0x1f,
 
 0x00, //reserved
 0x00, //reserved
 0x00, //reserved
 
 0x20,
 0x20,  // // 10
 0x20, //
 0x20, //
 0x20,
 0x20, //
 0x20, //
 0x20, //
 
 'A', //Q
 'N',  //u
 'N', //b
 'I', //e
 'N',  //l
 'G', //e
 ' ', //3//
 ' ', //
 'U',//
 'S',  //
 'B', //
 ' ', //
 'D',
 'I',         //30
 'S', //
 'K', //
 
 0x31, //ascII   "1"
 0x2e,     //    "."
 0x30,  //       "0"
 0x30  //        "0"  //version : 1.00
 };//

INT8U SCSIDATA_ReadFormatCapacities[12]=
{
 0x00,//reserved
 0x00,//reserved
 0x00,//reserved
 
 0x08,//Capacity List Length
 
 0x00, //number of block   MSB
 0x00, //number of block    |
 0xFB, //number of block    |
 0xF0, //number of block   LSB // 32MBYTE
 
 0x02, //no cartridge in drive
 
 0x00,  // length of block// 10
 0x02, //
 0x00//  
 };

INT8U SCSIDATA_ReadCapacity[8]=
{
 0x00, //last logic block address   MSB
 0x00, //last logic block address    |
 0xFB, //last logic block address    |
 0xF0, //last logic block address   LSB  
 
 0x00, //length of block   MSB
 0x00, //length of block    |
 0x02, //length of block    |
 0x00//length of block   LSB
};

INT8U SCSIDATA_RequestSense[18]=
{
   0x70,
   	
   0x00,
   0x05,
   
   0x00,
   0x00,
   0x00,
   0x00,
   
   0x0a, 
   
   0x00,
   0x00,
   0x00,
   0x00,
   
   0x20,
   0x00,
   
   0x00,
   0x00,
   0x00,
   0x00
};

unsigned char SCSIDATA_Sense[40]=
{
   0x03,
   0x00,
   0x00,
   0x00,
   
   0x23, 
   0x00,
   0x00,
   0x00, 
   0x05,
   0x1e,
   0xF0,
   0x00,   
   0x08,
   0x20,
   0x02,
   0x00,   
   0x00,
   0xFB,
  // 0x40,
   0x00,
   0x00,   
   0x00,
   0x00,
   0x00,
   0x00,   
   0x00,
   0x00,
   0x00,
   0x00,   
   0x00,
   0x00,
   0x00,
   0x00,  
   0x00,
   0x00,
   0x00,
   0x00,
   0x00,
   0x00,
   0x00,
   0x00
};







/************************************************************
** 函数名称: BULK_submit()
** 功能描述: BULK端点传输提交
** 输	 入: 无
** 输	 出: 无

**修改人:胡琦宗
**修改日期:2005.11.22
**修改说明:创建
************************************************************/

void BULK_submit(unsigned char len)
{
	INT8U i;
	if (64 > len)
		i = len;
	else i = 64;
	D13_WriteEndpoint(2, i,ControlData.pData);
	ControlData.pData += i;
	BULKLength -= i;
}



/************************************************************
**函数功能:SCSI命令处理
**函数输入参数及说明:无


**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无

**修改人:胡琦宗
**修改日期:2005.11.22
**修改说明:创建
*************************************************************/

void Usb_BoCommand(void){
		dCBWDaTrLen = (ControlData.pData[8]<<8 + ControlData.pData[9]);//可能有错误 ControlData.pData[8]是不是应该为ControlData.dataBuffer[8]?
		//BeepFunc ();
		switch (ControlData.dataBuffer[15])
		{
		case 0x00:
			SCSICMD_TestUnitReady();
					BulkStausPhase = InCSWPhase;
					break;
		case 0x03:
			SCSICMD_RequestSense();
           			 BulkStausPhase=InCSWPhase;
           			 break;
		case 0x12:
		    //D13_ValidBuffer(0x03);
			SCSICMD_Inquiry();
					BulkStausPhase = InCSWPhase;
			//D13_ClearBuffer(0x03);		
					break;
		case 0x1a:
			SCSICMD_ModeSense06();
            		BulkStausPhase=InCSWPhase;
            		break;
		case 0x1e:
			SCSICMD_PreventAllowMediumRemoval();
            		BulkStausPhase=InCSWPhase;
            		break;
		case 0x23:
			SCSICMD_ReadFormatCapacities();
					BulkStausPhase = InCSWPhase;
					break;
		case 0x25:
			SCSICMD_ReadCapacity();
            		BulkStausPhase=InCSWPhase;
            		break;
		case 0x28:
		   
			SCSICMD_Read10();
               		BulkStausPhase=InCSWPhase;
               		break;
		case 0x2a:
			//D13_ValidBuffer(0x03);
			SCSICMD_Write10();
               		BulkPhase =OutDataPhase;
               		//BeepFunc();
            //D13_ClearBuffer(0x03);   		
               		break;
		case 0x2f:
			SCSICMD_Verify10();
               		BulkStausPhase=InCSWPhase;
               		break;
		case 0x5a:
			SCSICMD_ModeSense10();
               		BulkStausPhase=InCSWPhase;
               		break;
		default:
		    //if(offsetd == 1)
		        BeepFunc();
		    //offsetd ++;
			BulkStausPhase=InCSWPhase;
			break;
		}
	}

/*******************************************************************************************************************
**函数名称:USB_Bulk_Out()
**功能描述:处理断点2事务
**输    入: 无
**输    出: 无
*********************************************************************************************************************/
void USB_Bulk_Out(void)
{
    //uint16 i,j;
    /*if(WriteResidueVal == 0)
    {
    	BulkPhase = CommandPhase;
    }*/
    
	if (BulkPhase == CommandPhase)
	{	
		//BeepFunc ();
		//D13_LockDevice(0xAA37);
		//D13_ValidBuffer(0x03);
		Usb_BoCommand();
		//D13_ClearBuffer(0x03);
		//D13_GetEndpointStatusWInteruptClear(03);
	}  
	else if (BulkPhase == OutDataPhase)
		{
		        //temp = 0;
		        //WriteResidueVal=WriteResidueVal-64;
		        
		        //if(WriteResidueVal == 0)
			    //{
			    //	BulkPhase = CommandPhase;
			    //}
			    
		    	//D13_ValidBuffer(0x03);
		    	//offset += 64;
		    	//if(offset == 512)
		    	//{
			    	//offset = 0;
			    	offset += datalen;
			    	/*if(offset == 512)
			    	{
			    	    for(i = 0;i < 1;i++)
			    	    {
					    	FLSWR(512,i);
				    	}
				    	WriteResidueVal=WriteResidueVal-offset;
			    		offset = 0;
			    	}
			    	else if(offset == WriteResidueVal)
			    	{
			    		j = WriteResidueVal/512;
			    	    for(i = 0;i < j;i++)
			    	    {
					    	FLSWR(512,i);
				    	}
				    	WriteResidueVal=WriteResidueVal-offset;
			    		offset = 0;
			    	}*/
			    	if(offset == 512)
			    	{
			    		FLSWR(512,0);
				    	WriteResidueVal=WriteResidueVal-offset;
			    		offset = 0;			    		
			    	}
			    	//WriteResidueVal=WriteResidueVal-512;
		    	    //WriteResidueVal=WriteResidueVal-64;
		    	    //WriteResidueVal=WriteResidueVal-datalen;
			    	if(WriteResidueVal == 0)
				    {
				    	offset = 0;
				    	BulkPhase = CommandPhase;
				    }
			   // }
		    	//D13_ClearBuffer(0x03);
		    	
			   // offset = 0;
			    /*if(WriteResidueVal == 0)
			    {
			    	BulkPhase = CommandPhase;
			    }*/
			    
		    	//D13_GetEndpointStatusWInteruptClear(03);
		    	//D13_ClearBuffer(0x03);
		    
		}

}
/*******************************************************************************************************************
**函数名称:USB_Bulk_In()
**功能描述:处理断点2事务
**输    入: 无
**输    出: 无
*********************************************************************************************************************/
void USB_Bulk_In(void)
{

	if(BULKLength != 0)
		BULK_submit(BULKLength);
	else if(ReadResidueVal != 0)
		flashRead();
	else if(BulkStausPhase == InCSWPhase){
		offsetr = 0;
		ControlData.pData = setcsw;
		BULKLength = 13;
		BULK_submit(BULKLength);
        //BulkStausPhase =NonInCSWPhase;//自己加的  防止设备无休止的发送CSW
	}
	
	
	
	/*for (i = 0; i < 2; i++){
		status = (D13_GetEndpointStatusWOInteruptClear(endp) & 0x60);
		if (status == 0x60)  break;						//如果缓冲区全部都满,那么不可以再写入//if buffer is full,break
														
		len = pUsb->Max[pUsb->Prio] - pUsb->Cnt;
		if (len > 0){		   							//有空的缓冲区且等待发送字节数大于0  buffer is empty and len above zero
			if (len >= eppsize)			   				//写满缓冲区				  write an entire buffer
				len = D13_WriteEndpoint(endp,(INT8U)eppsize,pBuff + pUsb->Cnt); 
			else						   				//写len个字节				  write len length bytes into buffer
				len = D13_WriteEndpoint(endp,(INT8U)len,pBuff + pUsb->Cnt);  
			pUsb->Cnt = pUsb->Cnt + len;      			//发送计数器更新计数     	  counter is counting 
		}//end of if (len > 0)
	}//end of for()	*/

}




/************************************************************
**函数功能:PC输入数据处理
**函数输入参数及说明:无

**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无

**修改人:胡琦宗
**修改日期:2005.11.22
**修改说明:创建
*************************************************************/

/*void Usb_BoBulkInData(void)
{
   //BeepFunc();
    flashWrite();
    //BeepFunc();
	if(WriteResidueVal == 0)
	{
	    //BeepFunc();
	    offset = 0;
		BulkPhase = CommandPhase;
	}
}*/

/************************************************************
**函数功能:设置CSW包
**函数输入参数及说明:无


**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无

**修改人:胡琦宗
**修改日期:2005.11.22
**修改说明:创建
*************************************************************/
/*
void Usb_Set_Csw(void){
	Usb_Csw.dCSWSignature[0] = 0x55;
	Usb_Csw.dCSWSignature[1] = 0x53;
	Usb_Csw.dCSWSignature[2] = 0x42;
	Usb_Csw.dCSWSignature[3] = 0x53;
	Usb_Csw.dCSWTag[0] = ControlData.dataBuffer[4];
	Usb_Csw.dCSWTag[1] = ControlData.dataBuffer[5];
	Usb_Csw.dCSWTag[2] = ControlData.dataBuffer[6];
	Usb_Csw.dCSWTag[3] = ControlData.dataBuffer[7];
	Usb_Csw.bCSWStatus = 0;
}

*/
/*
void Usb_Set_Csw(void){
	ControlData.dataBuffer[0] = 0x55;
	ControlData.dataBuffer[1] = 0x53;
	ControlData.dataBuffer[2] = 0x42;
	ControlData.dataBuffer[3] = 0x53;
	ControlData.dataBuffer[8] = 0;
	ControlData.dataBuffer[9] = 0;
	ControlData.dataBuffer[10] = 0;
	ControlData.dataBuffer[11] = 0;
	
	ControlData.dataBuffer[12] = 0;
}

*/
void Usb_Set_Csw(void){
	setcsw[0] = 0x55;
	setcsw[1] = 0x53;
	setcsw[2] = 0x42;
	setcsw[3] = 0x53;

	setcsw[4] = ControlData.dataBuffer[4];
	setcsw[5] = ControlData.dataBuffer[5];
	setcsw[6] = ControlData.dataBuffer[6];
	setcsw[7] = ControlData.dataBuffer[7];

	setcsw[8] = 0;
	setcsw[9] = 0;
	setcsw[10] = 0;
	setcsw[11] = 0;
	
	setcsw[12] = 0;
}
/************************************************************
**函数功能:SCSI命令
**函数输入参数及说明:无


**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无

**修改人:胡琦宗
**修改日期:2005.11.22
**修改说明:创建
*************************************************************/




void SCSICMD_Inquiry(void)
{	
    //BeepFunc ();
    //D13_ClearBuffer(0x02);
    
    
	Usb_Set_Csw();

	ControlData.pData = SCSI_INQUIRY;
	BULKLength = 36;
	BULK_submit(BULKLength);

}


void SCSICMD_ReadFormatCapacities(void)
{
	
	//ControlData.dataBuffer[8] = (unsigned char)(dCBWDaTrLen-0x0c);
	//D13_ClearBuffer(0x02);
	Usb_Set_Csw();
	ControlData.pData = SCSIDATA_ReadFormatCapacities;
	BULKLength = 12;
	BULK_submit(BULKLength);
}

void SCSICMD_ReadCapacity(void)
{
	
	//D13_ClearBuffer(0x02);
	
	
	Usb_Set_Csw();  
 
	ControlData.pData = SCSIDATA_ReadCapacity;
	BULKLength = 8; 
	BULK_submit(BULKLength);
}

void SCSICMD_Read10(void)
{	
	//D13_ClearBuffer(0x02);
	
	
	Usb_Set_Csw(); 
	ControlData.pData = setcsw;
	//D13_ClearBuffer(0x02);
	flashReadcmd();
	flashRead();
}

void SCSICMD_TestUnitReady(void)
{

	
	//D13_ClearBuffer(0x02);
	
	
	Usb_Set_Csw();  

	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
	BulkStausPhase =NonInCSWPhase;//自己加的  防止设备无休止的发送CSW
}

void SCSICMD_RequestSense(void)
{
	
	//D13_ClearBuffer(0x02);
	
	
	Usb_Set_Csw();  

	ControlData.pData = SCSIDATA_RequestSense;
	BULKLength = 18;
	BULK_submit(BULKLength);
}

void SCSICMD_ModeSense06(void)
{
	
   // ControlData.dataBuffer[8]=(unsigned char)(dCBWDaTrLen-0x04);    
	
	//D13_ClearBuffer(0x02);
	
	Usb_Set_Csw();
	if(ControlData.dataBuffer[17]==0x1C)
	{
		ControlData.pData = SCSIDATA_Sense;
		BULKLength = 4;
	}
	else //if(ControlData.dataBuffer[17]==0x3F)
	{
		ControlData.pData = SCSIDATA_Sense + 4;
		if(ControlData.dataBuffer[19]==0x0C)
		        BULKLength = 12;
		else
				BULKLength = 36;
	}
	BULK_submit(BULKLength);
}

void SCSICMD_PreventAllowMediumRemoval(void)
{
	
	//D13_ClearBuffer(0x02);
	
	
	Usb_Set_Csw();  

	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
    BulkStausPhase =NonInCSWPhase;//自己加的  防止设备无休止的发送CSW

}

void SCSICMD_Write10(void)
{
    //BeepFunc ();
	
	//D13_ClearBuffer(0x02);
	
	Usb_Set_Csw();

	flashWritecmd();
	//BeepFunc ();
	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
	BulkStausPhase =NonInCSWPhase;//自己加的  防止设备无休止的发送CSW

}

void SCSICMD_Verify10(void)
{

	//D13_ClearBuffer(0x02);
	
	
	Usb_Set_Csw();

	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
	BulkStausPhase =NonInCSWPhase;//自己加的  防止设备无休止的发送CSW

}

void SCSICMD_ModeSense10(void)
{

	//D13_ClearBuffer(0x02);
	
	Usb_Set_Csw();

	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
	BulkStausPhase =NonInCSWPhase;//自己加的  防止设备无休止的发送CSW

}



⌨️ 快捷键说明

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