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

📄 usbin.c

📁 S3C2410 USB Mass storage 源码.
💻 C
字号:
/****************************************************************
 NAME: usbin.c
 DESC: usb bulk-IN operation
 HISTORY:
 Mar.25.2002:purnnamu: ported for S3C2410X.
 ****************************************************************/
#include <string.h>
#include "option.h"
#include "2410addr.h"
#include "2410lib.h"
#include "def.h"

#include "2410usb.h"
#include "usbmain.h"
#include "usb.h"
#include "usblib.h"
#include "usbsetup.h"
#include "usbin.h"


//static void PrintEpiPkt(U8 *pt,int cnt);


// ===================================================================
// All following commands will operate in case 
// - in_csr1 is valid.
// ===================================================================

#define SET_EP1_IN_PKT_READY()  rIN_CSR1_REG= ( in_csr1 &(~ EPI_WR_BITS)\
					| EPI_IN_PKT_READY ) //IN_CSR1_REG=0x01
#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) )


// ***************************
// *** VERY IMPORTANT NOTE ***
// ***************************
// Prepare the code for the packit size constraint!!!

// EP1 = IN end point. 


U8 ep1Buf[EP1_PKT_SIZE];
int transferIndex=0;
U8 CSW_Block[13];
extern U8 CBW_Block[31];
extern U8 TR_Flag;
extern U32 dCSWDataResidue;


void PrepareEp1Fifo(U8 *buf,int num) 
{
    int i;
    U8 in_csr1;
    rINDEX_REG=1;
    in_csr1=rIN_CSR1_REG;
    
    WrPktEp1(buf,num);//Write data (byte) to EP1 FIFO from ep1Buf[]
	if(num<EP1_PKT_SIZE) 
	{
   		SET_EP1_IN_PKT_READY();//IN_CSR1_REG=0x01
	}
	//while(rIN_CSR1_REG&EPI_IN_PKT_READY);
}


void Return_CSW(void)
{	
	int i;
    U8 in_csr1;
    rINDEX_REG=1;
    in_csr1=rIN_CSR1_REG;
	memset(CSW_Block,0,32);
    CSW_Block[0]=0x55;
    CSW_Block[1]=0x53;
    CSW_Block[2]=0x42;
    CSW_Block[3]=0x53;
	for(i=4;i<8;i++)
		CSW_Block[i]=CBW_Block[i];
	CSW_Block[8]=(U32)dCSWDataResidue;

    WrPktEp1((U8 *)&CSW_Block,13);
    SET_EP1_IN_PKT_READY();
	//while(rIN_CSR1_REG&EPI_IN_PKT_READY);	
    TR_Flag=0;
	return;

}



void Ep1Handler(void)
{
    U8 in_csr1;
//    int i;
    rINDEX_REG=1;
    in_csr1=rIN_CSR1_REG;
    
    //DbgPrintf("<1:%x]",in_csr1);

    //I think that EPI_SENT_STALL will not be set to 1.
    if(in_csr1 & EPI_SENT_STALL)
    {   
	   	//DbgPrintf("[STALL]");
	   	CLR_EP1_SENT_STALL();
   		return;
    }	

	if(TR_Flag==2)
	{
		read_10();
	}
	else if(TR_Flag==1)
	{
		//if((CBW_Block[15]==0x00)||(CBW_Block[15]==0x1e))
		//	Uart_Printf("......%x\n",CBW_Block[15]);
		Return_CSW(); 
	}
    return;
}

/*
void PrintEpiPkt(U8 *pt,int cnt)
{
    int i;
    DbgPrintf("[B_IN:%d:",cnt);
    for(i=0;i<cnt;i++)
    	DbgPrintf("%x,",pt[i]);
    DbgPrintf("]");
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -