📄 scsi.c
字号:
/*++
Module Name:
Scsi.c
Abstract:
Header file related to D12 module
Environment:
ICCAVR 6.29
Revision History:
04/23/2004 chenchi created
--*/
/******************************************************************/
#include <macros.h>
#include "d12.h"
#include "scsi.h"
#include "scsi_data.h"
#include "nflash32.h"
unsigned char BulkPhase = 0;
unsigned char BulkStausPhase;
unsigned int dCBWDaTrLen;
unsigned char * WritePageBuff = "";
unsigned int WritePageBuffLen = 0;
CSW_STRUCT Usb_Csw;
CBW_STRUCT Usb_Cbw;
/************************************************************
**工程名称:U盘固件程序开发
**编译器类型及版本:ICCAVR 6.29
**日期:2004.4.30
**创建人:陈驰
**所属单位:湖南大学计算机与通信学院
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**时钟频率:8MHZ
**函数功能:处理PC发送的批量传输包
**函数输入参数及说明:接收数据长度
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
**修改人:陈驰
**修改日期:2004.4.30
**修改说明:创建
*************************************************************/
void Bulk_Out_Packet(unsigned char len){
unsigned char i,j,*p;
unsigned char Buff[64];
if(BulkPhase == CommandPhase){
j = D12_DATA;
csram;
p = XmtBuff.b;
*(p++) = j;
for(i=0;i<len;i++)
{
j = D12_DATA;
csram;
asm("st Z+,%j");
}
Usb_BoCommand();
}
else if(BulkPhase == OutDataPhase){
j = D12_DATA;
csram;
p = Buff;
*(p++) = j;
for(i=0;i<len;i++)
{
j = D12_DATA;
csram;
asm("st Z+,%j");
}
for(i=0;i<len;i++){
WritePageBuff[WritePageBuffLen+i] = Buff[i];
}
WritePageBuffLen += len;
if(WritePageBuffLen == 512){
Usb_BoBulkInData();
WritePageBuffLen = 0;
}
}
D12_COMMAND = 0x04;//选择端点(指针指向0位置)
cwait;
D12_COMMAND = 0xf1;
cwait;
D12_COMMAND = 0xf2;//清端点缓冲区
}
/************************************************************
**工程名称:U盘固件程序开发
**编译器类型及版本:ICCAVR 6.29
**日期:2004.4.30
**创建人:陈驰
**所属单位:湖南大学计算机与通信学院
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**时钟频率:8MHZ
**函数功能:SCSI命令处理
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
**修改人:陈驰
**修改日期:2004.4.30
**修改说明:创建
*************************************************************/
void Usb_BoCommand(void){
XmtBuff.p_p=1;
dCBWDaTrLen=((XmtBuff.b[11]<<8)+(XmtBuff.b[10]))<<15;
dCBWDaTrLen=(dCBWDaTrLen<<1)+((XmtBuff.b[9]<<8)+(XmtBuff.b[8])) ;
Usb_Cbw.CBWCB[0] = XmtBuff.b[15];
switch(Usb_Cbw.CBWCB[0]){
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;
}
}
/************************************************************
**工程名称:U盘固件程序开发
**编译器类型及版本:ICCAVR 6.29
**日期:2004.4.30
**创建人:陈驰
**所属单位:湖南大学计算机与通信学院
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**时钟频率:8MHZ
**函数功能:PC输入数据处理
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
**修改人:陈驰
**修改日期:2004.4.30
**修改说明:创建
*************************************************************/
void Usb_BoBulkInData(void){
flashWrite(WritePageBuff);
if(WriteResidueVal == 0){
BulkPhase = CommandPhase;
}
}
/************************************************************
**工程名称:U盘固件程序开发
**编译器类型及版本:ICCAVR 6.29
**日期:2004.4.30
**创建人:陈驰
**所属单位:湖南大学计算机与通信学院
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**时钟频率:8MHZ
**函数功能:回应批量传输包
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
**修改人:陈驰
**修改日期:2004.4.30
**修改说明:创建
*************************************************************/
void Bulk_In_Packet(void){
if(XmtBuff.wrLength != 0)
BULK_submit();
else if(ReadResidueVal != 0)
flashRead();
else if(BulkStausPhase == InCSWPhase){
XmtBuff.p_p=0;
XmtBuff.p = (unsigned char *)&Usb_Csw;
XmtBuff.wrLength = 13;
BULK_submit();
}
}
/************************************************************
**工程名称:U盘固件程序开发
**编译器类型及版本:ICCAVR 6.29
**日期:2004.4.30
**创建人:陈驰
**所属单位:湖南大学计算机与通信学院
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**时钟频率:8MHZ
**函数功能:SCSI命令
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
**修改人:陈驰
**修改日期:2004.4.30
**修改说明:创建
*************************************************************/
void SCSICMD_Inquiry(void){
Usb_Set_Csw();
Usb_Csw.dCSWDataResidue[1] = 0;
Usb_Csw.dCSWDataResidue[2] = 0;
Usb_Csw.dCSWDataResidue[3] = 0;
Usb_Csw.dCSWDataResidue[4] = 0;
XmtBuff.pp = SCSI_INQUIRY;
XmtBuff.wrLength = 36;
BULK_submit();
}
/************************************************************
**工程名称:U盘固件程序开发
**编译器类型及版本:ICCAVR 6.29
**日期:2004.4.30
**创建人:陈驰
**所属单位:湖南大学计算机与通信学院
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**时钟频率:8MHZ
**函数功能:创建CSW数据块
**函数输入参数及说明:无
**函数返回值:无
**在本函数以外定义的变量:
**调用的函数说明:无
**修改人:陈驰
**修改日期:2004.4.30
**修改说明:创建
*************************************************************/
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] = XmtBuff.b[4];
Usb_Csw.dCSWTag[1] = XmtBuff.b[5];
Usb_Csw.dCSWTag[2] = XmtBuff.b[6];
Usb_Csw.dCSWTag[3] = XmtBuff.b[7];
Usb_Csw.bCSWStatus = 0;
}
/************************************************************
**工程名称:U盘固件程序开发
**编译器类型及版本:ICCAVR 6.29
**日期:2004.4.30
**创建人:陈驰
**所属单位:湖南大学计算机与通信学院
**芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**时钟频率:8MHZ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -