?? main_entry.c
字號:
/************************************************************************/
/*Title: Bootloader for S3C4510B */
/*Author: Chaishenchun */
/*Date: 2003-12-1 */
/************************************************************************/
#include "s3c4510b_add.h"
#include "uart.h"
#include "isr.h"
#include "ether.h"
#include "Flash_Info.h"
/********************** Function define. *******************************/
void InitUART(int Port,int Baudrate);
void PrintUART(int Port,char *s);
void flash_erase_Bootloader();
void Update_Bootloader();
void flash_prg(int CNT);
void flash_erase();
void Delay(int i);
void extern FIQ(void);
void download();
void Sys_Info(void);
void Test_LED(void);
void Flash_Unlock(void);
unsigned Install_Handle(unsigned routine,unsigned *vector);
/************************************************************************/
#define SYSCFG 0x03ff0000
#define INT_GLOBAL (21)
#define COUNTDOWN 0x01effff0
static int counter = 0;
/************************************************************************/
/*Function Name: C_Entry() */
/*Function Description: Main Function. */
/*Date: 2003-12-9 */
/************************************************************************/
void extern C_Entry(void)
{
char ch;
IOPMOD=0xff;
InitUART(0,0x500); //19200bps 50MHz 0=COM1;1=COM2
counter = 0;
i_printf("\r\n\r\n\r\n\r\n\r\n");
i_printf("*******************************************************************************\n\r");
i_printf("* *\n\r");
i_printf("* BootLoader for WS310 (Version: 1.0) *\n\r");
i_printf("* *\n\r");
i_printf("* Beijing Winsilicon Technology Co., Ltd *\n\r");
i_printf("* *\n\r");
i_printf("* http://www.winsilicon.com *\n\r");
i_printf("* *\n\r");
i_printf("* Tel: (86-10) 62968004 62969543-26 *\n\r");
i_printf("* *\n\r");
i_printf("* Room420,zhongguancun Chuangye Tower *\n\r");
i_printf("* No.26 Shangdi Information Middle Road *\n\r");
i_printf("* Haidian District,Beijing 100085,China *\n\r");
i_printf("* *\n\r");
Loop:
i_printf("*******************************************************************************\n\r");
i_printf("* Please Input the Item Number: *\n\r");
i_printf("* [0] System Information *\n\r");
i_printf("* [1] Test LED *\n\r");
i_printf("* [2] Reserved *\n\r");
i_printf("* [3] Reserved *\n\r");
i_printf("* [4] Download User Program to Flash *\n\r");
i_printf("* [5] Update Bootloader *\n\r");
i_printf("*******************************************************************************\n\r");
while(1)
{
put_char(0, 0x0d);
ch=get_char(0);
switch(ch)
{
case '0':Sys_Info();
break;
case '1':Test_LED();
goto Loop;
case '4':download();
break;
case '5':
Update_Bootloader();
break;
default:
{i_printf("\r\n");
goto Loop;}
}
}
}
/************************************************************************/
/*Function Description: Flash Program */
/*Date: 2003-12-2 */
/************************************************************************/
void flash_prg(int CNT)
{
volatile unsigned short *from_add,*to_add;
int i;
int j;
to_add= (unsigned short*)0x1010000;
from_add=(unsigned short *)0x00900000;
for(i=0;i<CNT*1024/2;i++)
{
*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;
*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_SETUP_WRITE;
*to_add++ =*from_add++ ;
Delay(500);
}
/*******Here, we verify the program data.**********/
i_printf(",Verify...");
to_add= (unsigned short*)0x1010000;
from_add=(unsigned short *)0x900000;
for(i=0;i<CNT*1024/2;i++)
{
if(*to_add!=*from_add)
{i_printf("Data Program Error!\r\n");exit(0);}
to_add++;from_add++;
}
}
/************************************************************************/
/*Function Description: */
/*Date: 2003-12-2 */
/************************************************************************/
void download()
{
char size[10];
char i,j;
static int length;
char flag;
static int CNT;
flag=1;
length=0;
i=0;
j=0;
i_printf(">>>Please Input the Size of Program...\n\r");
i_printf(">>>(Unit: KB)---");
size[0]=get_char(0);
do{
i_printf("%c",size[i]);
if(size[i]>'9'||size[i]<'0')
{
i_printf("\r\n\r\nSorry,Input Error!\r\n\r\n");
return;
}
i++;
size[i]=get_char(0);
}while(size[i]!=0x0d);
if(flag)
{
for(j=0;j<i;j++)
{
if(is_xdigit(size[j]))
{
if(size[j]>='0'&&size[j]<='9')
length = length * 10 + size[j]-'0';
else if(size[j]>='a'&&size[j]<='f') /* 'A' - 'F' */
length = length * 16 + 10+size[j]-'a';
else if(size[j]>='A'&&size[j]<='F') /* 'A' - 'F' */
length = length * 16 + 10+size[j]-'A';
}
}
if(length>1920) /* The maxium size of user program.*/
{
i_printf("\r\n\r\nSorry,The Size of File cann't Exceed 1920KB!\r\n\r\n");
return;
}
CNT=length;
length=0;
put_char(0, 0x0d);
i_printf("\r\n>>>Please Send File to Board by Xmodem Protocol...");
if (XModemReceive((char *)0x900000, 0xfffff) == -1)
{i_printf("\nTRANSFER FAILURE"); exit(0);}
i_printf(",...OK!\r\n");
flash_erase(CNT);
i_printf(">>>Flash Program,Please Wait...");
flash_prg(CNT);
i_printf(",OK!\r\n");
i_printf("\n\r>>>Flash Program Successfully. Thank you!\r\n");
}
}
/************************************************************************/
/*Function Description: bootloader program */
/*Date: 2003-12-9 */
/************************************************************************/
void flash_prg_bootloader(int CNT)
{
volatile unsigned short *from_add,*to_add;
int i;
int j;
to_add= (unsigned short*)0x1000000;
from_add=(unsigned short *)0x00900000;
Delay(50000);
i=*to_add;
for(i=0;i<CNT*1024/2;i++)
{
*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;
*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
*((volatile unsigned short *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_SETUP_WRITE;
*to_add++ =*from_add++ ;
Delay(500);
}
/*******Here, we verify the program data.**********/
i_printf(",Verify...");
to_add= (unsigned short*)0x1000000;
from_add=(unsigned short *)0x900000;
for(i=0;i<CNT*1024/2;i++)
{
if(*to_add!=*from_add)
{i_printf("Data Program Error!\r\n");exit(0);}
to_add++;from_add++;
}
}
/************************************************************************/
/*Function Name: Update_Bootloader() */
/*Function Description: Update the bootloader */
/*Date: 2003-12-2 */
/************************************************************************/
void Update_Bootloader()
{
char ch;
i_printf("\r\n>>>Are You Sure?(Y/N)---");
ch=get_char(0);
if((ch!='Y')&&(ch!='y'))
{i_printf("\r\n");
return;}
put_char(0, ch);
i_printf("\r\n>>>Please Send the New Bootloader to Board by Xmodem Protocol...");
if (XModemReceive((char *)0x900000, 0xfffff) == -1)
{i_printf("\nTRANSFER FAILURE"); exit(0);}
i_printf(",...OK!\r\n");
flash_erase_Bootloader();
i_printf(">>>Bootloader Flash Area Program,Please Wait...");
flash_prg_bootloader(64);
i_printf(",OK!\r\n");
i_printf("\n\r>>>Bootloader Update Successfully, Please Reset the System. Thank you!\r\n");
}
/************************************************************************/
/*Function Description: System Information */
/*Date: 2003-12-2 */
/************************************************************************/
void Sys_Info()
{
i_printf("\r\n\r\n\r\n\r\n\r\n");
i_printf("*******************************************************************************\n\r");
i_printf("* System Information *\n\r");
i_printf("* *\n\r");
i_printf("* CPU: S3C4510B Speed: 50MHz *\n\r");
i_printf("* Flash: 2MB SDRAM: 16MB *\n\r");
i_printf("* Ethernet: 10M/100M Working Volt: DC 5V *\n\r");
i_printf("* *\n\r");
i_printf("*******************************************************************************\n\r");
i_printf("* After Remap *\n\r");
i_printf("* *\n\r");
i_printf("* SDRAM Address: 0x0000,0000~0x0100,0000-1 *\n\r");
i_printf("* Flash Address: 0x0100,0000~0x0120,0000-1 *\n\r");
i_printf("*******************************************************************************\n\r");
i_printf("\n\rPress Any Key to Continue...\r\n");
}
/************************************************************************/
/*Function Description: Test LED */
/*Date: 2003-12-2 */
/************************************************************************/
void Test_LED(void)
{
int i;
i_printf("\r\n\r\nLED Testing...,Please Wait...");
IOPMOD=0xff;
for(i=0;i<10;i++)
{
IOPDATA=0x1;
Delay(500000);
IOPDATA=0x2;
Delay(500000);
IOPDATA=0x0;
Delay(500000);
}
i_printf(",OK!\r\n\r\n");
}
void Delay(int i)
{ int j,k;
for(j=0;j<i;j++)
{
k=0;
}
}
/************************************************************************/
/*Function Description: Erase bootloader area */
/*Date: 2003-12-5 */
/************************************************************************/
void flash_erase_Bootloader()
{
int i;
unsigned short *address;
/************************************************************************/
i_printf(">>>Erase Bootloader Flash Area S1,Please Wait...");
Flash_Unlock();
*((unsigned short *)AM_SECTOR_ADDR_01) = AM_SECTOR_ERASE; //0x3030
i_printf(",Blank Check...");
CHKB1:
Delay(50000);
for(address=(unsigned short *)AM_SECTOR_ADDR_01;address<(unsigned short *)AM_SECTOR_ADDR_02;address++)
{
if(*address!=0xffff)
{goto CHKB1;}
}
i_printf(", OK!\r\n");
/************************************************************************/
i_printf(">>>Erase Bootloader Flash Area S2,Please Wait...");
Flash_Unlock();
*((volatile unsigned short *)AM_SECTOR_ADDR_02) = AM_SECTOR_ERASE; //0x3030
i_printf(",Blank Check...");
CHKB2:
Delay(50000);
for(address=(unsigned short *)AM_SECTOR_ADDR_02;address<(unsigned short *)AM_SECTOR_ADDR_03;address++)
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -