📄 command.c
字号:
//***************************************************************
// ARM BOOT ROUTE VER1.0@0x0C000000 for 44B0X release
// bjwork@po-star.com
// chenjun @ 2005-6-10
//***************************************************************
#include "..\inc\command.h"
#include "..\inc\common.h"
#include "..\inc\utilities.h"
#include "..\inc\sysinit.h"
#include "..\inc\usart.h"
#include "..\inc\NorFlash.h"
#include "..\inc\watchdog.h"
// command default
int List(int argc, char *argv[]);
int ShowMemory(int argc, char *argv[]);
int LoadFromUart(int argc, char *argv[]);
int UploadFromUart(int argc, char *argv[]);
int ComRun(int argc, char *argv[]);
int RunProgram(int argc, char *argv[]);
int Check(int argc, char *argv[]);
int FillMemory(int argc, char *argv[]);
int Mcopy(int argc, char *argv[]);
int Mcut(int argc, char *argv[]);
int Changemclk(int argc, char *argv[]);
int ModifyReg(int argc, char *argv[]);
int Batch(int argc, char *argv[]);
int DelayTime(int argc, char *argv[]);
int RDFlash(int argc, char *argv[]);
int EraseFlashChip(int argc, char *argv[]);
int ProgFlash(int argc, char *argv[]);
int AutoProgFlash(int argc, char *argv[]);
int ResetBoard(int argc, char *argv[]);
int ProgAPPBoot(int argc, char *argv[]);
int ProgAPP(int argc, char *argv[]);
typedef int (*cmdproc)(int argc, char *argv[]);
typedef struct {
char *command;
char *cmdclass;
cmdproc proc;
}CMD_STRUC;
CMD_STRUC CMD_INNER[] ={
{"ls", "sys", List},
{"disp", "sys", ShowMemory},
{"run", "sys", RunProgram},
{"reset", "sys", ResetBoard},
{"comload", "com", LoadFromUart},
{"comupld", "com", UploadFromUart},
{"comrun", "com", ComRun},
{"bcheck", "ram", Check},
{"fill", "ram", FillMemory},
{"memcopy", "ram", Mcopy},
{"memcut", "ram", Mcut},
{"mclk", "sys", Changemclk},
{"modadd", "sys", ModifyReg},
{"batch", "sys", Batch},
{"delay", "sys", DelayTime},
{"rdpf", "flash", RDFlash},
{"erspf", "flash", EraseFlashChip},
{"progpf", "flash", ProgFlash},
{"fdpf", "flash", AutoProgFlash},
{"fdpab", "flash", ProgAPPBoot},
{"fdpap", "flash", ProgAPP},
{NULL, NULL, NULL}
};
/////////////////////////////////// ctrl route ////////////////////////////////
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
}
int GetCmdMatche(char *cmdline)
{
int i;
for(i=0; CMD_INNER[i].command!=NULL; i++)
{
if(strncmp(CMD_INNER[i].command, cmdline)==0)
return i;
}
return -1;
}
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 console(void)
{
unsigned char i;
char key;
int tmp;
char command[MAX_CMD_LEN];
i = 0;
for(;;)
{
if(kbhit())
{
key = getkey();
if(key == '\b')
{
if(i>0)
i--;
}
else
if(key == '\r')
{
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);
}
}
}
}
}
///////////////////////////////// command route //////////////////////////////
int List(int argc, char *argv[])
{
int i,j;
j = 0;
for(i=0; CMD_INNER[i].command!=NULL; i++)
{
j++;
}
putch('\n');
for(i=0; i<j; i++)
{
puts(CMD_INNER[i].command);
puts(" ");
if ((i & 0x3) == 0x3)
{ putch('\n');}
}
if ((j % 4) == 0)
putch('\n');
else
puts("\n\n");
return 0;
}
int LoadFromUart(int argc, char *argv[])
{
unsigned int start;
unsigned int time_out;
int load_addr;
if(argc < 2)
{
puts("Usage: comload <RamStartAdd>\n");
puts(" RamStartAdd = download begin address from RAM\n");
puts(" RamBase = 0x0c00_0000\n");
puts("Version: V1.0 by chenjun 2005.4.5\n\n");
return 1;
}
start = (unsigned int)strtoul(argv[1]);
load_addr = start;
printf("download data @0x%x\n", load_addr);
time_out = 0xffffffff;
do{
if(kbhit())
{
*((unsigned char *)load_addr++) = getkey();
time_out = 0x10000;
}
}while(--time_out);
printf("Received 0x%x(%d) bytes from usart!\n", load_addr-start, load_addr-start);
return 0;
}
int UploadFromUart(int argc, char *argv[])
{
unsigned int start;
unsigned int size;
unsigned int i;
if(argc < 3)
{
puts("Usage: comupld <RamStartAdd> <Size>\n");
puts(" RamStartAdd = download begin address from RAM\n");
puts(" RamBase = 0x0c00_0000\n");
puts("Version: V1.0 by chenjun 2005.6.11\n\n");
return 1;
}
start = (unsigned int)strtoul(argv[1]);
size = (unsigned int)strtoul(argv[2]);
puts("Press any key to start unload!\n");
while(1)
{
if(kbhit())
{break;}
}
Delay(1000000); //delay for pc size program prepare to autocapture
for(i=0;i<size;i++)
{
sendbyte(Uart0,*((unsigned char *)(start+i)));
}
Delay(39000000); //delay for pc size program timeout to terminate autocapture
return 0;
}
int ComRun(int argc, char *argv[])
{
unsigned int load_addr;
unsigned int time_out;
void (*fp)(void);
load_addr = 0x82000000;
puts("Pls send your newcode for test!@ sdram addr:0x8200_0000\n");
time_out = 0xffffffff;
do{
if(kbhit())
{
*((unsigned char *)load_addr++) = getkey();
time_out = 0x10000;
}
}while(--time_out);
fp = (void (*)(void))(0x0);
(*fp)();
return 0;
}
int ShowMemory(int argc, char *argv[])
{
unsigned int startadd;
unsigned int tempadd,tempadd2;
unsigned int tempvalue;
unsigned char tempchar;
unsigned char dispmode;
unsigned char i,k;
dispmode = (unsigned char)((strtoul(argv[2])) & 0xff);
startadd = (unsigned int)((strtoul(argv[1])) & 0xfffffff0);
if(argc < 3)
{
puts("Usage: disp <RamStartAdd> <Org>\n");
puts(" Org = 0:Byte mode,other value:Word mode\n");
puts("Version: V2.2 by chenjun 2005.4.7\n\n");
return 1;
}
if (startadd > startadd + 0x80)
{tempadd = (0xffffffff - (startadd - 1));}
else
{tempadd = 0x80;}
if (dispmode == 0)//8bit display
{
puts("--------------------------------------------------------------------------------\n");
for (tempadd2 = 0;tempadd2 < tempadd;tempadd2 += 4)
{
tempvalue = *((unsigned int *)(startadd + tempadd2));
if ((tempadd2 & 0x0f) == 0)
{ printf("0x%.8x %.2x %.2x %.2x %.2x",startadd + tempadd2,tempvalue & 0xff,
(tempvalue >> 8) & 0xff,(tempvalue >> 16) & 0xff,(tempvalue >> 24) & 0xff); }
else if ((tempadd2 & 0x0f) == 4)
{ printf(" %.2x %.2x %.2x %.2x",tempvalue & 0xff,(tempvalue >> 8) & 0xff,
(tempvalue >> 16) & 0xff,(tempvalue >> 24) & 0xff); }
else if ((tempadd2 & 0x0f) == 8)
{ printf("-%.2x %.2x %.2x %.2x",tempvalue & 0xff,(tempvalue >> 8) & 0xff,
(tempvalue >> 16) & 0xff,(tempvalue >> 24) & 0xff); }
else if ((tempadd2 & 0x0f) == 0x0c)
{ printf(" %.2x %.2x %.2x %.2x ",tempvalue & 0xff,(tempvalue >> 8) & 0xff,
(tempvalue >> 16) & 0xff,(tempvalue >> 24) & 0xff);
for(k=4;k>0;k--)
{
tempvalue = *((unsigned int *)((startadd + tempadd2)-(k-1)*4));
for(i=0;i<4;i++)
{
tempchar =(unsigned char)(tempvalue & 0xff);
if ((tempchar<32)|(tempchar>126))
{putch(46);}
else
{putch(tempchar);}
tempvalue >>= 8;
}
}
puts("\r\n");
}
}
putch('\n');
}
else //32bit display
{
puts("------------------------------------------------------\n");
for (tempadd2 = 0;tempadd2 < tempadd;tempadd2 += 4)
{
tempvalue = *((unsigned int *)(startadd + tempadd2));
if ((tempadd2 & 0x0f) == 0)
{printf("0x%.8x %.8x ",startadd + tempadd2,tempvalue);}
else if ((tempadd2 & 0x0f) == 0x0c)
{printf("%.8x\n",tempvalue);}
else
{printf("%.8x ",tempvalue);}
}
putch('\n');
}
return 0;
}
int RunProgram(int argc, char *argv[])
{
unsigned int p;
void (*fp)(void);
char key;
if(argc>1)
{
p = (unsigned int)strtoul(argv[1]);
fp = (void (*)(void))p;
}
else
{
puts("Usage: run <RamAdd>\n");
puts("Version: V2.0 by chenjun 2005.4.5\n\n");
return 1;
}
printf("Run program from 0x%x, are you sure? [y/n]", fp);
while(1)
{
if(kbhit())
{
key = getkey();
if(key=='y'||key=='Y')
{
putch(key);
putch('\n');
break;
}
if(key=='n'||key=='N')
{
putch(key);
putch('\n');
return 0;
}
}
}
(*fp)();
return 0;
}
int Check(int argc, char *argv[])
{
if(argc < 4)
{
puts("Usage: bcheck <block1Add> <block2Add> <Size>\n");
puts("Version: V1.0 by chenjun 2005.4.6\n\n");
return 1;
}
MemoryBlockCheck((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[2]),(unsigned int)strtoul(argv[3]));
return 0;
}
int FillMemory(int argc, char *argv[])
{
if(argc < 5)
{
puts("Usage: fill <RamStartAdd> <Size> <Value> <Org>\n");
puts(" Org = 1:Byte,2:Halfword,4:Word,other value will be reset to 1\n");
puts("Version: V1.0 by chenjun 2005.4.5\n\n");
return 1;
}
Memoryfill((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[2]),(unsigned int)strtoul(argv[3]),(unsigned char)(strtoul(argv[4]) & 0xff));
return 0;
}
int Mcopy(int argc, char *argv[])
{
if(argc < 4)
{
puts("Usage: memcopy <block1Add> <block2Add> <Size>\n");
puts("Version: V1.1 by chenjun 2005.4.7\n\n");
return 1;
}
MemoryCopy((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[2]),(unsigned int)strtoul(argv[3]));
return 0;
}
int Mcut(int argc, char *argv[])
{
if(argc < 4)
{
puts("Usage: memcut <block1Add> <block2Add> <Size>\n");
puts("Version: V1.1 by chenjun 2005.4.7\n\n");
return 1;
}
MemoryCopy((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[2]),(unsigned int)strtoul(argv[3]));
Memoryfill((unsigned int)strtoul(argv[1]),(unsigned int)strtoul(argv[3]),0,0);
puts("block cut successfilly!\n");
return 0;
}
int Changemclk(int argc, char *argv[])
{
unsigned char mdiv,pdiv,sdiv;
if(argc < 4)
{
puts("Usage: mclk <mdiv> <pdiv>\n");
puts(" MCLK = (EXT_OSC_CLK * (mdiv+8)) / ((pdiv+2) * (2 ^ sdiv))\n");
printf(" Current MCLK = %dHz\n", MCLK);
puts("Version: V1.0 by chenjun 2005.4.5\n\n");
return 1;
}
mdiv = (unsigned char)(strtoul(argv[1]) & 0xff);
pdiv = (unsigned char)(strtoul(argv[2]) & 0xff);
sdiv = (unsigned char)(strtoul(argv[3]) & 0xff);
Delay(10000);
SetPll(mdiv,pdiv);
Delay(10000);
ConsoleInit();
Delay(10000);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -