📄 main.c
字号:
}
return 0;
}
int AutoProgFlash(int argc, char *argv[])
{
char ch_tmp[3][10];
char *para_ptr[4];
ultostr(ch_tmp[0], DEF_START_ADDR);
ultostr(ch_tmp[1], DFT_DOWNLOAD_ADDR);
ultostr(ch_tmp[2], tftp_main(IP_ADDRESS, DFT_DOWNLOAD_ADDR, 1));
para_ptr[1] = ch_tmp[0];
para_ptr[2] = ch_tmp[1];
para_ptr[3] = ch_tmp[2];
ProgFlash(4, para_ptr);
return 0;
}
int CopyFlash(int argc, char *argv[])
{
unsigned int src, dst, size;
char tmp[10];
if(argc<4)
{
puts("Usage : copy a1 a2 size\n");
puts("a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n");
return -1;
}
src = strtoul(argv[1]);
dst = strtoul(argv[2]);
size = strtoul(argv[3]);
if(src==-1||dst==-1||size==-1)
{
puts("give error address\n");
return -1;
}
FlashRead(src, (unsigned short *)DFT_DOWNLOAD_ADDR, size);
argv[1] = argv[2];
argv[2] = tmp;
ultostr(tmp, DFT_DOWNLOAD_ADDR);
ProgFlash(4, argv);
return 0;
}
int SetIPAddr(int argc, char *argv[])
{
int i, j, err = 0;
char *str;
int ip[4];
char ch = '.';
if(argc<2)
{
printf("IP address : %u.%u.%u.%u\n", (IP_ADDRESS>>24)&0xff, (IP_ADDRESS>>16)&0xff, (IP_ADDRESS>>8)&0xff, IP_ADDRESS&0xff);
return 0;
}
str = argv[1];
for(j=0; j<4; j++)
{
if(j==3)
ch = 0;
i = 0;
if(str[++i]!=ch)
if(str[++i]!=ch)
if(str[++i]!=ch)
err = 1;
str[i] = 0;
ip[j] = strtodec(str, i);
if(ip[j]<0||ip[j]>254||err)
{
puts("IP address error\n");
return -1;
}
str += i+1;
}
printf("Set IP address : %u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]);
IP_ADDRESS = (ip[0]<<24)|(ip[1]<<16)|(ip[2]<<8)|ip[3];
return 0;
}
int LoadFromUart(int argc, char *argv[])
{
int start, time_out;
int load_addr = DFT_DOWNLOAD_ADDR;
if(argc>1)
{
start = strtoul(argv[1]);
if(load_addr>0)
load_addr = start;
}
start = load_addr;
#define WAIT_TIME 0x3000000
time_out = WAIT_TIME;
do{
if(kbhit())
{
*((U8 *)load_addr++) = getkey();
time_out = WAIT_TIME;
}
}while(--time_out);
printf("Received 0x%x bytes from serial port.\n", load_addr-start);
return 0;
#undef WAIT_TIME
}
int RunProgram(int argc, char *argv[])
{
void (*fp)(U32, U32) = (void (*)(U32, U32))DFT_DOWNLOAD_ADDR;
if(argc>1)
{
int p = strtoul(argv[1]);
if(p>0)
fp = (void (*)(U32, U32))p;
}
printf("Run program from 0x%x, are you sure? [y/n]", fp);
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;
}
}
}
(*fp)(0, 178);
return 0;
}
int MoveFlashToRam(int argc, char *argv[])
{
int rd_addr, wr_addr, size;
if(argc<4)
{
puts("Please enter move a1 a2 size\na1 = flash addr, a2 = ram addr\n");
return -1;
}
rd_addr = strtoul(argv[1]);
wr_addr = strtoul(argv[2]);
size = strtoul(argv[3]);
if(rd_addr==-1||wr_addr==-1||size==-1)
{
puts("Parameter erroe\n");
return -1;
}
FlashRead(rd_addr, (U16 *)wr_addr, size);
return 0;
}
/*********************************************************/
int Help(int argc, char *argv[]);
typedef int (*cmdproc)(int argc, char *argv[]);//定义cmdproc为指向函数的指针变量,返回指针值为int型
typedef struct {
char *cmd;
char *hlp;
cmdproc proc;//proc为cmdproc类型的指针变量
}CMD_STRUC;
CMD_STRUC CMD_INNER[] =
{ {"help", "show help", Help},
{"?", "= help", Help},
{"date", "show or set current date", GetDate},
{"time", "show or set current time", GetTime},
{"setweek", "set weekday", SetWeek},
{"clock", "show system running clock", SysClock},
{"setmclk", "set system running clock", ChgSysMclk},
{"setbaud", "set baud rate", ChgBaudRate},
{"load", "load file to memory", LoadFile2Mem},
{"comload", "load file from serial port", LoadFromUart},
{"prog", "program flash", ProgFlash},
{"boot", "boot from flash", BootLoader},
{"ap", "auto load image flie and program flash", AutoProgFlash},
{"copy", "copy flash from src to dst address", CopyFlash},
{"ipcfg", "show or set IP address", SetIPAddr},
{"run", "run from ram", RunProgram},
{"move", "move data from flash to ram", MoveFlashToRam},
#ifdef __LZ44B0X
{"lcdtest", "test lcd(192x64)", LcdDemo},
#endif
{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;
}
void LEDON(char i)
{
if(i==1)
{ rPDATC&=0xfff1;
rPDATC|=2;
}
if(i==2){
rPDATC&=0xfff1;
rPDATC|=4;
}
if(i==3){
rPDATC&=0xfff1;
rPDATC|=8;
}
}
void beep(char i)
{
if(i==0)
rPDATE|=0x20;
if(i==1)
rPDATE&=~0x20;
}
/*********************************************************/
/*主要函数*/
/********************************************************/
#include "44b0x.h"
int main()
{
int i, key,temp;
char command[MAX_CMD_LEN];
// ChangePllValue(88, 6, 1); //修改系统主频为6倍频
ChangePllValue(120, 8, 1); //修改系统主频为6.4倍频
PortInit();
console_init(SERIAL_BAUD);
next_line();
puts(table_begin);
for(i=0;i<20;i++){
beep(0);
delay(500000);
beep(1);
delay(500000);
}
puts("Bios for wanlong electronic institue http://www.embedchina.cn \n");
puts("designed by post ph.d superwang,tsinghua university\n");
SysClock(0, NULL);
printf("Serial Baud rate is %d\n", SERIAL_BAUD);
puts("Build date : ");
puts(__DATE__);
putch('-');
puts(__TIME__);
next_line();
puts(table_begin);
SysTime.year = 0x2046;
SysTime.month = 0x03;
SysTime.day = 0x15;
SysTime.weekday = 0x01;
SysTime.hour = 0x17;
SysTime.min = 0x09;
SysTime.sec = 0;
RtcSetDay(&SysTime);
RtcSetWeek(&SysTime);
RtcSetTime(&SysTime);
GetDate(0, NULL);
GetTime(0, NULL);
beep(1);
/*************************************/
printf("Flash ID is : %x\n", GetFlashID());
puts("Flash ID is : ");
outportw(0, 0x90);
printf("%x", inportw(2));
outportw(0, 0x90);
printf("%x", inportw(4));
prompt();
TextDisplayInit();
DelayNS(1);
clearpicture();//图片显示
DelayNS(1);
displaypicture( );
graphshow();
DelayNS(2);
TextDisplayInit();
clearsentence();
printsentence(0,"欢迎来到嵌入式! ");//xdenotes the start line the 12864module is 4 line and 8 column
printsentence(1,"天扬ARM-工作室~ ");
printsentence(2,"Tel:13760607590 ");
printsentence(3,"ltianyang.com.cn");
DelayNS(20);
clearsentence();
TimeDisplay();
/*rPCONG=0x00ff;
rPUPG=0x0;
rPDATG=0xf0;
flag_key=1;
while(flag_key){
while((rPDATG&0xf0)!=0xf0){
which_key=rPDATG&0xf0;
switch(which_key)
{
case 0xe0:
DelayNS(20);
Blink(0);//此函数用来测试反白效果
DelayNS(5);
flag_key=0;
break;
case 0xd0:
Blink(1);
DelayNS(10);
flag_key=0;
break;
case 0xb0:
Blink(2);
DelayNS(20);
flag_key=0;
break;
case 0x70:
Blink(3);
DelayNS(30);
flag_key=0;
break;
default:
break;
}
}
}
*/
puts("\ntype ? for help\nconnect UART0 to your host pc and type ap inside super terminal\n");
prompt();
i = 0;
for(;;)
{
temp++;
if(temp%100000==0)
LEDON(1);
if(temp%300000==0)
LEDON(2);
if(temp%600000==0)
LEDON(3);
if(temp%900000==0)
temp=0;
if(kbhit())
{
key = getkey();
if(key == BACK_KEY)
{
if(i)
{
putch(key);
putch(' ');
putch(key);
}
i -= i?1:0;
}
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 + -