📄 shell.c
字号:
src = strtoul((unsigned char *)argv[1]);
dst = strtoul((unsigned char *)argv[2]);
size = strtoul((unsigned char *)argv[3]);
if(src==-1||dst==-1||size==-1)
{
Uart_Printf("give error address\n");
return -1;
}
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
FlashRead(src, (unsigned short *)DFT_DOWNLOAD_ADDR, size);
rNCACHBE0 = cache_cfg;
argv[1] = argv[2];
argv[2] = tmp;
ultostr((unsigned char *)tmp, DFT_DOWNLOAD_ADDR);
ProgFlash(4, argv);
return 0;
}
int BootLoader(int argc, char *argv[])
{
Uart_Printf("boot from flash, are you sure?");
if(getyorn()) {
void (*fp)(void) =(void (*)(void))BIOS_LOAD;
(*fp)();
}
return 0;
}
int BackupBios(int argc, char *argv[])
{
unsigned int cache_cfg;
Uart_Printf("move bios to the top of rom,are you sure?");
if(!getyorn())
return 0;
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
FlashRead(0, (unsigned short *)DFT_DOWNLOAD_ADDR, 0xf000);
SectorProg(BIOS_BASE, (unsigned short *)DFT_DOWNLOAD_ADDR, 0xf000);
rNCACHBE0 = cache_cfg;
return 0;
}
int MemoryDisplay(int argc, char*argv[])
{
static unsigned int src_addr;
// unsigned int sys_cfg;
unsigned int src;
unsigned int i, j;
unsigned int tmp_data[64];
if(argc > 1) {
unsigned int tmp = strtoul((unsigned char *)argv[1]);
src_addr = (tmp==-1)?src_addr:tmp;
src_addr &= ~0xf;
}
Uart_Printf("Press ESC key to exit, other key to continue...\n");
// sys_cfg = rSYSCFG;
// rSYSCFG = 0x08;
do {
unsigned int *pLRU;
src = src_addr;
src_addr += 0x100;
pLRU = (unsigned int *)0x10004000;
for(i=0; i<(128<<2); i+=4)
pLRU[i] = 0;
for(i=0; i<64; i++)
tmp_data[i] = ((unsigned int *)src)[i];
for(i=0; i<16; i++) {
unsigned char ch;
Uart_Printf("0x%-8x:", src+(i<<4));
for(j=0; j<16; j++) {
ch = ((unsigned char *)tmp_data)[(i<<4)+j];
Uart_Printf("%3x", ch);
}
Uart_SendByte(' ');
Uart_SendByte(' ');
for(j=0; j<16; j++) {
ch = ((unsigned char *)tmp_data)[(i<<4)+j];
Uart_SendByte((ch>=0x20&&ch<0x80)?ch:'.');
}
Uart_SendByte('\n');
}
} while(Uart_Getch()!=0x1b);
// rSYSCFG = sys_cfg; //关闭cache后读tmp_data并打印才正常
return 0;
}
int MemoryShow(int argc, char*argv[])
{
unsigned long addr;
int mode;
U32 sys_cfg;
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((unsigned 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;
sys_cfg = rSYSCFG;
rSYSCFG = 8;
printf("mem @0x%-8x = 0x%x\n", addr, (mode==2)?*(U32 *)addr:(mode==1)?*(U16 *)addr:*(U8 *)addr);
rSYSCFG = sys_cfg;
return 0;
err_exit:
puts("Usage : memd -c/s/l addr""\n-c/s/l 8/16/32 bits\n");
return -1;
}
int MemorySet(int argc, char*argv[])
{
unsigned long addr;
int mode;
U32 data, sys_cfg;
if(argc!=4)
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((unsigned char *)argv[2]);
if(addr==-1)
goto err_exit;
data = strtoul((unsigned char *)argv[3]);
if(data==-1)
goto err_exit;
sys_cfg = rSYSCFG;
rSYSCFG = 8;
if(!mode) {
__asm {
strb data, [addr]
}
} else if(mode==1) {
if(addr&1)
goto err_exit;
__asm {
strh data, [addr]
}
} else if(mode==2) {
if(addr&3)
goto err_exit;
__asm {
str data, [addr]
}
}
// printf("set ""mem @0x%-8x = 0x%x\n", addr, (mode==2)?*(U32 *)addr:(mode==1)?*(U16 *)addr:*(U8 *)addr);
rSYSCFG = sys_cfg;
puts("set ");
MemoryShow(3, argv);
return 0;
err_exit:
puts("Usage : memd -c/s/l addr"" data""\n-c/s/l 8/16/32 bits\n");
return -1;
}
int Flash2Mem(int argc, char*argv[])
{
unsigned int src, dst, size, i;
unsigned int cache_cfg;
unsigned int *data_src, *data_dst;
if(argc<4)
{
Uart_Printf("Usage : move a1 a2 size\n");
Uart_Printf("a1 = src address, a2 = dst address, size = copy bytes (all in hex)\n");
return -1;
}
src = strtoul((unsigned char *)argv[1]);
dst = strtoul((unsigned char *)argv[2]);
size = strtoul((unsigned char *)argv[3]);
if(src==-1||dst==-1||size==-1||(dst-size)<src)
{
Uart_Printf("give error address\n");
return -1;
}
data_src = (unsigned int *)src;
data_dst = (unsigned int *)dst;
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
size = size%4 ? size/4+1 : size/4;
for(i=0;i<size;i++)
*data_dst++ = *data_src++;
rNCACHBE0 = cache_cfg;
Uart_Printf("move finished!\n");
return 0;
}
static void SetParams(void);
int MoveRun(int argc, char *argv[])
{
unsigned long size = 0x100000, i;
unsigned char *s, *r;
void (*fp)(void);
if((prog_s_addr>=__ROM_SIZE)||(prog_s_addr&0xfff)||(prog_r_addr&0xfff)) {
puts("Bad address\n");
return -1;
}
SetParams();
s = (unsigned char *)prog_s_addr;
r = (unsigned char *)prog_r_addr;
size = __ROM_SIZE - prog_s_addr;
for(i=0; i<size; i++)
r[i] = s[i];
fp = (void (*)(void))prog_r_addr;
(*fp)();
return 0;
}
int SaveEnv(int argc, char*argv[])
{
int i;
unsigned int cache_cfg;
EnvParams *params;
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
params = (EnvParams *)(DFT_DOWNLOAD_ADDR+ENV_ADD);
FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);
params->flag[0] = 'p';
params->flag[1] = 'a';
params->flag[2] = 'r';
params->flag[3] = 'a';
params->flag[4] = 'm';
params->flag[5] = 's';
params->flag[6] = 0;
params->nic_cfg.ip = IP_ADDRESS;
params->nic_cfg.mask = MASK_ADDRESS;
params->nic_cfg.gate = GATE_ADDRESS;
params->baud = SERIAL_BAUD;
params->sys_clk = MCLK_M|(MCLK_P<<8)|(MCLK_S<<16);
params->prog_s_addr = prog_s_addr;
params->prog_r_addr = prog_r_addr;
for(i=0; i<8; i++)
params->NandPartition[i] = NandPartition[i];
for(i=0; i<sizeof(boot_params); i++)
params->boot_params[i] = boot_params[i];
SectorProg(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);
rNCACHBE0 = cache_cfg;
return 0;
}
int LoadEnv(int argc, char*argv[])
{
unsigned int * pdata;
unsigned int cache_cfg;
EnvParams params;
unsigned long t_mclk;
unsigned char t_m, t_p, t_s, tt_s;
int i, err;
cache_cfg = rNCACHBE0;
rNCACHBE0 = 0x20000000;
pdata = (unsigned int*)(DFT_DOWNLOAD_ADDR+ENV_ADD);
FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR), SECTOR_SIZE);
rNCACHBE0 = cache_cfg;
params = *(EnvParams*)pdata;
if(strcmp((const char *)params.flag, "params"))
return -1;
err = 0;
for(i=0; i<8; i++) {
// printf("%d, %x ,%x\n", i, params.NandPartition[i].offset, params.NandPartition[i].size);
err = (params.NandPartition[i].offset|params.NandPartition[i].size)&0x3fff;
if(!err) {
NandPartition[i].offset = params.NandPartition[i].offset;
NandPartition[i].size = params.NandPartition[i].size;
} else
break;
}
t_m = params.sys_clk;
t_p = params.sys_clk>>8;
t_s = params.sys_clk>>16;
i = 1;
tt_s = t_s;
while(tt_s--)
i *= 2;
t_mclk= (EXT_OSC_CLK*(t_m+8))/((t_p+2)*i);
if((t_mclk<10000000)||(t_mclk>100000000)) {
t_m = 120;
t_p = 8;
t_s = 1;
t_mclk = 64000000;
}
for(i=0; BaudSet[i]; i++)
if(params.baud==BaudSet[i])
break;
if(!BaudSet[i])
params.baud = 115200;
if(!argc) {
ChangePllValue(t_m, t_p, t_s);
Uart_Init(0, params.baud);
}
prog_s_addr = params.prog_s_addr;
prog_r_addr = params.prog_r_addr;
if(prog_s_addr&0xfff)
prog_s_addr = 0x1000;
if(prog_r_addr&0xfff)
prog_r_addr = 0xc008000;
for(i=0; i<sizeof(boot_params); i++)
boot_params[i] = params.boot_params[i];
boot_params[i-1] = 0;
Uart_Printf("IP address : %u.%u.%u.%u\n", (params.nic_cfg.ip>>24)&0xff, (params.nic_cfg.ip>>16)&0xff, (params.nic_cfg.ip>>8)&0xff, params.nic_cfg.ip&0xff);
Uart_Printf("IP MASK : %u.%u.%u.%u\n", (params.nic_cfg.mask>>24)&0xff, (params.nic_cfg.mask>>16)&0xff, (params.nic_cfg.mask>>8)&0xff, params.nic_cfg.mask&0xff);
Uart_Printf("IP GATE : %u.%u.%u.%u\n", (params.nic_cfg.gate>>24)&0xff, (params.nic_cfg.gate>>16)&0xff, (params.nic_cfg.gate>>8)&0xff, params.nic_cfg.gate&0xff);
Uart_Printf("Serial baud : %d\n", params.baud);
Uart_Printf("Clock : %dHz\n", t_mclk);
Uart_Printf("Program save address 0x%x\n", prog_s_addr);
Uart_Printf("Program run address 0x%x\n", prog_r_addr);
Uart_Printf("Program boot params : %s\n", params.boot_params);
if(argc!=0) {
Uart_Printf("Load enviroment value from flash?");
if(!getyorn())
return 0;
}
locnode.ip = IP_ADDRESS = params.nic_cfg.ip;
locnode.mask = GATE_ADDRESS = params.nic_cfg.mask;
locnode.gate = MASK_ADDRESS = params.nic_cfg.gate;
MCLK_M = t_m; MCLK_P = t_p; MCLK_S = t_s;
SERIAL_BAUD = params.baud;
i = 8000;
while(i--);
ChangePllValue(MCLK_M, MCLK_P, MCLK_S);
i = 8000;
while(i--);
Uart_Init(0,SERIAL_BAUD);
if(argc!=0)
Uart_Getch();
return 0;
}
int NandProg(int argc, char*argv[])
{
unsigned int size = ~0;
unsigned int data_begin = ~0;
data_begin = download_addr;
size = download_len;
if(argc>1)
data_begin = strtoul((unsigned char *)argv[1]);
if(argc>2)
size = strtoul((unsigned char *)argv[2]);
if((size==-1)||(data_begin==-1)) {
Uart_Printf("Arguments error\n");
goto err_exit;
}
if(size==0)
Uart_Printf("Write 0 Bytes!\n");
else
WrFileToNF(data_begin, size);
return 0;
err_exit:
Uart_Printf("Usage: nfprog addr size\naddr = data pointer to ram\nsize = program size(Bytes)\n");
return -1;
}
int NandLoad(int argc, char*argv[])
{
RdFileFrNF(0, 0);
return 0;
}
int NandErase(int argc, char*argv[])
{
EraseNandPart(0, 0);
return 0;
}
int NandPart(int argc, char*argv[])
{
unsigned long i, addr[8];
if(!NandFlashSize)
return -1;
if((argc<=1)||(argc>9))
goto err_exit;
addr[0] = 0;
for(i=1; i<argc; i++) {
addr[i] = strtoul((unsigned char *)argv[i]);
if((addr[i]==-1)||(addr[i]<=addr[i-1])||(addr[i]&0x3fff)||(addr[i]>NandFlashSize))
goto err_exit;
}
printf("Set %d partition(s) :\n", argc-1);
for(i=0; i<argc-1; i++) {
NandPartition[i].offset = addr[i];
NandPartition[i].size = addr[i+1]-addr[i];
NandPartition[i].name = " ";
NandPartition[i+1].size = 0;
printf("part%d : start address 0x%-8x, size 0x%-8x\n", i, NandPartition[i].offset, NandPartition[i].size);
}
return 0;
err_exit:
puts("Usage : nfpart a1 a2 ... an\na1 = part1 end address, an = partn end address, n<=8, address must be 16KB align and don't excess the size of nand flash \n");
return -1;
}
int SetProgAddr(int argc, char *argv[])
{
int addr, s;
if(argc!=3)
goto err_exit;
if(!strncmp(argv[1], "-s", 3))
s = 1;
else if(!strncmp(argv[1], "-r", 3))
s = 0;
else
goto err_exit;
addr = strtoul((unsigned char*)argv[2]);
if(addr==-1)
goto err_exit;
printf("Set Program %s address = 0x%x\n", s?"save":"run", addr);
if(s)
prog_s_addr = addr;
else
prog_r_addr = addr;
return 0;
err_exit:
puts("Usage : setpa -s[-r] address\n-s save address\n-r run address\n");
return -1;
}
int SetBootParams(int argc, char *argv[])
{
char params[sizeof(boot_params)];
int params_bytes;
puts("Please enter params for boot, press Enter to complete, Esc to exit\n");
params_bytes = GetParameter(params, sizeof(boot_params)-1);
putch('\n');
if(params_bytes!=-1) {
boot_params[params_bytes] = 0;
while(params_bytes) {
params_bytes--;
boot_params[params_bytes] = params[params_bytes];
}
}
return 0;
}
#define LINUX_PAGE_SHIFT 12
#define LINUX_PAGE_SIZE (1<<LINUX_PAGE_SHIFT)
#define COMMAND_LINE_SIZE 1024
struct param_struct {
union {
struct {
unsigned long page_size; /* 0 */
unsigned long nr_pages; /* 4 */
unsigned long ramdisk_size; /* 8 */
unsigned long flags; /* 12 */
#define FLAG_READONLY 1
#define FLAG_RDLOAD 4
#define FLAG_RDPROMPT 8
unsigned long rootdev; /* 16 */
unsigned long video_num_cols; /* 20 */
unsigned long video_num_rows; /* 24 */
unsigned long video_x; /* 28 */
unsigned long video_y; /* 32 */
unsigned long memc_control_reg; /* 36 */
unsigned char sounddefault; /* 40 */
unsigned char adfsdrives; /* 41 */
unsigned char bytes_per_char_h; /* 42 */
unsigned char bytes_per_char_v; /* 43 */
unsigned long pages_in_bank[4]; /* 44 */
unsigned long pages_in_vram; /* 60 */
unsigned long initrd_start; /* 64 */
unsigned long initrd_size; /* 68 */
unsigned long rd_start; /* 72 */
unsigned long system_rev; /* 76 */
unsigned long system_serial_low; /* 80 */
unsigned long system_serial_high; /* 84 */
unsigned long mem_fclk_21285; /* 88 */
} s;
char unused[256];
} u1;
union {
char paths[8][128];
struct {
unsigned long magic;
char n[1024 - sizeof(unsigned long)];
} s;
} u2;
char commandline[COMMAND_LINE_SIZE];
};
static void SetParams(void)
{
U32 i;
struct param_struct *params = (struct param_struct *)BOOT_PARAMS_ADDR;
for(i=0; i<(sizeof(struct param_struct)>>2); i++)
((U32 *)params)[i] = 0;
params->u1.s.page_size = LINUX_PAGE_SIZE;
params->u1.s.nr_pages = (DRAM_SIZE >> LINUX_PAGE_SHIFT);
// if(strlen((char *)boot_params)>=sizeof(boot_params))
// boot_params[sizeof(boot_params)-1] = 0;
strcpy(params->commandline, (char *)boot_params);
printf("Set boot params = %s\n", params->commandline);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -