📄 shell.c
字号:
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;
CacheDisable() ; //
tftp_main(download_addr, Env.nic_cfg.ip);
CacheFlush() ; //
CacheEnable() ; //
if(download_len==-1)
puts("Tftp Download Aborted!\n");
else
printf("\nReceived %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;
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(%d) bytes success\n", download_len, 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();
//DRAM_BASE = 0x0c000000
//BOOT_PARAMS_ADDR = (DRAM_BASE+0x100)
/* if(((U32)fp & (~0xfff)) != (BOOT_PARAMS_ADDR & (~0xfff))) //modfied 2007.03.09
{
SetParams();
Delay(10);
}*/
CacheFlush();
CacheDisable(); //!!!???,先clean DCache, 再Disable DCache
BoardPrepareRun();
(*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;
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("copy flash from src to dst address\n");
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;
}
//ROM_BASE 0x00000000
//ROM_SIZE SIZE_2M (0x00200000)
//DRAM_BASE 0x00000000
memcpy((char *)DRAM_BASE, (char *)ROM_BASE, ROM_SIZE);
// download_addr = BIOS_LOAD;
download_addr = *(U32 *)BIOS_LOAD;//BIOS_LOAD (ROM_SIZE-4)
RunProgram(0, NULL);
return 0;
}
/*******************************************************************
[功能说明] 备份BIOS程序到 Flash 地址 1F0000 开始处
*******************************************************************/
int BackupBios(int argc, char *argv[])
{
printf("move bios to the top of rom,are you sure?");
if(!getyorn())
return 0;
//DRAM_BASE 0x0c000000
//ROM_SIZE 0x00200000
//BIOS_SIZE 0x00010000
//BIOS_BASE (ROM_SIZE-BIOS_SIZE) = 0x1F0000
//DFT_DOWNLOAD_ADDR (DRAM_BASE + 0x8000) = 0x0C008000
NorFlashRead(DFT_DOWNLOAD_ADDR, 0, 0x10000);//0xe000
NorFlashProg(BIOS_BASE, DFT_DOWNLOAD_ADDR, 0x10000);
// NorFlashRead(DFT_DOWNLOAD_ADDR, 0, 0x1000);
// NorFlashProg(BIOS_BASE, DFT_DOWNLOAD_ADDR, 0x1000);
return 0;
}
/*******************************************************************
[功能说明] 显示 FLASH 数据
*******************************************************************/
int FlashDisplay(int argc, char*argv[])
{
//memcpy((char *)(dst), (char *)(ROM_BASE+(src)), (int)(size))
unsigned int src_addr = 0;
unsigned int src;
unsigned int i, j;
unsigned int tmp_data[0x100];
if(argc > 1)
{
unsigned int tmp = strtoul((char *)argv[1]);
src_addr = (tmp==-1) ? src_addr : tmp;
src_addr &= ~0xf;
if(src_addr >= ROM_SIZE)
{
printf("Invalid flash address, the address is from 0~0x%x, 16Bits aligned\n", ROM_SIZE);
return -1;
}
}
printf("Press ESC key to exit, other key to continue...\n");
do{
src = src_addr;
src_addr += 0x100;
NorFlashRead(tmp_data, src, 0x100);
for(i=0; i<16; i++)
{
unsigned char ch;
printf("0x%08x:", src+(i<<4));
for(j=0; j<16; j++)
{
//ch = ((unsigned char *)src)[(i<<4)+j];
ch = ((unsigned char *)tmp_data)[(i<<4)+j];
putch(' ');
printf("%02x", 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');
}
printf("Press ESC key to exit, other key to continue...\n");
} while(src_addr < ROM_SIZE && getch()!=ESC_KEY);
//关闭cache后读tmp_data并打印才正常
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%08x:", src+(i<<4));
for(j=0; j<16; j++)
{
//ch = ((unsigned char *)tmp_data)[(i<<4)+j];
ch = ((unsigned char *)src)[(i<<4)+j];
putch(' ');
printf("%02x", 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))
goto err_exit;
if((mode==2)&&(addr&3))
goto err_exit;
// CacheDisable();
CacheFlush();
// CacheEnable();
printf("mem @0x%-8x = 0x%x\n",
addr,
(mode==2)?*(U32 *)addr:(mode==1)?*(U16 *)addr:*(U8 *)addr);
return 0;
err_exit:
puts("Usage : memd -c/s/l addr\n-c/s/l 8/16/32 bits\n");
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -