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

📄 scsi.c

📁 D12和89s52+K9F5608组成的系统
💻 C
字号:
#include "reg52.h"
#include "d12config.h"
#include "D12CI.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 idata setcsw[13];
//unsigned char CommandPhase = 1
//unsigned char xdata WritePageBuff[512];

/***********************************************************
SCSI命令回复代码
***********************************************************/
code INT8U SCSI_INQUIRY[36]=
{
 0x00,
 0x80,
 0x00,
 0x01,
 
 0x1f,
 
 0x00, //reserved
 0x00, //reserved
 0x00, //reserved
 
 0x20,
 0x20,  // // 10
 0x20, //
 0x20, //
 0x20,
 0x20, //
 0x20, //
 0x20, //
 
 0x51, //Q
 0x75,  //u
 0x62, //b
 0x65, //e
 0x6C,  //l
 0x65, //e
 0x79, //3//
 0x20, //
 0x41,//
 0x56,  //
 0x52, //
 0x20, //
 0x44,
 0x49,         //30
 0x53, //
 0x4b, //
 
 0x31, //ascII   "1"
 0x2e,     //    "."
 0x30,  //       "0"
 0x30  //        "0"  //version : 1.00
 };//

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

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

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

unsigned char code SCSIDATA_Sense[48]=
{
   0x03,
   0x00,
   0x00,
   0x00,
  /* 
   0x00,
   0x00,
   0x00,
   0x00,   
   0x00,
   0x00,
   0x02,
   0x00,
   */
   0x01,
   0x0a,
   0x00,
   0x10,   
   0x00,
   0x00,
   0x00,
   0x00,   
   0x02,
   0x00,
   0x00,
   0x00, //page 1  
   0x05,//page 2
   0x1e,
   0x0f,
   0xa0,   
   0x04,
   0x10,
   0x02,
   0x00,   
   0x00,
   0xfa,
   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;
	D12_WriteEndpoint(5, i,ControlData.pData);
	ControlData.pData += i;
	BULKLength -= i;
}

/************************************************************
**函数功能:处理PC发送的批量传输包
**函数输入参数及说明:接收数据长度

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

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

void Bulk_Out_Packet()
{	
	
	if (BulkPhase == CommandPhase)
	{	
		Usb_BoCommand();	
	}  
	else if (BulkPhase == OutDataPhase)
		{
			Usb_BoBulkInData();
		}
	
}



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


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

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

void Usb_BoCommand(void){
		dCBWDaTrLen = (ControlData.pData[8]<<8 + ControlData.pData[9]);
		
		switch (ControlData.dataBuffer[15])
		{
		case 0x00:
			SCSICMD_TestUnitReady();
					BulkStausPhase = InCSWPhase;
					break;
		case 0x03:
			SCSICMD_RequestSense();
           			 BulkStausPhase=InCSWPhase;
           			 break;
		case 0x12:
		
			SCSICMD_Inquiry();
					BulkStausPhase = InCSWPhase;
					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:
			SCSICMD_Write10();
               		BulkPhase =OutDataPhase;
               		break;
		case 0x2f:
			SCSICMD_Verify10();
               		BulkStausPhase=InCSWPhase;
               		break;
		case 0x5a:
			SCSICMD_ModeSense10();
               		BulkStausPhase=InCSWPhase;
               		break;
		default:
			BulkStausPhase=InCSWPhase;
			break;
		}
	}




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

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

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

void Usb_BoBulkInData(void)
{
   flashWrite();
	if(WriteResidueVal == 0)
	{
		BulkPhase = CommandPhase;
	}
}
		

/************************************************************
**函数功能:回应批量传输包
**函数输入参数及说明:无


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

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

void Bulk_In_Packet(void)
{
	if(BULKLength != 0)
		BULK_submit(BULKLength);
	else if(ReadResidueVal != 0)
		flashRead();
	else if(BulkStausPhase == InCSWPhase){
		ControlData.pData = setcsw;
		BULKLength = 13;
		BULK_submit(BULKLength);
	}
}


/************************************************************
**函数功能:设置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)
{	
	Usb_Set_Csw();

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

}


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

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

void SCSICMD_Read10(void)
{	
	Usb_Set_Csw(); 
	ControlData.pData = setcsw;
	flashReadcmd();
	flashRead();
}

void SCSICMD_TestUnitReady(void)
{

	Usb_Set_Csw();  

	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
}

void SCSICMD_RequestSense(void)
{
	Usb_Set_Csw();  

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

void SCSICMD_ModeSense06(void)
{
	
    ControlData.dataBuffer[8]=(unsigned char)(dCBWDaTrLen-0x04);    
	Usb_Set_Csw();
	ControlData.pData = SCSIDATA_Sense;
	BULKLength = 4;
	BULK_submit(BULKLength);
}

void SCSICMD_PreventAllowMediumRemoval(void)
{
	
	Usb_Set_Csw();  

	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
}

void SCSICMD_Write10(void)
{

	Usb_Set_Csw();

	flashWritecmd();
	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
}

void SCSICMD_Verify10(void)
{

	Usb_Set_Csw();

	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
}

void SCSICMD_ModeSense10(void)
{

	Usb_Set_Csw();

	ControlData.pData = setcsw;
	BULKLength = 13;
	BULK_submit(BULKLength);
}



⌨️ 快捷键说明

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