📄 shell.c
字号:
/*******************************************************************
[功能说明] 设置单个内存地址值
*******************************************************************/
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));//BIOS_ENV_ADDR (ROM_SIZE-0x200)0x1ffe00
#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_GATE;
Env.baud = DEFAULT_SERIAL_BAUD;
Env.current_uart = DEFAULT_SERIAL_PORT;
GetSysClockPara(Env.clk_para);
Env.prog_s_addr = BIOS_BASE;//ROM_BASE+SIZE_64K;//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
/*******************************************************************
[功能说明] Nand Flash 操作支持函数
*******************************************************************/
#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
/******************************************************************************
【功能说明】XMODEM 下载支持函数
******************************************************************************/
#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)
{
printf("Machine Number is %d\n", Env.machine);
return 0;
}
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;
}
/******************************************************************************
【功能说明】USB 下载支持函数
******************************************************************************/
#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[])
{
U32 obj;
if(argc < 2)
{
goto err_exit;
}
if(!strncmp(argv[1], "-s", 3))
obj = 0;
else
if(!strncmp(argv[1], "-u", 3))
obj = 1;
else
goto err_exit;
if(obj == 1)
{
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) | ((1)<<8) | (132) ; //设置默认IP地址
Env.nic_cfg.mask = ((255)<<24) | ((255)<<16) | ((255)<<8) | (0) ;
Env.nic_cfg.gate = ((192)<<24) | ((168)<<16) | ((1)<<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 ;
}
else
{
memcpy(Env.flag, "params", 8);
memcpy(Env.boot_params, "", 256);
Env.nic_cfg.ip = DEFAULT_IP_ADDR;
Env.nic_cfg.mask = DEFAULT_IP_MASK;
Env.nic_cfg.gate = DEFAULT_IP_GATE;
Env.baud = DEFAULT_SERIAL_BAUD;
Env.current_uart = DEFAULT_SERIAL_PORT;
GetSysClockPara(Env.clk_para);
Env.prog_s_addr = BIOS_BASE;//ROM_BASE+SIZE_64K;//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);
}
NorFlashProg( BIOS_ENV_ADDR, (U32)&Env, sizeof(Env) ) ; //保存默认参数到Flash
return 0;
err_exit:
printf("Usage : defset -s|-u\n -s is default setup of board configure\n -u is default setup of unlinux\n");
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -