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

📄 main_entry.c

📁 一个比较好的三星s3c4510的启动代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************************/
/*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++)
		{

⌨️ 快捷键说明

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