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

📄 usbdown.c

📁 s3c24a0固件测试代码 ? ? ? ? ?啊 
💻 C
字号:
/****************************************************************
 NAME: u24amon.c
 DESC: u24amon entry point,menu,download
 HISTORY:
 
 ****************************************************************/

#include <stdlib.h>
#include <string.h>
#include "..\include\def.h"
#include "..\include\option.h"
#include "..\include\24a0addr.h"
#include "..\include\24a0lib.h"
#include "..\include\24a0slib.h"
#include "..\include\mmu.h"
#include "..\include\profile.h"
//#include "memtest.h"

#include "..\include\usbmain.h"
#include "..\include\usbout.h"
#include "..\include\usblib.h"
#include "..\include\24a0usb.h"


void WaitDownload(void);
void MPEG_WaitDownload(void);

void Menu(void);
void Isr_Init1(void);

volatile U32 downloadAddress_u;
volatile unsigned char *downPt;
volatile U32 downloadFileSize;
volatile U16 checkSum;
volatile unsigned int err=0;
volatile U32 totalDmaCount;

volatile int isUsbdSetConfiguration;

int download_run=0;
int download_end;
U32 tempdownloadAddress;
int menuUsed=0;



//    UsbdMain(); 

void USB_Download(void)
{  
     Isr_Init1();

    rINTMSK&=~(BIT_USBD);  
	
     download_end=0;
     //Uart_Printf(" USB download.\n"); 
     while(1)
	 {
		WaitDownload();
		if(download_end==1) break;
	 }
     rINTMSK |= (BIT_USBD);
}


//    for MPEG4
void MPEG_Download(void)
{  
     Isr_Init1();

    rINTMSK&=~(BIT_USBD);  
	
     download_end=0;
     Uart_Printf("/----MPEG raw data download.----/\n"); 
     while(1)
	 {
		MPEG_WaitDownload();
		if(download_end==1) break;
	 }
     rINTMSK |= (BIT_USBD);
}
 
void MPEG_WaitDownload(void)
{
    U32 i;
    U32 j;
    U16 cs;
    U32 temp;
    U16 dnCS;
    int first=1;
    float time;
    U8 tempMem[16];
    U8 key;
    
    checkSum=0;
    downloadAddress_u=(U32)tempMem; //_RAM_STARTADDRESS; 
    downPt=(unsigned char *)downloadAddress_u;
	//This address is used for receiving first 8 byte.
    downloadFileSize=0;
    

    /*******************************/
    /*    Test program download    */
    /*******************************/
    j=0;
     
   
   //Uart_Printf("Enter a new temporary download address(0x12000100):");
   //tempdownloadAddress=Uart_GetIntNum();
   tempdownloadAddress=0x12000100;
   download_run=0;
   //Uart_Printf("The temporary download address is 0x%x.\n\n",tempdownloadAddress);
   Uart_Printf("Download file ./bmp/mobile_20frame_3Qp.cif using the TRANSMIT of USB port\n"); 
   Uart_Printf("Wait for download!\n");
    while(downloadFileSize==0)
    {
             
	if(j%0x50000==0)Led_Display(0x6);
	if(j%0x50000==0x28000)Led_Display(0x9);
	j++;
    }
    //Uart_Printf(" download address: 0x%x, download file size: 0x%x\n\n",downloadAddress_u, downloadFileSize);
    Timer_InitEx();      
    Timer_StartEx();  

#if USBDMA    

    rINTMSK&=~(BIT_DMA);
    rINTSUBMSK&=~(BIT_SUB_DMA2);

    ClearEp3OutPktReady(); 
    	// indicate the first packit is processed.
    	// has been delayed for DMA2 cofiguration.
   
    
    if(downloadFileSize>EP3_PKT_SIZE)
    {
        if(downloadFileSize<=(0x80000))
        {
      	    ConfigEp3DmaMode(downloadAddress_u+EP3_PKT_SIZE-8,downloadFileSize-EP3_PKT_SIZE);	
  	    //wait until DMA reload occurs.
	    while((rDSTAT2&0xfffff)==0);

      	    //will not be used.
       	    rDIDST2=(downloadAddress_u+downloadFileSize-EP3_PKT_SIZE);  
       	    rDIDSTC2=(0<<1)|(0<<0);  
	    rDCON2=rDCON2&~(0xfffff)|(0);        	    
	}
      	else
      	{
      	    ConfigEp3DmaMode(downloadAddress_u+EP3_PKT_SIZE-8,0x80000-EP3_PKT_SIZE);
  	    //wait until DMA reload occurs.
	    while((rDSTAT2&0xfffff)==0);
      	    
    	    if(downloadFileSize>(0x80000*2))//for 1st autoreload
    	    {
        	rDIDST2=(downloadAddress_u+0x80000-8);  //for 1st autoreload.
        	rDIDSTC2=(0<<1)|(0<<0);  
    	       rDCON2=rDCON2&~(0xfffff)|(0x80000);        	  

  		while(rEP3_DMA_TTC<0xfffff)
  		{
  		    rEP3_DMA_TTC_L=0xff; 
  		    rEP3_DMA_TTC_M=0xff;
  		    rEP3_DMA_TTC_H=0xf;
  		}
    	    }	
 	    else
 	    {
 	        rDIDST2=(downloadAddress_u+0x80000-8);  //for 1st autoreload.
      	        rDIDSTC2=(0<<1)|(0<<0);  
 	        rDCON2=rDCON2&~(0xfffff)|(downloadFileSize-0x80000); 		

  		while(rEP3_DMA_TTC<0xfffff)
  		{
  		    rEP3_DMA_TTC_L=0xff; 
  		    rEP3_DMA_TTC_M=0xff;
  		    rEP3_DMA_TTC_H=0xf;
  		}
	    }
	}
 	totalDmaCount=0;
    }
    else
    {
	totalDmaCount=downloadFileSize;
    }
#endif

    //Uart_Printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n",
    //		downloadAddress_u,downloadFileSize);
    //Uart_Printf("RECEIVED FILE SIZE:%8d",0);

#if USBDMA    
    j=0x10000;

    while(1)
    {
    	if( (rDCDST2-(U32)downloadAddress_u+8)>=j)
	{
	    Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
   	    j+=0x10000;
	}
	if(totalDmaCount>=downloadFileSize)break;
    }

#else
    j=0x10000;

    while(((U32)downPt-downloadAddress_u)<(downloadFileSize-8))
    {
	if( ((U32)downPt-downloadAddress_u)>=j)
	{
	    Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
   	    j+=0x10000;
	}
    }
#endif
  

    time=Timer_StopEx();
    Uart_Printf("\b\b\b\b\b\b\b\b%8d",downloadFileSize);	
    Uart_Printf("(%5.1fKB/S,%3.1fS)\n",(float)(downloadFileSize/time/1000.),time);
    
#if USBDMA    
    /*******************************/
    /*     Verify check sum        */
    /*******************************/

    Uart_Printf("Now, Checksum calculation\n");

    cs=0;    
    i=(downloadAddress_u);
    j=(downloadAddress_u+downloadFileSize-10)&0xfffffffc;
    while(i<j)
    {
    	temp=*((U32 *)i);
    	i+=4;
    	cs+=(U16)(temp&0xff);
    	cs+=(U16)((temp&0xff00)>>8);
    	cs+=(U16)((temp&0xff0000)>>16);
    	cs+=(U16)((temp&0xff000000)>>24);
    }

    i=(downloadAddress_u+downloadFileSize-10)&0xfffffffc;
    j=(downloadAddress_u+downloadFileSize-10);
    while(i<j)
    {
  	cs+=*((U8 *)i++);
    }
    
    checkSum=cs;
#else
    //checkSum was calculated including dnCS. So, dnCS should be subtracted.
    checkSum=checkSum - *((unsigned char *)(downloadAddress_u+downloadFileSize-8-2))
	     - *( (unsigned char *)(downloadAddress_u+downloadFileSize-8-1) );	
#endif	  

    dnCS=*((unsigned char *)(downloadAddress_u+downloadFileSize-8-2))+
	(*( (unsigned char *)(downloadAddress_u+downloadFileSize-8-1) )<<8);

    download_end=1;
    if(checkSum!=dnCS)
    {
	Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
	return;
    }

    Uart_Printf("Download O.K.\n\n");
//    Uart_TxEmpty(consoleNum);

    
    
}

 
void WaitDownload(void)
{
    U32 i;
    U32 j;
    U16 cs;
    U32 temp;
    U16 dnCS;
    int first=1;
    float time;
    U8 tempMem[16];
    U8 key;
    
    checkSum=0;
    downloadAddress_u=(U32)tempMem; //_RAM_STARTADDRESS; 
    downPt=(unsigned char *)downloadAddress_u;
	//This address is used for receiving first 8 byte.
    downloadFileSize=0;
    

    /*******************************/
    /*    Test program download    */
    /*******************************/
    j=0;
     
   
   Uart_Printf("Enter a new temporary download address(0x1...):");
   tempdownloadAddress=Uart_GetIntNum();
   download_run=0;
   //Uart_Printf("The temporary download address is 0x%x.\n\n",tempdownloadAddress);
    Uart_Printf(" Waiting a download.\n"); 
    while(downloadFileSize==0)
    {
             
	if(j%0x50000==0)Led_Display(0x6);
	if(j%0x50000==0x28000)Led_Display(0x9);
	j++;
    }
    Uart_Printf(" download address: 0x%x, download file size: 0x%x\n\n",downloadAddress_u, downloadFileSize-0x0a);
    Timer_InitEx();      
    Timer_StartEx();  

#if USBDMA    

    rINTMSK&=~(BIT_DMA);
    rINTSUBMSK&=~(BIT_SUB_DMA2);

    ClearEp3OutPktReady(); 
    	// indicate the first packit is processed.
    	// has been delayed for DMA2 cofiguration.
   
    
    if(downloadFileSize>EP3_PKT_SIZE)
    {
        if(downloadFileSize<=(0x80000))
        {
      	    ConfigEp3DmaMode(downloadAddress_u+EP3_PKT_SIZE-8,downloadFileSize-EP3_PKT_SIZE);	
  	    //wait until DMA reload occurs.
	    while((rDSTAT2&0xfffff)==0);

      	    //will not be used.
       	    rDIDST2=(downloadAddress_u+downloadFileSize-EP3_PKT_SIZE);  
       	    rDIDSTC2=(0<<1)|(0<<0);  
	    rDCON2=rDCON2&~(0xfffff)|(0);        	    
	}
      	else
      	{
      	    ConfigEp3DmaMode(downloadAddress_u+EP3_PKT_SIZE-8,0x80000-EP3_PKT_SIZE);
  	    //wait until DMA reload occurs.
	    while((rDSTAT2&0xfffff)==0);
      	    
    	    if(downloadFileSize>(0x80000*2))//for 1st autoreload
    	    {
        	rDIDST2=(downloadAddress_u+0x80000-8);  //for 1st autoreload.
        	rDIDSTC2=(0<<1)|(0<<0);  
    	       rDCON2=rDCON2&~(0xfffff)|(0x80000);        	  

  		while(rEP3_DMA_TTC<0xfffff)
  		{
  		    rEP3_DMA_TTC_L=0xff; 
  		    rEP3_DMA_TTC_M=0xff;
  		    rEP3_DMA_TTC_H=0xf;
  		}
    	    }	
 	    else
 	    {
 	        rDIDST2=(downloadAddress_u+0x80000-8);  //for 1st autoreload.
      	        rDIDSTC2=(0<<1)|(0<<0);  
 	        rDCON2=rDCON2&~(0xfffff)|(downloadFileSize-0x80000); 		

  		while(rEP3_DMA_TTC<0xfffff)
  		{
  		    rEP3_DMA_TTC_L=0xff; 
  		    rEP3_DMA_TTC_M=0xff;
  		    rEP3_DMA_TTC_H=0xf;
  		}
	    }
	}
 	totalDmaCount=0;
    }
    else
    {
	totalDmaCount=downloadFileSize;
    }
#endif

    Uart_Printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n",
    		downloadAddress_u,downloadFileSize);
    Uart_Printf("RECEIVED FILE SIZE:%8d",0);

#if USBDMA    
    j=0x10000;

    while(1)
    {
    	if( (rDCDST2-(U32)downloadAddress_u+8)>=j)
	{
	    Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
   	    j+=0x10000;
	}
	if(totalDmaCount>=downloadFileSize)break;
    }

#else
    j=0x10000;

    while(((U32)downPt-downloadAddress_u)<(downloadFileSize-8))
    {
	if( ((U32)downPt-downloadAddress_u)>=j)
	{
	    Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
   	    j+=0x10000;
	}
    }
#endif
  

    time=Timer_StopEx();
    Uart_Printf("\b\b\b\b\b\b\b\b%8d",downloadFileSize);	
    Uart_Printf("(%5.1fKB/S,%3.1fS)\n",(float)(downloadFileSize/time/1000.),time);
    
#if USBDMA    
    /*******************************/
    /*     Verify check sum        */
    /*******************************/

    Uart_Printf("Now, Checksum calculation\n");

    cs=0;    
    i=(downloadAddress_u);
    j=(downloadAddress_u+downloadFileSize-10)&0xfffffffc;
    while(i<j)
    {
    	temp=*((U32 *)i);
    	i+=4;
    	cs+=(U16)(temp&0xff);
    	cs+=(U16)((temp&0xff00)>>8);
    	cs+=(U16)((temp&0xff0000)>>16);
    	cs+=(U16)((temp&0xff000000)>>24);
    }

    i=(downloadAddress_u+downloadFileSize-10)&0xfffffffc;
    j=(downloadAddress_u+downloadFileSize-10);
    while(i<j)
    {
  	cs+=*((U8 *)i++);
    }
    
    checkSum=cs;
#else
    //checkSum was calculated including dnCS. So, dnCS should be subtracted.
    checkSum=checkSum - *((unsigned char *)(downloadAddress_u+downloadFileSize-8-2))
	     - *( (unsigned char *)(downloadAddress_u+downloadFileSize-8-1) );	
#endif	  

    dnCS=*((unsigned char *)(downloadAddress_u+downloadFileSize-8-2))+
	(*( (unsigned char *)(downloadAddress_u+downloadFileSize-8-1) )<<8);

    download_end=1;
    if(checkSum!=dnCS)
    {
	Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
	return;
    }

    Uart_Printf("Download O.K.\n\n");
//    Uart_TxEmpty(consoleNum);

    
    
}




void Isr_Init1(void)
{
//    pISR_UNDEF=(unsigned)HaltUndef;
//    pISR_SWI  =(unsigned)HaltSwi;
//    pISR_PABORT=(unsigned)HaltPabort;
//    pISR_DABORT=(unsigned)HaltDabort;
    rINTMOD=0x0;	  // All=IRQ mode
    rINTMSK=BIT_ALLMSK;	  // All interrupt is masked.

    //pISR_URXD0=(unsigned)Uart0_RxInt;	
    //rINTMSK=~(BIT_URXD0);   //enable UART0 RX Default value=0xffffffff

#if 1
    pISR_USBD =(unsigned)IsrUsbd;  
    pISR_DMA =(unsigned)IsrDma2;
#else
    pISR_IRQ =(unsigned)IsrUsbd;	
    	//Why doesn't it receive the big file if use this. (???)
    	//It always stops when 327680 bytes are received.
#endif    
    ClearPending(BIT_DMA);
    ClearPending(BIT_USBD);
    //rINTMSK&=~(BIT_USBD);  
   
    //pISR_FIQ,pISR_IRQ must be initialized
}





⌨️ 快捷键说明

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