📄 main_entry.c
字号:
/*
//==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 + -