⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inouthandler.c

📁 将s3c2410作为usb设备
💻 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 + -