📄 inouthandler.c
字号:
#include "Def.h"
#include "Uart.h"
#include "Nand.h"
#include "UsbAddr.h"
#include "UsbLib.h"
#include "UsbInit.h"
#include "IntHandler.h"
#include "InOutHandler.h"
#define SET_EP1_IN_PKT_READY() rIN_CSR1_REG= ( (in_csr1 &(~ EPI_WR_BITS))| EPI_IN_PKT_READY )
#define SET_EP1_SEND_STALL() rIN_CSR1_REG= ( (in_csr1 & (~EPI_WR_BITS))| EPI_SEND_STALL)
#define CLR_EP1_SENT_STALL() rIN_CSR1_REG= ( (in_csr1 & (~EPI_WR_BITS))&(~EPI_SENT_STALL) )
#define FLUSH_EP1_FIFO() rIN_CSR1_REG= ( (in_csr1 & (~EPI_WR_BITS))| EPI_FIFO_FLUSH)
#define CLR_EP3_OUT_PKT_READY() rOUT_CSR1_REG= ( out_csr3 & (~EPO_WR_BITS)&(~EPO_OUT_PKT_READY) )
#define SET_EP3_SEND_STALL() rOUT_CSR1_REG= ( out_csr3 & (~EPO_WR_BITS)| EPO_SEND_STALL)
#define CLR_EP3_SENT_STALL() rOUT_CSR1_REG= ( out_csr3 & (~EPO_WR_BITS)&(~EPO_SENT_STALL) )
#define FLUSH_EP3_FIFO() rOUT_CSR1_REG= ( out_csr3 & (~EPO_WR_BITS)|EPO_FIFO_FLUSH)
extern volatile int iEpInState;
extern volatile int iEpOutState;
static unsigned char bulk_CBW_CBWCB[12]={0};
static unsigned char bulk_CSW[]={
0x55,0x53,0x42,0x53, //bytes 4 dCSWSignature
0x00,0x00,0x00,0x00, //bytes 4 dCSWTag
0x00,0x00,0x00,0x00, //bytes 4 dDataResiduce
0x00}; //bCSWStatus 00=good state.
static unsigned char B_InquiryData[] = {
0x00, //Direct Access Device
0x80, //RMB
0x00, //ISO/ECMA/ANSI
0x01, //Response Data Format
0x1f, //Additional Length
0x00, //Reserved
0x00, //Reserved
0x00, //Reserved
's', '3', 'c', '2', '4', '1', '0', ' ', //Vendor Information
'U', 'S', 'B', '-', 'M', 'a', 's', 's', 'S', 't', 'o', 'r', 'a', 'g', 'e', ' ',//Product Identification
0, 0, 0, 0
};
//SCSI-Read_Format_capacities命令的返回数据
static unsigned char B_Read_Format_capacities[] = {
0x00, 0x00, 0x00, 0x08, //capacity list header
0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x02, 0x00, //capacity descriptor
//Number of Blocks =4096,unformatted media,blocklength = 512Bytes 2M
};
//SCSI-Read_Capacity命令的返回数据
static unsigned char B_Read_Capacity[] = {
0x00, 0x00, 0x10, 0x00, //Last Logical Block Address for 2MB
0x00, 0x00, 0x02, 0x00 //block length in bytes
};
//SCSI-Mode_Sense命令的返回数据
static unsigned char B_Mode_Sense_ALL[] = {
0x0b, 0x00, //Mode Data Length
0x00, 0x08, 0x00, 0x00,
0x7d, 0, 0, 0, 0x02, 0x00
};
//SCSI-Mode_Sense命令的返回数据
static unsigned char B_Mode_Sense_TPP[] = {
0xf0, 0x00, //Mode Data Length
05, 00, 00, 00, 00, 0x0b, 00, 00, 00, 00, 0x24, 00, 00, 00, 00, 00
};
//SCSI-Mode_Sense命令的返回数据
static unsigned char B_Mode_Sense_ZERO[] = {
0x00, 0x06, //Mode Data Length
0x00, //Medium Type Code
0, //write enabled
0, 0, 0, 0 //reserved
};
void InOutHandler(void)
{
U8 ep3Buf[EP3_PKT_SIZE];
RdPktEp3(ep3Buf,EP3_PKT_SIZE);
PrintEpOutPkt(ep3Buf,EP3_PKT_SIZE);
bulk_CSW[4]=ep3Buf[4];
bulk_CSW[5]=ep3Buf[5];
bulk_CSW[6]=ep3Buf[6];
bulk_CSW[7]=ep3Buf[7];
int i;
for(i=0;i<12;i++)
{
bulk_CBW_CBWCB[i] = ep3Buf[15+i];
}
switch(bulk_CBW_CBWCB[0])
{
case Inquiry :
UartPrintf("Inquiry ack .............\r\n");
WrPktEp1(B_InquiryData,36);
WrPktEp1(bulk_CSW,13);
break;
case Read_Format_Capacities :
UartPrintf("B_Read_Format_capacities ack .............\r\n");
WrPktEp1(B_Read_Format_capacities,20);
WrPktEp1(bulk_CSW,13);
break;
case Read_Capacity :
UartPrintf("B_Read_Capacity ack .............\r\n");
WrPktEp1(B_Read_Capacity,8);
WrPktEp1(bulk_CSW,13);
break;
case Read10 :
UartPrintf("Read10 .............\r\n");
SCSI_Read10();
WrPktEp1(bulk_CSW,13);
break;
case Mode_Sense :
UartPrintf("Mode_Sense.............\r\n");
SCSI_Mode_Sense();
WrPktEp1(bulk_CSW,13);
break;
case Test_Unit_Ready :
UartPrintf("Test_Unit_Ready ack .............\r\n");
WrPktEp1(bulk_CSW,13);
break;
case Medium_Removal :
UartPrintf("Medium_Removal ack .............\r\n");
WrPktEp1(bulk_CSW,13);
break;
case Verify :
printk("Verify ack ................\r\n");
WrPktEp1(bulk_CSW,13);
break;
case Write10 :
printk("Write10 ack ..............................................\r\n");
SCSI_Write10();
WrPktEp1(bulk_CSW,13);
break;
default :
printk("Other SCSI..........................................................\r\n");
break;
}
}
void WrPktEp1(U8 *buf,int num) //写入管道
{
int i;
U8 in_csr1;
rINDEX_REG=1;
in_csr1=rIN_CSR1_REG;
while(iEpInState==0)
; //直到为1才写
FLUSH_EP1_FIFO();
for(i=0;i<num;i++)
{
rEP1_FIFO=buf[i];
}
iEpInState=0;
SET_EP1_IN_PKT_READY();
}//WrPktEp1()
void PrintEpiPkt(U8 *pt,int cnt) //打印包
{
int i;
UartPrintf("[B_IN:%d:",cnt);
for(i=0;i<cnt;i++)
UartPrintf("%x,",pt[i]);
UartPrintf("]");
}
void RdPktEp3(U8 *buf,int num)
{
int i;
U8 out_csr3;
rINDEX_REG=3;
while(iEpOutState==0)
; //直到为1才读
out_csr3=rOUT_CSR1_REG;
for(i=0;i<num;i++)
{
buf[i]=(U8)rEP3_FIFO;
}
iEpOutState=0;
CLR_EP3_OUT_PKT_READY();
}
void SCSI_Mode_Sense()
{
if(bulk_CBW_CBWCB[2] == SCSI_MSPGCD_TPP) //Page Code=Timer and Potect Page
WrPktEp1( B_Mode_Sense_TPP,18);
else if(bulk_CBW_CBWCB[2] == SCSI_MSPGCD_RETALL) //Page Code=All
WrPktEp1( B_Mode_Sense_ALL,12);
else
WrPktEp1( B_Mode_Sense_ZERO,8);
}
void SCSI_Read10()
{
unsigned int Addr = 0;
unsigned short int length = 0;
unsigned int block = Off_Block;
unsigned int page = 0;
unsigned char buffer[512]={0};
//读操作的起始地址
Addr = (bulk_CBW_CBWCB[2]<<24)|(bulk_CBW_CBWCB[3]<<16)|(bulk_CBW_CBWCB[4]<<8)|(bulk_CBW_CBWCB[5]<<0);
//读操作的扇区长度
length = (bulk_CBW_CBWCB[7]<<8)|(bulk_CBW_CBWCB[8]<<0);
block = block +(Addr/32);
page = page + (Addr%32);
while(length>0)
{
NF_ReadPage( block, page, buffer);
int i;
for(i=0;i<8;i++){
WrPktEp1(buffer+i*64,64);
//printk("i=%d",i);
}
//printk("\r\n");
length--;
page++;
if(page == 32)
{
block++;
page = 0;
}
}
}
void SCSI_Write10()
{
unsigned int Addr = 0;
unsigned short int length = 0;
unsigned int block = Off_Block;
unsigned int page = 0;
unsigned char buffer[512]={0};
//读操作的起始地址
Addr = (bulk_CBW_CBWCB[2]<<24)|(bulk_CBW_CBWCB[3]<<16)|(bulk_CBW_CBWCB[4]<<8)|(bulk_CBW_CBWCB[5]<<0);
//读操作的扇区长度
length = (bulk_CBW_CBWCB[7]<<8)|(bulk_CBW_CBWCB[8]<<0);
block = block +(Addr/32);
page = page + (Addr%32);
while(length>0)
{
int i;
for(i=0;i<8;i++){
RdPktEp3(buffer+i*64,64);
//printk("i=%d",i);
}
//printk("\r\n");
NF_WritePage( block, page, buffer);
length--;
page++;
if(page == 32)
{
block++;
page = 0;
}
}
}
void PrintEpOutPkt(U8 *pt,int cnt)
{
printk("BOUT:\t");
int i;
for(i=0;i<cnt;i++)
{
UartPrintf("%x ",pt[i]);
if(i==31)
printk("\r\n\t");
}
printk("\r\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -