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