📄 shell.c
字号:
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;
}
#ifdef ETHERNET_SUPPORT
int NetPortSwitch(unsigned int netport)
{
NetPortNumber=netport;
return 0;
}
#endif
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;
/**************************************/
//if(Env.netport==2)Env.current_netport=2;
//else Env.current_netport=1;
if((Env.current_netport!=2)&&(Env.current_netport!=1))Env.current_netport=1;
NetPortSwitch(Env.current_netport);
/**************************************/
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;
//NetPortNumber=2;
/***************changge**************/
//Env.nic_cfg.netport=1; //默认8201
//NetPortNumber=2;
/************************************/
// 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);
params->u1.s.nr_pages = (SIZE_64M >> 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[])
{
DftEnvInit();
NorFlashProg( BIOS_ENV_ADDR, (U32)&Env, sizeof(Env) ) ; //保存默认参数到Flash
return 0;
}
void Net_Test(void)
{
Net_Test_Flag=1;
//puts("\n net test start........\n");
tftp_main(download_addr, Env.nic_cfg.ip);
puts("\n over test net \n");
}
#ifdef TEST_SUPPORT
int Test(int argc,char *argv[])
{
char *temp;
int i;
if(argc>1)
{
puts("/r don't input parameter\n");
return 0;
}
while((getkey()!=ESC_KEY))
{
puts("1 IIC test\n");
puts("2 net test\n");
puts("3 key and led test\n");
puts("4 usb test \n");
puts("please enter 数字键进入相应的测试功能,按ESC键退出测试\n");
*temp=getch();
i=*temp;
// i=(int)strtoul(temp);
switch(i)
{
case '1':
{puts("start IIC test.........\n");
Iic_Test();
break;
}
case '2':
{
puts("start net test.............\n");
Net_Test();
break;
}
case '3':
{puts("start key and led test...........\n");
ioptest();
break;
}
case '4':
{puts("usb test..............\n");
D12Main();
break;
}
//default:return 0;break;
case ESC_KEY : return 0;break;
}
puts("\n 请按任意键继续,按 ESC 键退出 \n");
}
return 0;
}
#endif
/***********************************************
function : ChgNetPort(int argc,char *argv[])
parameter: only one,number
return : no useful
purpose : select net port
1-->8201(default)
2-->8019
author : changguofeng
************************************************/
#ifdef ETHERNET_SUPPORT
int ChgNetPort(int argc,char *argv[])
{
char *temp;
switch(NetPortNumber)
{
case 1 : printf("RTL8201 is used \n");
break;
case 2 : printf("RTL8019 is used \n");
break;
default : printf(" no network card is used \n");
break;
}
puts("\n please select net port \n");
puts("\n 1:rtl8201(default) \n");
puts("\n 2:rtl8019 \n");
if((argc>2)||(argc<1))
{
puts("\n please input as follow : chgnet number \n");
return -1;
}
puts("\n please enter number key : ");
*temp=getch();
switch(*temp)
{
case '1':{
NetPortNumber=1;
Env.current_netport=1;
puts("\n rtl8201 is selected \n");
break;
}
case '2':{
NetPortNumber=2;
Env.current_netport=2;
puts("\n rtl8019 is selected \n");
break;
}
default :{
NetPortNumber=1;
Env.current_netport=1;
puts("\n you don't select,so default \n");
break;
}
}
return 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -