📄 shell.c
字号:
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))
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;
}
int MemorySet(int argc, char*argv[])
{
unsigned long addr;
int mode;
U32 data;
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((char *)argv[2]);
if(addr==-1)
goto err_exit;
data = strtoul((char *)argv[3]);
if(data==-1)
goto err_exit;
if(!mode) {
/*__asm {
strb data, [addr]
}*/
outportb(data, addr);
} else if(mode==1) {
if(addr&1)
goto err_exit;
/*__asm {
strh data, [addr]
}*/
outportw(data, addr);
} else if(mode==2) {
if(addr&3)
goto err_exit;
/*__asm {
str data, [addr]
}*/
outportl(data, addr);
}
// printf("set mem @0x%-8x = 0x%x\n", addr, (mode==2)?*(U32 *)addr:(mode==1)?*(U16 *)addr:*(U8 *)addr);
//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;
}
#ifdef SAVE_ENV_SUPPORT
int SaveEnv(int argc, char*argv[])
{
#ifdef SAVE_ENV_IN_NAND
NFSaveParams((char *)&Env);
#else
NorFlashProg(BIOS_ENV_ADDR, (U32)&Env, sizeof(Env));
#endif
return 0;
}
int LoadEnv()
{
int i;
#ifdef SAVE_ENV_IN_NAND
NFSearchParams((char *)&Env);
#else
NorFlashRead((char *)&Env, (char *)(BIOS_ENV_ADDR), sizeof(Env));
#endif
if(strncmp((const char *)Env.flag, "params", 7))
return -1;
SetSysClockPara(Env.clk_para);
for(i=0; BaudSet[i]; i++)
if(Env.baud==BaudSet[i])
break;
if(!BaudSet[i])
Env.baud = DEFAULT_SERIAL_BAUD;
SerialSwitch(Env.current_uart);
SerialChgBaud(Env.baud);
if(Env.prog_s_addr&0x3)
Env.prog_s_addr = ROM_BASE+SIZE_64K;
if(Env.prog_r_addr&0x3)
Env.prog_r_addr = DFT_DOWNLOAD_ADDR;
Env.boot_params[255] = 0;
return 0;
}
#endif
void DftEnvInit(void)
{
memset(&Env, 0, sizeof(Env));
memcpy(Env.flag, "params", 8);
Env.nic_cfg.ip = DEFAULT_IP_ADDR;
Env.nic_cfg.mask = DEFAULT_IP_MASK;
Env.nic_cfg.gate = DEFAULT_IP_ADDR;
Env.baud = DEFAULT_SERIAL_BAUD;
Env.current_uart = DEFAULT_SERIAL_PORT;
GetSysClockPara(Env.clk_para);
Env.prog_s_addr = SIZE_64K;
Env.prog_r_addr = DFT_DOWNLOAD_ADDR;
Env.NandPartition[0].size = 0;
Env.saved_in = 0; //use nor flash, nointrd
SerialSwitch(Env.current_uart);
SerialChgBaud(Env.baud);
}
#ifdef SERIAL_PORTS_SWITCH
int ChgUartPort(int argc, char *argv[])
{
Env.current_uart = !Env.current_uart;
printf("Set uart port%d...\n", Env.current_uart?1:0);
SerialSwitch(Env.current_uart);
return 0;
}
#endif
#ifdef NAND_FLASH_SUPPORT
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((char *)argv[1]);
if(argc>2)
size = strtoul((char *)argv[2]);
if((size==-1)||(data_begin==-1)) {
printf("Arguments error\n");
goto err_exit;
}
if(size==0) {
printf("Write 0 Bytes!\n");
return -1;
}
else
return WrFileToNF(data_begin, size);
err_exit:
printf("Usage: nfprog addr size\naddr = data pointer to ram\nsize = program size(Bytes)\n");
return -1;
}
int NandLoad(int argc, char *argv[])
{
U32 load_part = -1;
download_addr = DFT_DOWNLOAD_ADDR;
if(argc>1) {
download_addr = strtoul((char *)argv[1]);
if(download_addr==-1)
download_addr = DFT_DOWNLOAD_ADDR;
if(argc>2)
load_part = strtoul(argv[2]);
}
printf("Load data form nand flash to 0x%x\n", download_addr);
return RdFileFrNF(download_addr, load_part);
}
int NandErase(int argc, char *argv[])
{
return EraseNandPart();
}
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((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++) {
pNandPart[i].offset = addr[i];
pNandPart[i].size = addr[i+1]-addr[i];
pNandPart[i].name = " ";
pNandPart[i+1].size = 0;
printf("part%d : start address 0x%-8x, size 0x%-8x\n", i, pNandPart[i].offset, pNandPart[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;
}
#endif
int SetProgAddr(int argc, char *argv[])
{
int addr, obj;
if(argc<2)
goto err_exit;
if(!strncmp(argv[1], "-s", 3))
obj = 0;
else if(!strncmp(argv[1], "-r", 3))
obj = 1;
else if(!strncmp(argv[1], "-i", 3))
obj = 2;
else if(!strncmp(argv[1], "-ni", 4)) {
Env.saved_in &= ~2;
return 0;
} else if(!strncmp(argv[1], "-nor", 5)) {
Env.saved_in &= ~1;
return 0;
} else if(!strncmp(argv[1], "-nand", 6)) {
Env.saved_in |= 1;
return 0;
} else
goto err_exit;
if(argc<3)
goto err_exit;
addr = strtoul((char*)argv[2]);
if(addr==-1)
goto err_exit;
printf("Set Program %s address = 0x%x\n", (obj==0)?"save":(obj==1)?"run":"initrd", addr);
if(obj==0)
Env.prog_s_addr = addr;
else if(obj==1)
Env.prog_r_addr = addr;
else if(obj==2) {
Env.initrd_addr = addr;
Env.saved_in |= 2;
}
return 0;
err_exit:
puts("Usage : setpa -s[-r][-i][-ni][-nor][-nand] [address]\n-s save address\n-r run address\n-i initrd save address\n-ni disable initrd\n-nor use nor flash to save\n-nand use nand flash to save\n");
return -1;
}
int SetBootParams(int argc, char *argv[])
{
char params[sizeof(Env.boot_params)];
int params_bytes;
puts("Please enter params for boot, press Enter to complete, Esc to exit\n");
params_bytes = GetParameter(params, sizeof(Env.boot_params)-1);
putch('\n');
if(params_bytes!=-1) {
Env.boot_params[params_bytes] = 0;
while(params_bytes) {
params_bytes--;
Env.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];
};
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;
memcpy(params->commandline, (char *)Env.boot_params, sizeof(Env.boot_params));
printf("Set boot params = %s\n", params->commandline);
}
#define MAX_DOWNLOAD_SIZE 0x200000
#ifdef XMODEM_DOWNLOAD_SUPPORT
int XmodemReceive(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 by xmodem to 0x%x...\n", download_addr);
download_len = XModemReceive((char *)download_addr, MAX_DOWNLOAD_SIZE);
if(download_len!=-1)
printf("\nReceived %x bytes success\n", download_len);
return download_len;
}
int XmodemReceiveRun(int argc, char *argv[])
{
if(XmodemReceive(argc, argv)!=-1) {
RunProgram(0, NULL);
}
return 0;
}
#endif
int SetBootKey(int argc, char *argv[])
{
int keyno, keystat, boot = 0;
if(argc<3)
goto err_exit;
keyno = strtoul(argv[1]);
keystat = strtoul(argv[2]);
if((keyno>4)||(keyno<1)||(keystat>1)||(keystat<0))
goto err_exit;
keyno--;
if(argc>3) {
if(!strncmp("-b", argv[3], 6))
boot = 1;
else
goto err_exit;
}
Env.boot_key = ('k'<<24)|('b'<<16)|(keyno<<12)|(keystat<<8)|(boot);
return 0;
err_exit:
printf("Usage : keyrun keyno keystat [-b]\nkeyno key number 1~4\nkeystat 1->high, 0->low to autoboot\n-b execute boot\n");
return -1;
}
int SetMachine(int argc, char *argv[])
{
U32 machine, len;
if(argc<2)
goto err_exit;
len = strlen(argv[1]);
machine = strtodec(argv[1], len);
if((len>4)||(machine==-1))
goto err_exit;
Env.machine = machine;
return 0;
err_exit:
printf("Usage : machine no\nno machine number(0~9999)\n");
return -1;
}
#ifdef USB_DOWNLOAD_SUPPORT
int UsbDownload(int argc, char *argv[])
{
download_addr = DFT_DOWNLOAD_ADDR;
if(argc>1) {
download_addr = strtoul(argv[1]);
if(download_addr==-1)
download_addr = DFT_DOWNLOAD_ADDR;
}
printf("USB download file to 0x%x\n", download_addr);
download_len = BoardUsbDownload(download_addr);
if(download_len!=-1)
printf("0x%x bytes received\n", download_len);
return download_len;
}
int UsbDownloadRun(int argc, char *argv[])
{
if(UsbDownload(argc, argv)!=-1) {
RunProgram(0, NULL);
}
return 0;
}
#endif
/******************************************************************************
【功能说明】默认系统设置,设置系统主频、IP地址、波特率、启动参数等
******************************************************************************/
int Default_Setting(int argc, char *argv[])
{
unsigned short m ;
char c[] = "root=/dev/rom0 console=ttyS0,115200 devfs=mount" ;
Env.clk_para[0] = 53 ; //设置默认系统时钟
Env.clk_para[1] = 3 ;
Env.clk_para[2] = 1 ;
Env.clk_para[3] = 61000000 ;
rPLLCON = (53 << 12) | (3<< 4) | 1 ;
Delay(50);
TimerInit(TIMER_FREQ);
SerialChgBaud( 115200 ); //设置串口默认波特率
Delay(10);
Env.nic_cfg.ip = ((192)<<24) | ((168)<<16) | ((3)<<8) | (100) ; //设置默认IP地址
Env.nic_cfg.mask = ((255)<<24) | ((255)<<16) | ((255)<<8) | (0) ;
Env.nic_cfg.gate = ((192)<<24) | ((168)<<16) | ((3)<<8) | (1) ;
Env.prog_r_addr = 0xc300000 ;
Env.prog_s_addr = 0x10000 ;
m = 0 ;
while( c[m] != 0 )
{
Env.boot_params[m] = c[m] ;
m++ ;
}
Env.boot_params[ m + 1 ] = 0 ;
NorFlashProg( BIOS_ENV_ADDR, (U32)&Env, sizeof(Env) ) ; //保存默认参数到Flash
return 0;
}
//*****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -