?? 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 + -