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

📄 2410bios.c

📁 GEC的BIOS
💻 C
字号:
#include "def.h"
#include "2410addr.h"
#include "2410lib.h"
#include "2410slib.h"
#include "mmu.h"
#include "uart.h"
#include "timer.h"
#include "39vf160.h"
#include "LCD.h"
#include "PowerManage.h"
#include "timer.h"

void call_linux(U32 a0, U32 a1, U32 a2);
void UsbMain(void);
void comdownload(void);
void NandWrite(void);
void NandLoadRun(void);
void NandErase(void);

extern U32 downloadAddress, downloadFileSize;
static EnvParams Env;
U32	Console_Uart = 0;
U32	Console_Baud = 115200;
char boot_params[256];

static short DsAutoBoot;
static short NorFlashSupport = 0 ;

volatile int PwrKeyChkEnd;

static void cal_cpu_bus_clk(void)
{
	U32 val;
	U8 m, p, s;
	
	val = rMPLLCON;
	m = (val>>12)&0xff;
	p = (val>>4)&0x3f;
	s = val&3;

	SYS_FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;
	
	val = rCLKDIVN;
	m = (val>>1)&3;
	p = val&1;	
	val = rCAMDIVN;
	s = val>>8;
	
	switch (m) {
	case 0:
		SYS_HCLK = SYS_FCLK;
		break;
	case 1:
		SYS_HCLK = SYS_FCLK>>1;
		break;
	case 2:
		if(s&2)
			SYS_HCLK = SYS_FCLK>>3;
		else
			SYS_HCLK = SYS_FCLK>>2;
		break;
	case 3:
		if(s&1)
			SYS_HCLK = SYS_FCLK/6;
		else
			SYS_HCLK = SYS_FCLK/3;
		break;
	}
	
	if(p)
		SYS_PCLK = SYS_HCLK>>1;
	else
		SYS_PCLK = SYS_HCLK;

	rUPLLCON = (56<<12) | (2<<4) | 2;         //48MHZ
		
	/*val = rUPLLCON;
	m = (val>>12)&0xff;
	p = (val>>4)&0x3f;
	s = val&3;
	UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
	if(UPLL==96*MEGA)
		rCLKDIVN |= 8;	//UCLK=UPLL/2
	UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;*/
}


 void EUARTputHex(U8 data)
{
    U8  d;

    // print first digit
    d = data >> 4;
    if (d > 9)
        d += 55;
    else
        d += '0';
    putch(d);

    // print second digit
    d = data & 0xF;
    if (d > 9)
        d += 55;
    else
        d += '0';
    putch(d);
}



//*****************************************************************************
void GetBootParam(void)
{
	U16 cmd_cnt = 0;
	char tmp[256] = {0};
	
	puts("Set boot params, press Enter to finish, Esc to abort\n");
	while(1) {
		char c = getch();
		if(c==0x1b) 
			return;
		
		if(c==0xd)
			break;
		if((c==0x8)&&(cmd_cnt)) {			
			cmd_cnt -= 1;
			tmp[cmd_cnt] = 0;
			putch(c);
			putch(' ');
			putch(c);
		}
		else {
			if(cmd_cnt<255) {
				putch(c);
				tmp[cmd_cnt++] = c;
				tmp[cmd_cnt]   = 0;
			}
		}		
	}

	for(cmd_cnt=0; tmp[cmd_cnt]; cmd_cnt++)
		boot_params[cmd_cnt] = tmp[cmd_cnt];
	boot_params[cmd_cnt] = 0;			
}

//*****************************************************************************
static __inline int RtcAlmWake(void)
{	
	return ((rBCDHOUR==rALMHOUR)&&(rBCDMIN==rALMMIN));
}

//*****************************************************************************
static void ProgNorFlash(void)
{
	if(NorFlashSupport) {
		SectorProg(0, (U16 *)downloadAddress, downloadFileSize);
	}
}

//*****************************************************************************
void SDRAM_Test(void)
{
    int i;
    U32 data;
    int memError=0;
    U32 *pt;
    
    printf("Memory Test(%xh-%xh):WR",_RAM_STARTADDRESS,(_ISR_STARTADDRESS&0xfff0000));

    pt=(U32 *)_RAM_STARTADDRESS;
    while((U32)pt<(_ISR_STARTADDRESS&0xffff0000))
    {
	*pt=(U32)pt;
	pt++;
    }

    printf("\b\bRD");
    pt=(U32 *)_RAM_STARTADDRESS;
	
    while((U32)pt<(_ISR_STARTADDRESS&0xffff0000))
    {
	data=*pt;
	if(data!=(U32)pt)
	{
	    memError=1;
	    printf("\b\bFAIL:0x%x=0x%x\n",i,data);
	    break;
	}
	pt++;
    }

    if(memError==0)printf("\b\bO.K.\n");
}
/****************** by chang *****************************/
static void Set_Auto_Run(void)
{
	printf("Please Input Number:");
	Env.Os_Auto_Flag=getch()-'0';
	//Env.Os_Auto_Flag=1;
	printf("%x\n",Env.Os_Auto_Flag);
	NFSaveParams((char *)&Env);
}
/***************** by chang *****************************/
struct {
	void (*fun)(void);
	char *tip;
}CmdTip[] = {
				{UsbMain, "USB download file"},
				{comdownload, "Uart download file"},
				{NandWrite, "Write Nand flash with download file"},
				{NandLoadRun, "Load Pragram from Nand flash and run"},
				{NandErase, "Erase Nand f000lash regions"},
				{ProgNorFlash, "Write NOR flash with download file"},
				{GetBootParam, "Set boot params"},
				//{NandLoadRunW,"Run Wince"},
				{Set_Auto_Run,"Set AutoBoot parameter,1:linux 2:wince"},
				//{EnterPowerOff, "Test Power off"},
				//{SDRAM_Test, "test SDRAM Memory"},
				{0, 0}						
			};

static int Wince_Run=0;	
//*****************************************************************************
static void AutoBoot(U32 i)
{
	static cnt = 1;		//5s  修改自启动时间
	if(!--cnt) {
		ReleaseBiosTimerEvent(i);
		//if(!DsAutoBoot)
		//	NandLoadRun();
	if((!DsAutoBoot)&&(Env.Os_Auto_Flag==1))NandLoadRun();
	if(Env.Os_Auto_Flag==2)Wince_Run=1;
	//if((!DsAutoBoot)&&(Env.Os_Auto_Flag==2))NandLoadRun();
	}
	rGPBDAT ^= 1<<5;
}

/******************************************************************************
【功能说明】系统主函数
******************************************************************************/
int Main(U32 RstStat)
{
	int i,j,k;
	//ChangeClockDivider(1, 1);	// 1:2:4
	//ChangeMPllValue(172,4,1);	//FCLK=180.0Mhz

	ChangeMPllValue(92,1,1);    //400MHZ
	SetClockDivider(2,1);		//fclk:hclk:pclk=1:4:8
	cal_cpu_bus_clk(); 

	/*SetClockDivider(3, 1);
	SetSysFclk(FCLK_405M);		//to save power, use 48M*/

	/*rMPLLCON=FCLK_400M;
	rCLKDIVN=5;
	MMU_SetAsyncBusMode();
	SYS_FCLK=400000000;
	SYS_HCLK=SYS_FCLK/4;
	SYS_PCLK=SYS_HCLK/2;*/
	
	rGPHCON=(rGPHCON&0x3ffff)|(0x0a<<18);
	
	rMISCCR=(rMISCCR&0x0f)|(0x02<<4);
//	rMISCCR=rMISCCR|(0x04<<8);

    rMISCCR=(rMISCCR&0x0f)|(0x03<<4);
    
    rMISCCR=(rMISCCR&0x0f)|(0x04<<4);

	
	Port_Init();
	Isr_Init();

	Uart_Init(0, Console_Baud);
	Uart_Select(Console_Uart);	

#if 1			//bank0 modified to RO_START
	MMU_Init();	//MMU should be reconfigured or turned off for the debugger, 
	//After downloading, MMU should be turned off for the MMU based program,such as WinCE.	
#else
	MMU_EnableICache();
	UsbMain();
#endif
	
	//enable GPIO,UART0,PWM TIMER,NAND FLASH module clock
//	DisableModuleClock(CLOCK_ALL);
	EnableModuleClock(CLOCK_ALL);	

	//LcdBackLightOff();
	
	/* IO 配置图*/
	//power 按键采集
	rGPGCON &= ~(3<<18);//输入 GPG9
	rGPBCON |= (1<<16);//输出GPB8
	rGPBDAT &= ~(1<<8);//GPB8输出低
	rGPBCON |= (1<<18);//输出GPB9	
	rGPBDAT &= ~(1<<9);//GPB9输出低,关闭背光
	rGPGCON |= (1<<8); //GPG4=输出
	i = (int)(rGPGCON);
	rGPGDAT |= (1<<4);//GPB4输出高
	i = rGPGDAT;	
	if(i & (1<<9))//采集到高电平,按键没有按下
		{
		printf("Power Key up\n");
		}
	else//按键按下
		{
		printf("Power Key down\n");
		for(j=0;j<10000;j++)
			for(k=0;k<10000;k++);
		i = rGPGDAT;
		if(i & (1<<9))
			{
			printf("Power Key up\n");
			}
		else
			{
			printf("Power Key down\n");
			rGPBDAT |= (1<<8);//GPB8输出高,打开电源
			}
		}	Delay( 0 ) ;

	//MPULLCON--register
	printf("m :%d,h:%d,p:%d\n",(rMPLLCON>>12)&0xff, (rMPLLCON>>4)&0x3f, (rMPLLCON)&3);
	//CLKDIVN--register
	printf("clkdiv:%d\n",rCLKDIVN&0x0f);
	//
	printf("sys_fclk :%d,sys_hclk:%d,sys_pclk:%d\n", SYS_FCLK,SYS_HCLK,SYS_PCLK);

	putch('\n');

	PwrKeyChkInit();

	puts("************************************\n");
	puts("*                                  *\n");
	puts("*     GEC2440 Board Loader V1.1    *\n");
	puts("*     Http://www.gd-emb.org        *\n");
	puts("*                                  *\n");
	puts("************************************\n\n");
	
	
	if(RstStat&1) {
		puts("Power on reset\n");
//		EnterPowerOff();
	}
	if(RstStat&4) {
		puts("Watchdog reset\n");
//		EnterPowerOff();
	}
	if(RstStat&2) {
		puts("Power-off reset\n");
		if(RtcAlmWake()) {
			puts("Alarm wake up\n");
			printf("RTC hr : %d, min : %d\nALM hr : %d, min : %d\n", rBCDHOUR, rBCDMIN, rALMHOUR, rALMMIN);
		} else if( PwrKeyWake() ) {			
			PwrKeyChkEnd = 1;
			RequestBiosTimerEvent(1, PwrKeyChk);	//reload value = 1, 10ms*1 = 10ms
			while(PwrKeyChkEnd>0);
			if(PwrKeyChkEnd!=0)
				EnterPowerOff();
			puts("Power key wake up\n");
		}
	}	
		
	rMISCCR &= ~(0x3007);		//USB port0,1 = normal, D0~D31 pull-up enable

	//Set_Tout1_Pwm( 60 ) ;
	Test_Lcd_Tft_16Bpp_240_320();
	
	//Beep( 2000, 500 ) ;
	
	RequestBiosTimerEvent(50, AutoBoot);	//reload value = 50, 10ms*50 = 500ms
	NFSearchParams((char *)&Env);    //fhg delay
	printf("Env.Os_Auto_Flag=%x\n",Env.Os_Auto_Flag);


	
	
	// GPB1 = 0, not beep;
	rGPBCON &= ~(3<<2);
	rGPBCON |= (1<<2);
	rGPBDAT &= ~(1<<1);
	rGPBUP &= ~(1<<1);
	
	


	rGPBDAT |= (1<<9);//GPB9输出高,打开背光
	
/*	
	if(rBWSCON&6)
	{
		U32 nor_flash_id;
		
		nor_flash_id = GetFlashID();
		puts("\r\nNOR Flash Boot, ");
		printf("Read ID is : 0x%x\n", nor_flash_id);
		
		if ( (nor_flash_id==0x278200bf) | (nor_flash_id==0x234b00bf) )
		{
			NorFlashSupport = 1 ;
			if(nor_flash_id==0x278200bf)		puts("SST39VF160 found\n");
			if(nor_flash_id==0x234b00bf)		puts("SST39VF1601 found\n");
		} else if(nor_flash_id == 0x225b) {
			NorFlashSupport = 1;
			puts("AM29LV800BB found at nGCS0\n");
		} else
			printf( "Not supported NorFlash found!!!\n" ) ;
		
	} else {
		U32 nor_flash_id;
		extern unsigned long rom_base;

		puts("NAND Flash Boot\n");
		
	
		rom_base = 0x10000000;
		nor_flash_id = GetFlashID();
		if(nor_flash_id == 0x225b) {
			NorFlashSupport = 1 ;
		    printf("Read Norflash ID is : 0x%x\n", nor_flash_id);
			puts("AM29LV800BB found at nGCS2\n");
		} else
   		    printf( "Not NorFlash found at nGCS2, check jumper!!!\n" ) ;
	}
	*/
	
	
	while(1)
	{
		U8 idx=0;
		puts("\nPlease select function : \n");	
		for(i=0; CmdTip[i].fun!=0; i++)
			printf("%d : %s\n", i, CmdTip[i].tip);
			
			
			
		while((!idx)&&(Wince_Run!=1))
		{
			idx=getkey();
			
			//if(Wince_Run==1)NandLoadRunW();
			if((idx==0)&&(Wince_Run==1)) {
			    printf("BootCE\n");
			    NandLoadRunW();
			}
		}
		
		//if(Wince_Run==1)(*CmdTip[7].fun)();
		DsAutoBoot = 1;	//when get a key press, disable auto boot
		idx -= '0';
		printf("%x\n",idx);
		if(idx<i)
		{
			(*CmdTip[idx].fun)();	
			
		}
		Wince_Run=0;
		
	}
}



⌨️ 快捷键说明

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