📄 scsi.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 + -