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