www.pudn.com > h2410系列usb驱动.zip > usbout.c


/**************************************************************** 
 NAME: usbout.c 
 DESC: USB bulk-OUT operation related functions 
 HISTORY: 
 Mar.25.2002:purnnamu: ported for S3C2410X. 
 Mar.27.2002:purnnamu: DMA is enabled. 
 ****************************************************************/ 
  
#include  
#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 "usbout.h" 
 
#include "u241mon.h" 
 
 
static void PrintEpoPkt(U8 *pt,int cnt); 
static void RdPktEp3_CheckSum(U8 *buf,int num); 
 
 
 
// =================================================================== 
// All following commands will operate in case  
// - out_csr3 is valid. 
// =================================================================== 
 
  
 
#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) ) 
 
// *************************** 
// *** VERY IMPORTANT NOTE *** 
// *************************** 
// Prepare for the packit size constraint!!! 
 
// EP3 = OUT end point.  
 
U8 ep3Buf[EP3_PKT_SIZE]; 
static U8 tempBuf[64+1]; 
 
void Ep3Handler(void) 
{ 
    U8 out_csr3; 
    int fifoCnt; 
    rINDEX_REG=3; 
 
    out_csr3=rOUT_CSR1_REG; 
     
    DbgPrintf("<3:%x]",out_csr3); 
 
    if(out_csr3 & EPO_OUT_PKT_READY) 
    {    
	fifoCnt=rOUT_FIFO_CNT1_REG;  
#if 0 
	RdPktEp3(ep3Buf,fifoCnt); 
	PrintEpoPkt(ep3Buf,fifoCnt); 
#else 
 
	if(downloadFileSize==0) 
	{ 
   	    RdPktEp3((U8 *)downPt,8); 	 
   	     
   	    if(download_run==0) 
   	    { 
		downloadAddress=tempDownloadAddress; 
	    } 
	    else 
	    { 
	    	downloadAddress= 
	    		*((U8 *)(downPt+0))+ 
			(*((U8 *)(downPt+1))<<8)+ 
			(*((U8 *)(downPt+2))<<16)+ 
			(*((U8 *)(downPt+3))<<24); 
	    } 
	    downloadFileSize= 
	    	*((U8 *)(downPt+4))+ 
		(*((U8 *)(downPt+5))<<8)+ 
		(*((U8 *)(downPt+6))<<16)+ 
		(*((U8 *)(downPt+7))<<24); 
	    checkSum=0; 
	    downPt=(U8 *)downloadAddress; 
 
  	    RdPktEp3_CheckSum((U8 *)downPt,fifoCnt-8); //The first 8-bytes are deleted.	     
  	    downPt+=fifoCnt-8;   
  	     
  	#if USBDMA 
     	    //CLR_EP3_OUT_PKT_READY() is not executed.  
     	    //So, USBD may generate NAK until DMA2 is configured for USB_EP3; 
     	    rINTMSK|=BIT_USBD; //for debug 
      	    return;	 
  	#endif	 
	} 
	else 
	{ 
	#if USBDMA    	 
	    Uart_Printf(""); 
	#endif     
	    RdPktEp3_CheckSum((U8 *)downPt,fifoCnt); 	     
	    downPt+=fifoCnt;  //fifoCnt=64 
	} 
#endif 
   	CLR_EP3_OUT_PKT_READY(); 
	return; 
    } 
 
     
    //I think that EPO_SENT_STALL will not be set to 1. 
    if(out_csr3 & EPO_SENT_STALL) 
    {    
   	DbgPrintf("[STALL]"); 
   	CLR_EP3_SENT_STALL(); 
   	return; 
    }	 
} 
 
 
 
void PrintEpoPkt(U8 *pt,int cnt) 
{ 
    int i; 
    DbgPrintf("[BOUT:%d:",cnt); 
    for(i=0;i=downloadFileSize)// is last? 
    { 
    	totalDmaCount=downloadFileSize; 
	 
    	ConfigEp3IntMode();	 
 
    	if(out_csr3& EPO_OUT_PKT_READY) 
    	{ 
   	    CLR_EP3_OUT_PKT_READY(); 
	} 
        rINTMSK|=BIT_DMA2;   
        rINTMSK&=~(BIT_USBD);   
    } 
    else 
    { 
    	if((totalDmaCount+0x80000)