📄 main.c
字号:
/*****************************************************************************************
the Bios for Samsung S3C44B0X Develop Board.
http://www.xlmcu.com
*****************************************************************************************/
#include "ctrl_set.h"
#include "console.h"
#include "utils.h"
#include "39vf160.h"
#include "DataType.h"
#define DFT_DOWNLOAD_ADDR 0x30008000
#define MAX_CMD_LEN 128
#define MAX_ARGS MAX_CMD_LEN/4
#define WAIT_TIME 0x200000
extern U32 MCLK;
int IP_ADDRESS = 0xc0a80064;
U32 SERIAL_BAUD = 115200;
U32 download_addr;
U32 program_begin;
char table_begin[] = "/*****************************************/\n";
#define prompt() puts("\\>")
/*********************************************************/
int GetParameter(char *str, int cnt)
{
int i, key;
i = 0;
while(1)
{
if(kbhit())
{
key = getkey();
if(key==BACK_KEY)
i -= i?1:0;
else
if(key==ENTER_KEY)
{
str[i] = 0;
return i;
}
else
if(i<cnt)
{
putch(key);
str[i++] = key;
}
}
}
}
int ProgFlash(int argc, char *argv[])
{
unsigned int size = ~0;
unsigned int data_begin = ~0;
unsigned int prog_begin = ~0;
int overwrite0 = 1;
int modify_a0 = 0;
unsigned int bios_load_addr;
char string[256];
if(argc<4)
{
puts("Arguments error!\n");
puts("Usage: prog a1 a2 size [-no0]\na1 = program begin address\na2 = data pointer to ram\nsize = program size(Bytes)\n-no0 = don't overwrite address 0\n");
return -1;
}
prog_begin = strtoul(argv[1]);
data_begin = strtoul(argv[2]);
size = strtoul(argv[3]);
if(size==0)
{
puts("Write 0 Bytes!\n");
return -1;
}
if(prog_begin==-1||data_begin==-1) //
{
puts("Arguments error\n");
return -1;
}
//printf("program flash begin @0x%x, from ram data @0x%x, size = %dBytes\nAre you sure? [y/n]", prog_begin, data_begin, size);
sprintf(string,"program flash begin @0x%x, from ram data @0x%x, size = %dBytes\nAre you sure? [y/n]", prog_begin, data_begin, size);
UartSendString(CONSOLE_UART, string);
while(1)
{
if(kbhit())
{
int key = getkey();
if(key=='y'||key=='Y')
{
putch(key);
next_line();
break;
}
if(key=='n'||key=='N')
{
putch(key);
next_line();
return 0;
}
}
}
SectorProg(prog_begin, (unsigned short *)data_begin, size);
return 0;
}
int LoadFromUart(int argc, char *argv[])
{
int start, time_out,i,size;
int load_addr = DFT_DOWNLOAD_ADDR;
unsigned char len[4];
char *str;
char string[256];
if(argc==1)
{
//printf("comload 0x00000 -n don't transmit address\n");
//printf("comload 0x00000 transmit address\n");
sprintf(string,"comload 0x00000 -n don't transmit address\n");
UartSendString(CONSOLE_UART, string);
sprintf(string,"comload 0x00000 transmit address\n");
UartSendString(CONSOLE_UART, string);
return 0;
}
else
{
if(argc==2)
{
str = argv[1];
if(*str=='-')
{
//printf("comload 0x00000 -n don't transmit address\n");
//printf("comload 0x00000 transmit address\n");
sprintf(string,"comload 0x00000 -n don't transmit address\n");
UartSendString(CONSOLE_UART, string);
sprintf(string,"comload 0x00000 transmit address\n");
UartSendString(CONSOLE_UART, string);
return 0;
}
else// transmit address uese sumsang's DNW software
{
if((strlen(str)>2)&&((str[1]=='x')||(str[1]=='X')))
str=str+2;
start=strtoul(str);
if(load_addr>0)
load_addr = start;
time_out = WAIT_TIME;
i=0;
do{
if(kbhit())
{
len[i] = getkey();
time_out = WAIT_TIME;
i++;
}
}while((--time_out)&&(i<4));
if(time_out==0)
{
//printf("Time out!\n");
sprintf(string,"Time out!\n");
UartSendString(CONSOLE_UART, string);
return 0;
}
size=((int)len[0] | (int)len[1]<<8 | (int)len[2]<<16 | (int)len[3]<<24)-6;
do{
if(kbhit())
{
*((U8 *)load_addr++) = getkey();
time_out = WAIT_TIME;
}
}while((--time_out)&&((load_addr-start)<size));
//printf("Transmitted data length is 0x%x!\n",size);
sprintf(string,"Transmitted data length is 0x%x!\n",size);
UartSendString(CONSOLE_UART, string);
if(size!=(load_addr-start))
{
//printf("Received data length is error!\n");
sprintf(string,"Received data length is error!\n");
UartSendString(CONSOLE_UART, string);
return 0;
}
if(time_out==0)
//printf("Time out!\n");
{
sprintf(string,"Time out!\n");
UartSendString(CONSOLE_UART, string);
}
else
//printf("Received 0x%x bytes from serial port.\n", size);
{
sprintf(string,"Received 0x%x bytes from serial port.\n", size);
UartSendString(CONSOLE_UART, string);
}
/* 软件多传输一个字节,清掉*/
do{
if(kbhit())
{
getkey();
time_out = 1;
}
}while(--time_out);
return 0;
}
}
else// don't transmit address
{
str = argv[1];
if((strlen(str)>2)&&((str[1]=='x')||(str[1]=='X')))
str=str+2;
start=strtoul(str);
//start = strtoul(argv[1]);
if(load_addr>0)
load_addr = start;
time_out = WAIT_TIME;
i=0;
do{
if(kbhit())
{
U8 temp;
if(i<4)
{
temp=getkey();
time_out = WAIT_TIME;
i++;
}
else
{
*((U8 *)load_addr++) = getkey();
time_out = WAIT_TIME;
}
}
}while(--time_out);
//printf("Received 0x%x (%d)bytes from serial port.\n", load_addr-start,load_addr-start);
sprintf(string,"Received 0x%x (%d)bytes from serial port.\n", load_addr-start,load_addr-start);
UartSendString(CONSOLE_UART, string);
return 0;
}
}
}
typedef int (*cmdproc)(int argc, char *argv[]);
typedef struct {
char *cmd;
char *hlp;
cmdproc proc;
}CMD_STRUC;
int Help(int argc, char *argv[]);
CMD_STRUC CMD_INNER[] =
{
{"help", "show help", Help},
{"?", "= help", Help},
{"comload", "load file from serial port", LoadFromUart},
{"prog", "program flash", ProgFlash},
{NULL, NULL, NULL}
};
/*********************************************************/
int Help(int argc, char *argv[])
{
int i;
for(i=0; CMD_INNER[i].cmd!=NULL; i++)
{
if(CMD_INNER[i].hlp!=NULL)
{
puts(CMD_INNER[i].cmd);
puts(" ------ ");
puts(CMD_INNER[i].hlp);
putch('\n');
}
}
return 0;
}
static void ParseArgs(char *cmdline, int *argc, char **argv)
{
#define STATE_WHITESPACE 0
#define STATE_WORD 1
char *c;
int state = STATE_WHITESPACE;
int i;
*argc = 0;
if(strlen(cmdline) == 0)
return;
/* convert all tabs into single spaces */
c = cmdline;
while(*c != '\0')
{
if(*c == '\t')
*c = ' ';
c++;
}
c = cmdline;
i = 0;
/* now find all words on the command line */
while(*c != '\0')
{
if(state == STATE_WHITESPACE)
{
if(*c != ' ')
{
argv[i] = c; //将argv[i]指向c
i++;
state = STATE_WORD;
}
}
else
{ /* state == STATE_WORD */
if(*c == ' ')
{
*c = '\0';
state = STATE_WHITESPACE;
}
}
c++;
}
*argc = i;
#undef STATE_WHITESPACE
#undef STATE_WORD
}
static int GetCmdMatche(char *cmdline)
{
int i;
for(i=0; CMD_INNER[i].cmd!=NULL; i++)
{
if(strncmp(CMD_INNER[i].cmd, cmdline, strlen(CMD_INNER[i].cmd))==0)
return i;
}
return -1;
}
static int ParseCmd(char *cmdline, int cmd_len)
{
int argc, num_commands;
char *argv[MAX_ARGS];
ParseArgs(cmdline, &argc, argv);
/* only whitespace */
if(argc == 0)
return 0;
num_commands = GetCmdMatche(argv[0]);
if(num_commands<0)
return -1;
if(CMD_INNER[num_commands].proc!=NULL)
CMD_INNER[num_commands].proc(argc, argv);
return 0;
}
/*********************************************************/
int main()
{
int i, key;
char command[MAX_CMD_LEN];
char string[256];
ChangePllValue(72, 6, 1); //修改系统主频为6倍频
PortInit();
console_init(SERIAL_BAUD);
next_line();
puts(table_begin);
puts(" Flash Programer v1.0 \n");
puts(" For S3C2410X\n");
//SysClock(0, NULL);
//printf(" Serial Baud rate is %d\n", SERIAL_BAUD);
sprintf(string," Serial Baud rate is %d\n", SERIAL_BAUD);
UartSendString(CONSOLE_UART, string);
puts(" Build date: ");
puts(__DATE__);
putch('-');
puts(__TIME__);
next_line();
puts(" Author : Klim ");
next_line();
//printf(" Flash ID : %x\n", GetFlashID());
sprintf(string," Flash ID : %x\n", GetFlashID());
UartSendString(CONSOLE_UART, string);
puts(table_begin);
//GetDate(0, NULL);
//GetTime(0, NULL);
next_line();
/*************************************/
puts("help ------ show help\n");
puts("? ------ = help\n");
puts("comload ------ load file from serial port\n");
puts("prog ------ program flash\n");
next_line();
prompt();
i = 0;
for(;;)
{
if(kbhit())
{
key = getkey();
if(key == BACK_KEY)
{
i -= i?1:0;
putch(key);
}
else
if(key == ENTER_KEY)
{
int tmp;
command[i] = 0;
putch('\n');
tmp = ParseCmd(command, i);
if(tmp<0)
puts("Bad command\n");
prompt();
i = 0;
}
else
{
if(i<MAX_CMD_LEN-1)
{
command[i++] = key;
putch(key);
}
}
}
}
}
/*********************************************************/
int pIrqStart = 0;
int pIrqHandler = 0;
int pIrqFinish = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -