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

📄 system.c

📁 基于arm9的,usb设备(u盘)的读写操作实现.
💻 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 + -