www.pudn.com > BIOS-S3C2410.rar > 2410bios.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" 
 
void call_linux(U32 a0, U32 a1, U32 a2); 
void UsbMain(void); 
void comdownload(void); 
 
void NandWrite(void); 
void NandLoadRun(void); 
void NandRunSystem(void); 
void NandErase(void); 
// GPB1/TOUT1 for Backlight control(PWM) 
#define GPB1_TO_OUT()   (rGPBUP &= 0xfffd, rGPBCON &= 0xfffffff3, rGPBCON |= 0x00000004) 
#define GPB1_TO_1()     (rGPBDAT |= 0x0002) 
#define GPB1_TO_0()     (rGPBDAT &= 0xfffd) 
     
	//qjy: special power on timing, please research it! 
void Lcd_Port_Init(void); 
void Lcd_Init(void); 
 
extern U32 downloadAddress, downloadFileSize; 
//static EnvParams Env; 
U32	Console_Uart = 0; 
U32	Console_Baud = 115200; 
 
static short DsAutoBoot; 
static short NorFlashSupport = 0 ; 
 
volatile int PwrKeyChkEnd; 
 
//***************************************************************************** 
void GetBootParam(void) 
{ 
	U16 cmd_cnt = 0; 
	char tmp[256] = {0}; 
	 
	NFSearchParams((char *)&Env); 
	if(Env.boot_params[0]=='r') 
		printf("\n%s", Env.boot_params); 
	puts("\nSet 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++) 
		Env.boot_params[cmd_cnt] = tmp[cmd_cnt]; 
	Env.boot_params[cmd_cnt] = 0;			 
 
	NFSaveParams((char *)&Env); 
} 
 
//***************************************************************************** 
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("\nPlease 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"}, 
				{NandRunSystem, "Load Pragram from Nand flash and run"}, 
				{NandErase, "Erase Nand flash 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 = 10;		//5s 
 
	if(!--cnt) { 
		ReleaseBiosTimerEvent(i); 
//		if(!DsAutoBoot) 
//			(*CmdTip[3].fun)(); 
	if((!DsAutoBoot)&&(Env.Os_Auto_Flag==1))NandLoadRun(); 
	if((!DsAutoBoot)&&(Env.Os_Auto_Flag==2))Wince_Run=1; 
	} 
	rGPBDAT ^= 1<<5; 
} 
/* 
static void Led1Flash(U32 i) 
{	 
	static cnt = 30; 
	 
	if(!--cnt) { 
		ReleaseBiosTimerEvent(i); 
//		ChangeSlowMode(CLKSLOW_PLL_ON);		 
//		Uart_Init(0, UART_BAUD); 
	} 
	rGPFDAT ^= 0x80; 
} 
static void Led2Flash(U32 i) 
{	 
	rGPFDAT ^= 0x40;	 
} 
static void Led3Flash(U32 i) 
{	 
	rGPFDAT ^= 0x20;	 
} 
static void Led4Flash(U32 i) 
{		 
	rGPFDAT ^= 0x10;	 
} 
*/ 
/****************************************************************************** 
【功能说明】系统主函数 
******************************************************************************/ 
int Main(U32 RstStat) 
{ 
	int i; 
//	ChangeClockDivider(1, 1);	// 1:2:4 
//	ChangeMPllValue(172,4,1);	//FCLK=180.0Mhz 
	SetClockDivider(1, 1); 
	SetSysFclk(FCLK_200M);		//to save power, use 50M 
	 
	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(); 
	Delay( 0 ) ; 
 
	putch('\n'); 
 
	PwrKeyChkInit(); 
	 
	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 ) ; 
	 
	 
	//turn on the LCD blacklight! 
    GPB1_TO_OUT(); 
    GPB1_TO_1(); 
     
	//special power on timing, please research it! 
    Lcd_Port_Init(); 
    Lcd_Init(); 
 
	Beep( 2000, 1000 ) ; 
	 
	RequestBiosTimerEvent(30, Led4Flash);	//when request, auto open bios timer 
	//RequestBiosTimerEvent(20, Led2Flash); 
	//RequestBiosTimerEvent(50, Led3Flash); 
	//RequestBiosTimerEvent(100, Led1Flash); 
	 
	 
	NFSearchParams((char *)&Env); 
	printf("Env.Os_Auto_Flag=%x\n",Env.Os_Auto_Flag); 
	 
	printf("<*******************************************>\n"); 
	printf("<*                                         *>\n"); 
	printf("<*         S3C2410 Board BIOS V2006        *>\n"); 
	printf("<*                                         *>\n"); 
	printf("<*         Http://www.ucdragon.com         *>\n"); 
	printf("<*                                         *>\n"); 
	printf("<*         深圳市优龙科技有限公司          *>\n"); 
	printf("<*                                         *>\n"); 
	printf("<*             版  权  所  有              *>\n"); 
	printf("<*                                         *>\n"); 
	printf("<*******************************************>\n"); 
	 
	if(rBWSCON&6) 
	{ 
		U32 nor_flash_id; 
		 
		nor_flash_id = GetFlashID(); 
		puts("NOR 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 
			printf( "Not supported NorFlash found!!!\n" ) ; 
		 
	} 
	else  
		puts("NAND Flash Boot\n"); 
	 
	Test_Lcd_LTV350QVF05(); 
	 
	RequestBiosTimerEvent(50, AutoBoot);	//reload value = 50, 10ms*50 = 500ms 
 
	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(); 
			Delay(500); 
			if((Wince_Run==1)) 
				NandLoadRunW();//(*CmdTip[7].fun)(); 
		} 
		//if(Wince_Run==1)(*CmdTip[7].fun)(); 
		Delay(200); 
		DsAutoBoot = 1;	//when get a key press, disable auto boot 
		idx -= '0'; 
		printf("%x\n",idx); 
		if(idx