www.pudn.com > arm_uDisk.rar > System.c


#include  
#include  
#include "def.h" 
#include "option.h" 
#include "2410slib.h" 
#include "profile.h" 
#include "usbmain.h" 
#include "usbout.h" 
#include "usblib.h" 
#include "2410usb.h" 
#include "2410iis.h" 
#include "System.h" 
#include "main.h" 
#include "mx_types.h" 
 
 
void IsrInit(void); 
void Halt_Undef(void); 
void Halt_Swi(void); 
void Halt_Pabort(void); 
void Halt_Dabort(void); 
void __irq Isr_Wdt(void); 
u_8 USBDownload(void); 
void System_initial(void); 
void Download_from_USB(void); 
 
 
int consoleNum; 
 
int DownLoadOK=0;//Default value = 0 Used by USB mode3 
 
volatile U32 DownloadAddress; 
volatile U8 *downPt; 
volatile U32 DownloadFileSize; 
volatile U32 DownloadFileSize_temp; 
volatile U16 checkSum; 
volatile U32 totalDmaCount; 
U32 TempDownloadAddress; 
 
int isUsbdSetConfiguration; 
 
void (*run)(void); 
 
 
void IsrInit(void)//Interrupt vecter setting for kind of ISR 
{ 
	pISR_UNDEF 		= (unsigned)Halt_Undef; 
	pISR_SWI  		= (unsigned)Halt_Swi; 
	pISR_PABORT		= (unsigned)Halt_Pabort; 
	pISR_DABORT	= (unsigned)Halt_Dabort;  
 
	pISR_EINT2 		= (unsigned)Isr_Eint2; 
	pISR_EINT8_23 	= (unsigned)Isr_Eint8_23;  //Key S1-9 test 
	 
	pISR_USBD 		= (unsigned)IsrUsbd;  //USBD test 
	pISR_DMA2 		= (unsigned)IsrDma2;//DMA test 
 
	rEINTPEND		= 0xffffff;//Clear pending 
	rSRCPND			= 0x00; 
	rINTPND			= 0x00; 
 
	rINTMSK			|= BIT_EINT2; 
	rINTMSK			&= (~BIT_EINT2); 
} 
 
void System_initial(void) 
{ 
	ChangeClockDivider(0,0);		// 1:1:1  HCLK=FCLK/2, PCLK=FCLK/4   
 
	ChangeMPllValue(82,1,3);		//FCLK=45.0Mhz @ FIN=12MHz pass 
 
	Port_Init();            			//Located in 2410LIB.C for I/O port initialization 
	IsrInit();             				//Interrupt vecter initial, the table be lacated from address "__ISR_STARTADDRESS". 
	Uart_Init(45000000,115200);	//45000000 
	Uart_Select(0); 
	 
 
	rMISCCR=0x01020; 			//USBD|CLKOUT0=FCLK|CLKOUT1=MPLL|USB Port0=Disable Port1=Enable 
 
	isUsbdSetConfiguration=0;     
	MMU_EnableICache(); 
	UsbdMain();					//Initial USBD and enable INT_USBD 
 
	Delay(0);  					//Calibrate Delay() 
	pISR_SWI=(_ISR_STARTADDRESS+0xf0);    //for pSOS 
 
	Led(LEDALL_ON); 
 
	//Enable EINT 10,11,13-19 for key 
	rEINTMASK=~( (1<<19)|(1<<18)|(1<<17)|(1<<16)|(1<<15)|(1<<14)|(1<<13)|(1<<11)|(1<<8)); 
 
	rINTMSK&=~((BIT_EINT8_23)); 
 
	 
 
	Led(LEDALL_OFF); 
 
 
} 
 
U32 Sys_GetDownloadAddress(void) 
{ 
	return DownloadAddress; 
} 
 
U32 Sys_GetDownloadFileSize(void) 
{ 
	return DownloadFileSize_temp; 
} 
 
void Download_from_USB(void) 
{ 
	//MIDIaddress = ((U8 *)DownloadAddress); 
	DownloadFileSize_temp = DownloadFileSize-10; 
	//if((DownloadAddress != 0x30000000) || (DownloadAddress != 0x10000000)) 
	//{ 
	//	MIDI_flg = 0; 
 
		//Modified by Justin on 20051011 
		//mx_Stop(0); 
		//mx_System_Close(); 
	//} 
	if(USBDownload()==1) //It will set DownloadFileSize to 0 
	{ 
		Led(LEDALL_ON);//Download fail 
		while(1); 
	} 
	if((DownloadAddress == 0x30000000) || (DownloadAddress == 0x10000000)) 
	{ 
		rINTMSK=BIT_ALLMSK; 
		run=(void (*)(void))DownloadAddress; 
		run(); 
	} 
 
} 
 
u_8 USBDownload(void)  
{ 
	U32 i=0; 
	U32 j=0; 
	U16 cs; 
	U32 temp; 
	U16 dnCS; 
	float time; 
 
	checkSum=0; 
	            
	Timer_InitEx();       
	Timer_StartEx();     
 
#if USBDMA     
 
    rINTMSK&=~(BIT_DMA2);//0x4A000008, enable INT_DMA2 
    ClearEp3OutPktReady();// Function at USBOUT.C  
    // indicate the first packit is processed. 
    // has been delayed for DMA2 cofiguration. 
 
    if(DownloadFileSize>EP3_PKT_SIZE) 
    { 
        if(DownloadFileSize <= (0x80000)) 
        { 
            ConfigEp3DmaMode(DownloadAddress+EP3_PKT_SIZE-8,DownloadFileSize-EP3_PKT_SIZE);  
            //wait until DMA reload occurs. 
            while((rDSTAT2&0xfffff) == 0);//Curr_Tc(0x4b000094)=0x00 
 
            //will not be used. 
            rDIDST2=(DownloadAddress+DownloadFileSize-EP3_PKT_SIZE);   
            rDIDSTC2=(0<<1)|(0<<0);   
            rDCON2=rDCON2&~(0xfffff)|(0);                
        } 
        else 
        { 
            ConfigEp3DmaMode(DownloadAddress+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+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+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("\n\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n",DownloadAddress,DownloadFileSize); 
    Uart_Printf("RECEIVED FILE SIZE:%8d",0); 
 
#if USBDMA     
 
    j=0x10000; 
 
    while(1) 
    { 
        if( (rDCDST2-(U32)DownloadAddress+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)<(DownloadFileSize-8)) 
    { 
        if( ((U32)downPt-DownloadAddress)>=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("\nNow, Checksum calculation\n"); 
 
    cs=0;     
    i=(DownloadAddress); 
    j=(DownloadAddress+DownloadFileSize-10)&0xfffffffc; 
     
    while(i>8); 
        cs+=(U16)((temp&0xff0000)>>16); 
        cs+=(U16)((temp&0xff000000)>>24); 
    } 
 
    i=(DownloadAddress+DownloadFileSize-10)&0xfffffffc; 
    j=(DownloadAddress+DownloadFileSize-10); 
     
    while(i