📄 system.c
字号:
#include <stdlib.h>
#include <string.h>
#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<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+DownloadFileSize-10)&0xfffffffc;
j=(DownloadAddress+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+DownloadFileSize-8-2))
- *( (unsigned char *)(DownloadAddress+DownloadFileSize-8-1) );
#endif
dnCS=*((unsigned char *)(DownloadAddress+DownloadFileSize-8-2))+
(*( (unsigned char *)(DownloadAddress+DownloadFileSize-8-1) )<<8);
if(checkSum!=dnCS)
{
Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
return 1;
}
Uart_Printf("Download O.K.\n\n");
Uart_TxEmpty(consoleNum);
DownloadFileSize=0;
return 0;
}
void Halt_Undef(void)
{
while(1);
}
void Halt_Swi(void)
{
while(1);
}
void Halt_Pabort(void)
{
while(1);
}
void Halt_Dabort(void)
{
while(1);
}
void System_Waiting()
{
if(DownloadFileSize==0 )
{
Led(LED1_ON); Delay(500);Led(LED1_OFF);Delay(500);Led(LED2_ON);Delay(500);Led(LED2_OFF);Delay(500);Led(LED3_ON); Delay(500);Led(LED3_OFF);Delay(500);Led(LED4_ON);Delay(500); Led(LED4_OFF);Delay(500);
}
else
{
Download_from_USB();
}
}
void mx_SGResetInit(void) //H/W Reset
{
rGPADAT=0x01ffff;//Reset SG , user need to define it
Delay(100);
rGPADAT=0xffffff;
Delay(100);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -