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

📄 main_entry.c

📁 用于开发Linux的Bootloader源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*
//==Program Name:Main_entry.c================================
//--Program Description:Arm bootloader main programm-------- 
//--Author:Yanyou Song---E-mail:syyo@163.com-----------------
//--Some Program&Fuction May Have BUG------------------------
//--The Code Is Strictly In public,Forbiding Updata On Net---
//--Use This Code Caused All The Problem Is Irrespective The 
Programmer,Aftermath By Yourself!!---------------------------
//--Copyright Yanyou Song,All rights reserved.---------------
//--Design Data:2006-09-11 ----------------------------------
//===========================================================

//===========程序名称:Main_entry.c======================= 
//--程序目的:ARM引导装载程序-----------------------------
//-----设计&编写者 :宋彦佑--电子邮件:syyo@163.com---------
//------------程序&函数有存在BUG的可能--------------------
//------此原码不公开!!不允许公布在因特网上!!------------
//--使用此代码引起的一切问题与设计&编写者无关,后果自负---
//------------作者保留此代码的所有权力--------------------
//----设计日期:-2006-now---------------------------------
//========================================================

//--------最后更改日期---------
//---the last revision time----
//2006-10-31  

*/

#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);
void down_pgm_ram(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				*/
/************************************************************************/
extern void jmppc_f(void);
void extern C_Entry(void)
{
	char    ch;
	char   enter_sys_b,time_remain=6;
	unsigned char data_eep_char;
	int data_eep_int,error=0;
	unsigned int time_d,time_b;
	 int chack_jumper;
	 unsigned long data_eep_long=0;
	 IOPMOD=0xff;
	 InitUART(0,0x500);  //19200bps  50MHz 0=COM1;1=COM2
	 counter = 0;
	 IOPMOD=0x000000;
	 chack_jumper=IOPDATA;
	 chack_jumper&=0x08;
	 error=0;data_eep_long=0;
	 if(chack_jumper==0x08)   { inc_os_use(); jmppc_f();}
	 else  inc_boot_use();
	 i_printf("\r\n\r\n\r\n\r\n\r\n");
	 i_printf("          +---------------------------------------------+\n\r");
	 i_printf("          |  ARM7 System Board  引导装载程序  (Ver1.34) |\n\r");
	 i_printf("          |           哈尔滨工业大学                    |\n\r");
	 i_printf("          |        自动化测试与控制研究所               |\n\r");
	 i_printf("          +---------------------------------------------+\n\r");
	 i_printf("          +--------------------------+\n\r");
	 i_printf("          | 剩余时间将进入系统...... |\n\r");
	 i_printf("          | Time Remain      6       |\n\r");
	 i_printf("          +--------------------------+");
     put_char(0, 0x08);put_char(0, 0x08); put_char(0, 0x08);put_char(0, 0x08); 
	 put_char(0, 0x08);put_char(0, 0x08); put_char(0, 0x08);put_char(0, 0x08); 
	 put_char(0, 0x1b);put_char(0, 0x5b);put_char(0, 0x41); 
	 enter_sys_b=get_charb(0);
	 while(1)
	    {
		 if(enter_sys_b==get_charb(0))
		    { for(time_d=0;time_d<=6900;time_d++)
		        {for(time_b=0;time_b<=48;time_b++)
				    {if(enter_sys_b!=get_charb(0)) break; }
			    }		 
		    }
		 else break;	
		 put_char(0, 0x08);put_char(0, 0x08); 
		 put_char(0, ' ');
		 i_printf("%d",time_remain-1);
		 time_remain--;
		 if(time_remain==0) 
		    {inc_os_use();
			 i_printf("\r\n\r\n");
			 jmppc_f();}}
	 i_printf("\r\n\r\n\r\n\r\n\r\n");
	 i_printf("          +---------------------------------------------+\n\r");
	 i_printf("          |  ARM7 System Board  引导装载程序  (Ver1.34) |\n\r");
	 i_printf("          |           哈尔滨工业大学                    |\n\r");
	 i_printf("          |        自动化测试与控制研究所               |\n\r");
	 i_printf("          +---------------------------------------------+\n\r");
	 i_printf("          |  BootLoader for ARM7 System Board(Ver1.34)  |\n\r");
	 i_printf("          |       Harbin Institute Of Technology        |\n\r");
	 i_printf("          |   Automatic Test and Control Institute      |\n\r");
	 i_printf("          +---------------------------------------------+\n\r");
	while(1)
	{
Loop:
	 i_printf("          +---------------------------------------------+\n\r");
	 i_printf("          | BootLoader for ARM7 System Board(Ver1.34)   |\n\r");
	 i_printf("          |   Please Input the Item Number:             |\n\r");
	 i_printf("          |    [1]  System Information                  |\n\r");
	 i_printf("          |    [2]  Test  LED (I/O 0,1)                 |\n\r");
	 i_printf("          |    [3]  Update Bootloader(Please Don't Use) |\n\r");
	 i_printf("          |    [4]  Download OS/Programm to Flash       |\n\r");
	 i_printf("          |    [5]  Start User Pgm/OS                   |\n\r");
	 i_printf("          |    [6]  Set Network IP Address              |\n\r");
	 i_printf("          +---------------------------------------------+\n\r");
	 put_char(0, 0x0d);
  	 ch=get_char(0);
		sys_debug(ch);
		switch(ch)
			{
			 case '1':
			     Sys_Info();
				 break;	
			 case '2':
			     Test_LED();
				 goto Loop;	
			 case '3':
				 Update_Bootloader();
				 break;
			 case '4':
			     download();	
				 break;				
			 case '5':
			     inc_os_use();
			     jmppc_f();
				 break;					
			 case '6':
			     set_ip_address();
				 break;
			default:
                 break;
			}	
	}    
}

/************************************************************************/
/*Function Description:	Flash Program				*/
/*Date:			2006-10-20				*/
/************************************************************************/
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("编程完毕...\r\n");
	i_printf("Verify...\r\n");
	to_add= (unsigned short*)0x1010000;
	from_add=(unsigned short *)0x00900000;
	for(i=0;i<CNT*1024/2;i++)
		{
		if(*to_add!=*from_add)
			{
			 i_printf("Data Program Error!\r\n");
			 i_printf("数据较验失败!编程错误!\r\n");
			 i_printf("Data Program Error!\r\n");
			 exit(0);
			 }
		to_add++;from_add++;
		}
}

/************************************************************************/
/*Function Description:						*/
/*Date:			2006-10-20				*/
/************************************************************************/
void download()
{
	char size[10];
	char i,j;
	char iinput;
	static int length;
	char flag;
	static int CNT;
	flag=1;
	length=0;
	i=0;
	j=0;
	 while(1)
	    {
		 i_printf("+---------------------------------+\n\r");
	     i_printf("| Do you want to change BaudRate? |\n\r");
	     i_printf("|  (Y) Change ;Others to Contrnue |\n\r");
	     i_printf("|       是否改变波特率?          |\n\r");
		 i_printf("|  (Y) 改变 ;(N)继续              |\n\r");
	     i_printf("+---------------------------------+\n\r");
         iinput=get_char(0);
		 if(iinput=='y')
		    {
			     i_printf("+---------------------------------+\n\r");
			     i_printf("|Please input BaudRate Item Number|\n\r");
			     i_printf("|  (1) Not Change                 |\n\r");
			     i_printf("|  (2) Change BaudRate to 38400   |\n\r");
			     i_printf("|  (3) Change BaudRate to 57600   |\n\r");
			     i_printf("|  (-) Change BaudRate to 115200X |\n\r");
			     i_printf("+---------------------------------+\n\r");
				 iinput=get_char(0);
				 i_printf("Now Baudrate will be set!\n\r");
				 i_printf("现在波特率将要被设置!\n\r");
				 i_printf("(y)Continue(Others)test\n\r");
				 i_printf("(y)继续(其它按键)测试\n\r");
				 i_printf(" \n\r");
				 switch(iinput)
				    {
					 case '1':
					     while(1)
						    {
							 iinput=get_char(0);
							 i_printf("(y)Continue(Others)test\n\r");
							 i_printf("(y)继续(其它按键)测试\n\r");
							 if(iinput=='y') break;
							}
						 break;
					 case '2':
					     while(1)
						    {
							 InitUART(0,0x00280);
							 iinput=get_char(0);
							 i_printf("(y)Continue(Others)test\n\r");
							 i_printf("(y)继续(其它按键)测试\n\r");
							 if(iinput=='y') break;
							}
						 break;
					 case '3':
					     while(1)
						    {
							 InitUART(0,0x001a0);
							 iinput=get_char(0);
							 i_printf("(y)Continue(Others)test\n\r");
							 i_printf("(y)继续(其它按键)测试\n\r");
							 if(iinput=='y') break;
							}
						 break;
					 case '4':
					     while(1)
						    {
							 InitUART(0,0x000d0);
							 iinput=get_char(0);
							 i_printf("(y)Continue(Others)test\n\r");
							 i_printf("(y)继续(其它按键)测试\n\r");
							 if(iinput=='y') break;
							}
						 break;
					 default:
					     break;
					}
			  if(iinput=='y') break;
		    }
		 else if(iinput=='n')
		    { break;}
		 i_printf(" BaudRate is not Changed!\n\r");
		 i_printf("波特率没有改变!\n\r");
		}
	i_printf("Please Input the Size of Pgm image\n\r");
	i_printf(" 请输入程序文件的大小\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>3320) 	/* The maxium size of user program.*/
			{
			 i_printf("\r\n\r\n对不起,文件的大小不能超过 3320KB!\r\n\r\n");
			 i_printf("\r\n\r\nSorry,The Size of File cann't Exceed 3320KB!\r\n\r\n");
			return;	
			}
		CNT=length;
		length=0;
		put_char(0, 0x0d);
		i_printf("\r\n");
		i_printf("\r\n>>>请用Xmodem模式发送文件<<");
		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,请稍后...\r\n");
		 i_printf(">>>Flash Program,Please Wait...\r\n");
		 inc_flash_use();
		 flash_prg(CNT);
		 i_printf(",OK!\r\n");
		 i_printf("\n\r>>>Flash编程成功. 谢谢使用!\r\n"); 
		 i_printf("\n\r>>>Flash Program Successfully. Thank you!\r\n"); 
		}
}
void down_pgm_ram(void)
{    
		 i_printf("\r\n");
		 i_printf("Download PGM to SDRAM \n\r");
		 i_printf("下载程序到内存 \n\r");
		 i_printf("\r\n>>>请用Xmodem模式发送文件<<");
		 i_printf("\r\n>>>Please Send File to Board by Xmodem Protocol...");
		 if (XModemReceive((char *)0x10000, 0xfffff) == -1)
			 {i_printf("\nTRANSFER FAILURE");}
		 i_printf(",...OK!\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");

⌨️ 快捷键说明

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