📄 shell.c
字号:
if(argc<2)
return 0;
str = argv[1];
if(str[4]!='-')
error=1;
str[4]=0;
year = strtobcd(str);
if((year<0x2000)||(year>0x2099)||error) {
printf("year error!\n");
return -1;
}
str += 5;
i = 0;
if(str[++i]!='-')
if(str[++i]!='-')
error = 1;
str[i] = 0;
month = strtobcd(str);
if((month-1)>0x11||error) {
printf("month error!\n");
return -1;
}
str += i+1;
i = 0;
if(str[++i]!=0)
if(str[++i]!=0)
error = 1;
str[i] = 0;
day = strtobcd(str);
if((day-1)>0x30||error) {
printf("day error!\n");
return -1;
}
SysTime.year = year;
SysTime.month = month;
SysTime.day = day;
RtcSetDay(&SysTime);
printf("Set ");
GetDate(0, NULL);
return 0;
}
/*******************************************************************************************************/
int SetWeek(int argc, char *argv[])
{
unsigned int i;
int error = 0;
if(argc<2)
error = 1;
i = strtodec(argv[1], 1);
if((i-1)>6) //0-1 = 0xffffffff
error = 1;
if(!error) {
SysTime.weekday = i; //1~7
RtcSetWeek(&SysTime);
//printf("Set to %s\n", WeekDay[i-1]);
GetDate(0, NULL);
} else {
printf("Please enter a number to set weekday\n");
for(i=1; i<=7; i++) {
printf("%d : %s\n", i, WeekDay[i-1]);
}
}
return 0;
}
#endif
/*******************************************************************************************************/
#ifdef SET_SYSCLK_SUPPORT
int ChgSysClk(int argc, char *argv[])
{
printf("This function is for adjust system running clock!!!\n");
ShowSysClock(0, NULL);
if(!SetSysClock()) {
GetSysClockPara(Env.clk_para);
TimerInit(TIMER_FREQ);
SerialChgBaud(Env.baud);
Delay(100);
ShowSysClock(0, NULL);
}
return 0;
}
#endif
/*******************************************************************************************************/
int ChgBaudRate(int argc, char *argv[])
{
int i;
for(i=0; BaudSet[i]; i++)
printf("%d : %d\n", i, BaudSet[i]);
printf("Please enter choice : ");
while(1)
{
int ch = getch();
if(ch<='6'||ch>='0')
{
Env.baud = BaudSet[ch-'0'];
printf("Baud rate set to : %d\nPress any key to continue\n", Env.baud);
i = 0x4000;
while(i--); //wait transmit end
SerialChgBaud(Env.baud);
getch();
break;
}
}
return 0;
}
/*******************************************************************************************************/
#ifdef TFTP_DOWNLOAD_SUPPORT
int SetIpAddr(int argc, char *argv[])
{
int i, j, err = 0;
char *str;
char ch = '.';
U32 ip[4];
if(argc<2) {
printf("IP address : %u.%u.%u.%u\n", (Env.nic_cfg.ip>>24)&0xff, (Env.nic_cfg.ip>>16)&0xff, (Env.nic_cfg.ip>>8)&0xff, Env.nic_cfg.ip&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]>=255)||err) {
printf("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]);
Env.nic_cfg.ip = (ip[0]<<24)|(ip[1]<<16)|(ip[2]<<8)|ip[3];
return 0;
}
int LoadFromNet(int argc, char *argv[])
{
if(argc<2)
download_addr = DFT_DOWNLOAD_ADDR;
else {
unsigned long tmp;
tmp = strtoul((char*)argv[1]);
download_addr = (tmp==-1)?download_addr:tmp;
}
printf("Now download file from net to 0x%x...\n", download_addr);
download_len = -1;
tftp_main(download_addr, Env.nic_cfg.ip);
if(download_len==-1) {
puts("Tftp Download Aborted!\n");
} else
printf("\n Received %x bytes success\n", download_len);
return download_len;
}
int NetLoadRun(int argc, char *argv[])
{
if(LoadFromNet(argc, argv)>0) {
RunProgram(0, NULL);
}
return 0;
}
#endif /*TFTP_DOWNLOAD_SUPPORT*/
//中断入口内容不可确定,不要用中断
int LoadFromUart(int argc, char *argv[])
{
int i, size;
unsigned short dnCS, CheckSum;
unsigned char *buf = (unsigned char *)DFT_DOWNLOAD_ADDR;
unsigned char RxTmp[8];
if(argc<2)
download_addr = DFT_DOWNLOAD_ADDR;
else {
unsigned long tmp;
tmp = strtoul((char*)argv[1]);
download_addr = (tmp==-1)?download_addr:tmp;
}
buf = (unsigned char *)download_addr;
printf("Now download file from uart0 to 0x%x...\n", download_addr);
i = 0;
while(i<4)
RxTmp[i++] = getch();
i = 0;
size = *(unsigned long *)RxTmp - 4;
size = size & 0x1fffff ;
printf("\ndownload size = 0x%x bytes\n", size);
while(i<size)
buf[i++] = getch();
download_len = size-2;
dnCS = (buf[size-1]<<8)|buf[size-2];
CheckSum = 0;
for(size -= 3; size>=0; size--)
CheckSum += buf[size];
if( dnCS!=CheckSum )
{
// printf("get CS=0x%08x, cal CS=0x%08x\n", dnCS, CheckSum);
puts("\nCheckSum error!\n");
download_len = -1;
}
else
{
printf("\nReceived %x bytes success\n", download_len);
}
return download_len;
}
int UartLoadRun(int argc, char *argv[])
{
if(LoadFromUart(argc, argv)>0) {
RunProgram(0, NULL);
}
return 0;
}
//*****************************************************************************
int RunProgram(int argc, char *argv[])
{
void (*fp)(U32, U32) = (void (*)(U32, U32))download_addr;
if(argc>1) {
unsigned int p = strtoul((char *)argv[1]);
if((p!=-1)&&!(p&3))
fp = (void (*)(U32, U32))p;
}
printf("Run program from 0x%x\n", fp);
if(argc) {
printf("are you sure?");
if(!getyorn())
return 0;
}
DisableInt();
if(((U32)fp&~0xfff)!=(BOOT_PARAMS_ADDR&~0xfff)) {
SetParams();
Delay(10);
}
CacheFlush();
CacheDisable(); //!!!???,先clean DCache, 再Disable DCache
(*fp)(0, Env.machine);
return 0;
}
int MoveMem(int argc, char*argv[])
{
unsigned int src, dst, size;
if(argc<4) {
printf("Usage : move a1 a2 size\n");
printf("a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n");
return -1;
}
src = strtoul((char *)argv[1]);
dst = strtoul((char *)argv[2]);
size = strtoul((char *)argv[3]);
if(src==-1||dst==-1||size==-1) {//||(dst-size)<src) {
printf("give error address\n");
return -1;
}
memcpy((char *)dst, (char *)src, size);
printf("move finished!\n");
return 0;
}
int MoveRun(int argc, char *argv[])
{
unsigned long size;
char *s, *r, *i;
//printf("clear memory from 0x%x to 0x%x\n", DRAM_BASE, __ENTRY);
//memset((char *)DRAM_BASE, 0, (U32)__ENTRY-DRAM_BASE);
if((Env.prog_s_addr>=ROM_END)||(Env.prog_s_addr&0x3)||(Env.prog_r_addr&0x3)) {
puts("Bad address\n");
return -1;
}
//SetParams();
s = (char *)Env.prog_s_addr;
r = (char *)Env.prog_r_addr;
i = (char *)(Env.initrd_addr&~0xfff);
size = 0x100000;//ROM_END - Env.prog_s_addr;
#ifdef NAND_FLASH_SUPPORT
if(Env.saved_in&1)
{
if(RdFileFrNF(Env.prog_r_addr, (U32)s>>12))
return -1;
if(Env.saved_in&2)
if(RdFileFrNF(DFT_INITRD_ADDR, (U32)i>>12))
return -1;
}
else
#endif
#ifdef NOR_FLASH_SUPPORT
{
NorFlashRead(r, s, size);
if(Env.saved_in&2)
NorFlashRead(DFT_INITRD_ADDR, i, 0x100000);
}
#else
return 0;
#endif
download_addr = Env.prog_r_addr;
RunProgram(0, NULL);
return 0;
}
#ifdef NOR_FLASH_SUPPORT
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;
prog_begin = Env.prog_s_addr;
data_begin = download_addr;
size = download_len;
if(!strncmp(argv[argc-1], "-no0", 5)) {
overwrite0 = 0;
argc--;
}
if(argc>1)
prog_begin = strtoul((char *)argv[1]);
if(argc>2)
data_begin = strtoul((char *)argv[2]);
if(argc>3)
size = strtoul((char *)argv[3]);
if((prog_begin==-1)||(data_begin==-1)||(size==-1)) {
printf("Arguments error!\n");
goto err_exit;
}
if(!size) {
printf("Write 0 Bytes!\n");
} else {
printf("program flash begin @0x%x, from ram data @0x%x, size = %dBytes\nAre you sure?", prog_begin, data_begin, size);
if(!getyorn())
return 0;
if((prog_begin==0)&&overwrite0) {
unsigned int ins;
ins = *(unsigned int *)data_begin;
if((ins>>24)==0xea) // instruction: b xxxx, now just support b instruction!!!
bios_load_addr = ((ins&0xffffff)<<2)+8;
else
bios_load_addr = 4; // other instruction, jump to 4
//bios_load_addr = (bios_load_addr-BIOS_LOAD-8)/4;
//bios_load_addr = (bios_load_addr&0xffffff)|0xea000000;
*(unsigned int *)data_begin = 0xea000000+(BIOS_BASE-8)/4;
modify_a0 = 1;
}
NorFlashProg(prog_begin, data_begin, size);
if(modify_a0)
NorFlashProg(BIOS_LOAD, (U32)&bios_load_addr, 4);
}
return 0;
err_exit:
printf("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;
}
//*****************************************************************************
/******************************************************************************
【功能说明】通过TFTP软件,将目标代码通过以太网下载的SDRAM,然后将下载的代码烧写
到Flash中去,不过在Flash最低地址放置了跳转到BIOS的跳转指令,适合于烧写应用程序
******************************************************************************/
int AutoLoadAndProgFlash(int argc, char *argv[])
{
char ch_tmp[3][10];
char *para_ptr[5];
int (*DnProg)(int argc, char *argv[]);
int prog_bios = 0;
#ifdef TFTP_DOWNLOAD_SUPPORT
DnProg = LoadFromNet;
#else
DnProg = XmodemReceive;
#endif
if(argc>1) {
if(strncmp(argv[1], "-b", 3)==0)
prog_bios = 1;
else if(strncmp(argv[1], "-c", 3)==0)
DnProg = LoadFromUart;
else if(strncmp(argv[1], "-x", 3)==0)
DnProg = XmodemReceive;
else
goto err_exit;
if(argc>2) {
if(strncmp(argv[2], "-b", 3)==0)
prog_bios = 1;
else if(strncmp(argv[2], "-c", 3)==0)
DnProg = LoadFromUart;
else if(strncmp(argv[1], "-x", 3)==0)
DnProg = XmodemReceive;
else
goto err_exit;
}
}
if((DnProg)(0, NULL)<0)
return 0;
ultostr((char *)ch_tmp[0], 0);
ultostr((char *)ch_tmp[1], download_addr);
ultostr((char *)ch_tmp[2], download_len);
para_ptr[1] = ch_tmp[0];
para_ptr[2] = ch_tmp[1];
para_ptr[3] = ch_tmp[2];
para_ptr[4] = prog_bios?"-no0":NULL;
ProgFlash(prog_bios?5:4, para_ptr);
return 0;
err_exit:
printf("Usage ap [-b] [-c] [-x]\n-b for bios\n-c download by uart\n-x xmodem download\n");
return -1;
}
//*****************************************************************************
int CopyFlash(int argc, char *argv[])
{
unsigned int src, dst, size;
if(argc<4) {
printf("Usage : copy a1 a2 size\n");
printf("a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n");
return -1;
}
src = strtoul((char *)argv[1]);
dst = strtoul((char *)argv[2]);
size = strtoul((char *)argv[3]);
if(src==-1||dst==-1||size==-1) {
printf("give error address\n");
return -1;
}
NorFlashRead(DFT_DOWNLOAD_ADDR, src, size);
NorFlashProg(dst, DFT_DOWNLOAD_ADDR, size);
return 0;
}
int BootLoader(int argc, char *argv[])
{
printf("boot from flash, are you sure?");
if(argc)
if(!getyorn())
return 0;
memcpy((char *)DRAM_BASE, (char *)ROM_BASE, ROM_SIZE);
// download_addr = BIOS_LOAD;
download_addr = *(U32 *)BIOS_LOAD;
RunProgram(0, NULL);
return 0;
}
int BackupBios(int argc, char *argv[])
{
printf("move bios to the top of rom,are you sure?");
if(!getyorn())
return 0;
NorFlashRead(DFT_DOWNLOAD_ADDR, 0, 0xe000);
NorFlashProg(BIOS_BASE, DFT_DOWNLOAD_ADDR, 0xe000);
return 0;
}
#endif /*NOR_FLASH_SUPPORT*/
int MemoryDisplay(int argc, char*argv[])
{
static unsigned int src_addr;
unsigned int src;
unsigned int i, j;
// unsigned int tmp_data[64];
if(argc > 1) {
unsigned int tmp = strtoul((char *)argv[1]);
src_addr = (tmp==-1)?src_addr:tmp;
src_addr &= ~0xf;
}
printf("Press ESC key to exit, other key to continue...\n");
do {
src = src_addr;
src_addr += 0x100;
// CacheDisable();
CacheFlush(); //防止tmp_data被cache
// CacheEnable();
//for(i=0; i<64; i++)
// tmp_data[i] = ((unsigned int *)src)[i];
for(i=0; i<16; i++) {
unsigned char ch;
printf("0x%-8x:", src+(i<<4));
for(j=0; j<16; j++) {
//ch = ((unsigned char *)tmp_data)[(i<<4)+j];
ch = ((unsigned char *)src)[(i<<4)+j];
printf("%3x", ch);
}
putch(' ');
putch(' ');
for(j=0; j<16; j++) {
//ch = ((unsigned char *)tmp_data)[(i<<4)+j];
ch = ((unsigned char *)src)[(i<<4)+j];
putch((ch>=0x20&&ch<0x80)?ch:'.');
}
putch('\n');
}
} while(getch()!=ESC_KEY);
//关闭cache后读tmp_data并打印才正常
return 0;
}
int MemoryShow(int argc, char*argv[])
{
unsigned long addr;
int mode;
if(argc!=3)
goto err_exit;
if(!strncmp(argv[1], "-c", 3))
mode = 0;
else if(!strncmp(argv[1], "-s", 3))
mode = 1;
else if(!strncmp(argv[1], "-l", 3))
mode = 2;
else
goto err_exit;
addr = strtoul((char *)argv[2]);
if(addr==-1)
goto err_exit;
if((mode==1)&&(addr&1))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -