⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shell.c

📁 杭州立宇泰ARMsys-P型ARM开发板BIOS代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************
 *		ARMSYS7 S3C44B0X developer's notes						*  
 ****************************************************************

 1. 2005.5.17::改变功能函数内容
 
 ***************************************************************/

#include <string.h>
#include "..\inc\44b.h"
#include "..\inc\config.h"
#include "..\inc\def.h"
#include "..\inc\board.h"
#include "..\inc\utils.h"
#include "..\inc\shell.h"
#include "..\inc\flash.h"
#include "..\inc\fat16.h"
#include "..\inc\Rtc.h"

static unsigned int BaudSet[] = {4800, 9600, 19200, 38400, 57600, 115200, 0};

#ifdef	RTC_TIMER_SUPPORT
TIME_STRUC SysTime;
char *WeekDay[7] = {"Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday", "Sunday"};
#endif

unsigned long download_len;
U32 download_addr;
U32 src_addr,des_addr;
U32 ram_addr=0xc100000;

static EnvParams Env;

extern U32 NandFlashSize;

typedef int (*cmdproc)(int argc, char *argv[]);
typedef struct 
{
	char *cmd;
	char *hlp;
	cmdproc proc;
}CMD_STRUC;

CMD_STRUC CMD_INNER[] = {
				 	{"help", "show this list", Help},
					{"?", "= help", Help},
					{"oem", "show corporation information", showoem},
					{"uclinux", "run the uCLinux OS",run_uclinux},
					{"test", "Run ARMSYS test program",boardtest},
#ifdef	RTC_TIMER_SUPPORT
					{"date", "show or set current date", GetDate},
					{"time", "show or set current time", GetTime},
					{"setweek", "set weekday", SetWeek},
#endif					
					{"clock", "show system running clock", ShowSysClock},
#ifdef	SET_SYSCLK_SUPPORT
					{"setmclk", "set system running clock", ChgSysClk},
#endif
#ifdef	SERIAL_PORTS_SWITCH
					{"chguart", "change uart(0/1)", ChgUartPort},
#endif
					{"setbaud", "set baud rate", ChgBaudRate},
#ifdef	TFTP_DOWNLOAD_SUPPORT
					{"ipcfg", "show or set current IP address", SetIpAddr},
					{"netload", "download file by net", LoadFromNet},
					{"netrun", "download file by net and run", NetLoadRun},
					{"go",      "download file by net and run", NetLoadRun},
#endif					
					{"comload", "download file by uart", LoadFromUart},
					{"comrun", "download file by uart and run", UartLoadRun},
#ifdef	XMODEM_DOWNLOAD_SUPPORT
					{"xmload", "download file by xmodem", XmodemReceive},
					{"xmrun", "download file by xmodem and run", XmodemReceiveRun},
#endif

					{"run", "run program", RunProgram},
					{"move", "move data from addr1 to addr2", MoveMem},
					{"md",	"show memory data", MemoryDisplay},

#ifdef	SAVE_ENV_SUPPORT
					{"senv", "save enviroment value to flash", SaveEnv},
#endif					

#ifdef	NAND_FLASH_SUPPORT
					{"nformat", "format Nand Flash", NandErase},
					{"nfw",     "write file to Nand Flash", NandProg},		
					{"nfr",     "read file from Nand Flash to SDRAM", NandLoad},
					{"nfd",     "display file from Nand Flash",NandShow},
					{"nfdel",   "delete file from Nand Flash",NandFileDel},
				//	{"key"  "read file from nandload to sdram"NandLoad}
#endif
					{"defset", "default setting for uCLinux", Default_Setting },
					{NULL, NULL, NULL}
				};


void GetBoardKey(void)
{
/**	unsigned int key;
	void (*fp)(void) =(void (*)(void))BIOS_LOAD;

	if((rPDATG&0xf0) != 0xf0)	
	{
		key = rPDATG&0xf0;
		Delay(500);		//延时若干个100us,消除抖动
		if(key == (rPDATG&0xf0))
		{
			while((rPDATG&0xf0) != 0xf0);
			printf("boot from flash...\n");
			(*fp)();							
		}
	}
	****/
	LedSet(~GetKeyStatus());
}

/*******************************************************************************************************/
void ShellIn(void)
{
	int i, j, key, led;
	int x;
	int h_i, h_j, h_jj;
	char t_command[MAX_CMD_LEN];
	char * command;		
	char H_command[MAX_CMD_HISTORY][MAX_CMD_LEN];
	//puts("---------------------------------------------------------------\n");	
	printf("IP address : %u.%u.%u.%u\n", (Env.nic_cfg.ip>>24)&0xff, (Env.nic_cfg.ip>>16)&0xff, (Env.nic_cfg.ip>>8)&0xff, Env.nic_cfg.ip&0xff);
	printf("IP MASK    : %u.%u.%u.%u\n", (Env.nic_cfg.mask>>24)&0xff, (Env.nic_cfg.mask>>16)&0xff, (Env.nic_cfg.mask>>8)&0xff, Env.nic_cfg.mask&0xff);
	printf("IP GATE    : %u.%u.%u.%u\n", (Env.nic_cfg.gate>>24)&0xff, (Env.nic_cfg.gate>>16)&0xff, (Env.nic_cfg.gate>>8)&0xff, Env.nic_cfg.gate&0xff);
	printf("SerialBaud : %dbps\n", Env.baud);
	ShowSysClock(0, NULL);
#ifdef	RTC_TIMER_SUPPORT
	GetDate(0, NULL);
	GetTime(0, NULL);
#endif	
	puts("---------------------------------------------------------------\n");
	printf("Program save in %s flash\n", (Env.saved_in&1)?"nand":"nor");
	printf("Load program run address 0x%x\n", Env.prog_r_addr);

	puts("---------------------------------------------------------------\n");

	LedDisp();		//LED来回闪烁显示

	printf("\\>");
	i = 0;
	j = 0;
	h_i = 0;
	h_j = 0;
	h_jj = 0;
	for(x=0;x<MAX_CMD_HISTORY;x++)
		H_command[x][0] = '\0';
	command = H_command[0];
	
	led = 0;
	for(;;)
	{				
		if(WaitEventWithTimeout(kbhit, 1, 500))
		{
			led ^= 8;
			LedSet(led);
		}
		else
		{
			key = getkey();
			if(key == ENTER_KEY)
			{
				int tmp;
				putch('\n');

				Memcpy(t_command, command, i+1);
				if(i)
				{
					Memcpy(H_command[h_i], command, i+1);
					h_i++;
					h_i %= MAX_CMD_HISTORY;
					h_j = h_i;
					h_jj = 0;
					command = H_command[h_i];
					command[0] = '\0';
				}
				
				tmp = ParseCmd(t_command, i);
				
				printf("\\>");
				
				i = 0;
				j = 0;
			}
			else if(key == BACK_KEY && j>0)
			{
				if(i==j)
				{
					i--;
					j--;
					printf("\b \b");
				}
				else
				{
					i--;
					j--;
					for(x=j;x<i;x++)
						command[x]=command[x+1];
					command[x] = ' ';
					printf("\b \b");
					for(x=j;x<i+1;x++)
						putch(command[x]);
					for(x=0;x<i+1-j;x++)
					{
						putch(0x1b);
						putch(0x5b);
						putch(LEFT_KEY);
					}
				}
				command[i] = '\0';
			}
			else if(key == ESC_KEY)
			{
				key = getch();
				if(key != 0x5b) 
					continue;
				
				key = getch();
				if(key == RIGHT_KEY)
				{	
					if(j==i) 
						continue;
					putch(0x1b);
					putch(0x5b);
					putch(RIGHT_KEY);
					j++;
				}
				else if(key == LEFT_KEY)
				{
					if(j==0) 
						continue;
					putch(0x1b);
					putch(0x5b);
					putch(LEFT_KEY);
					j--;
				}
				else if(key == HOME_KEY)
				{
					for(x=0;x<j;x++)
					{
						putch(0x1b);
						putch(0x5b);
						putch(LEFT_KEY);
					}
					j = 0;
				}
				else if(key == END_KEY)
				{
					for(x=j;x<i;x++)
					{
						putch(0x1b);
						putch(0x5b);
						putch(RIGHT_KEY);
					}
					j = i;
				}
				else if(key == UP_KEY)
				{
					int cm_len;
					int tmp_hj;

					if(h_jj == MAX_CMD_HISTORY - 1)
					{
						putch(BEEP_KEY);
						continue;
					}
					tmp_hj = h_j;
					if(h_j==0) h_j = MAX_CMD_HISTORY - 1;
					else h_j--;
					
					cm_len = Strlen(H_command[h_j]);
					if(cm_len == 0)
					{	
						putch(BEEP_KEY);
						h_j = tmp_hj;
						continue;
					}
					command = H_command[h_j];
					
					for(x=0;x<j;x++)
					{							//回到行首
						putch(0x1b);
						putch(0x5b);
						putch(LEFT_KEY);
					}
					for(x=0;x<cm_len;x++)
						putch(command[x]);
					for(;x<i;x++)
						putch(' ');
					for(;x>cm_len;x--)
					{
						putch(0x1b);
						putch(0x5b);
						putch(LEFT_KEY);
					}
					i = j = cm_len;
					h_jj++;
				}
				else if(key == DOWN_KEY)
				{
					int cm_len;

					if(h_jj == 0) 
					{
						putch(BEEP_KEY);
						continue;
					}				
					h_j ++;
					h_j %= MAX_CMD_HISTORY;
					
					cm_len = Strlen(H_command[h_j]);
					command = H_command[h_j];
					
					for(x=0;x<j;x++)
					{							//回到行首
						putch(0x1b);
						putch(0x5b);
						putch(LEFT_KEY);
					}
					for(x=0;x<cm_len;x++)
						putch(command[x]);
					for(;x<i;x++)
						putch(' ');
					for(;x>cm_len;x--)
					{
						putch(0x1b);
						putch(0x5b);
						putch(LEFT_KEY);
					}
					i = j = cm_len;
					h_jj--;
				}
			}
			else if(key>=0x20 && key<=0x7e && i<(MAX_CMD_LEN-1))
			{
				if(i==j)
				{
					command[i++] = key;
					putch(key);
					j++;
				}
				else
				{
					for(x=i;x>j;x--)
						command[x] = command[x-1];
					command[j] = key;
					i++;
					for(x=j;x<i;x++)
						putch(command[x]);
					j++;
					for(x=0;x<i-j;x++)
					{
						putch(0x1b);
						putch(0x5b);
						putch(LEFT_KEY);
					}
				}
				command[i] = '\0';
			}
		}
	}	
}


/*******************************************************************************************************/
int ParseCmd(char *cmdline, int cmd_len)
{
	int argc, num_commands;
	char *argv[MAX_ARGS];

	ParseArgs(cmdline, &argc, argv);

	/* only whitespace */
	if(argc == 0) 
		return 0;
	
	num_commands = GetCmdMatche(argv[0]);
	if(num_commands<0) 
	{
		printf("No '%s' command, please type 'help' or '?' for a command list\n", argv[0]);
		return -1;
	}
		
	if(CMD_INNER[num_commands].proc!=NULL)	
		CMD_INNER[num_commands].proc(argc, argv);
				
	return 0;			
}


/*******************************************************************************************************/
void ParseArgs(char *cmdline, int *argc, char **argv)
{
#define STATE_WHITESPACE	0
#define STATE_WORD			1

	char *c;
	int state = STATE_WHITESPACE;
	int i;

	*argc = 0;

	if(Strlen(cmdline) == 0)
		return;

	/* convert all tabs into single spaces */
	c = cmdline;
	while(*c != '\0')
	{
		if(*c == '\t')
			*c = ' ';
		c++;
	}
	
	c = cmdline;
	i = 0;

	/* now find all words on the command line */
	while(*c != '\0')
	{
		if(state == STATE_WHITESPACE)
		{
			if(*c != ' ')
			{
				argv[i] = c;		//将argv[i]指向c
				i++;
				state = STATE_WORD;
			}
		}
		else
		{ /* state == STATE_WORD */
			if(*c == ' ')
			{
				*c = '\0';
				state = STATE_WHITESPACE;
			}
		}
		c++;
	}
	
	*argc = i;
#undef STATE_WHITESPACE
#undef STATE_WORD
}


/*******************************************************************************************************/
int GetCmdMatche(char *cmdline)
{
	int i;	
	
	for(i=0; CMD_INNER[i].cmd!=NULL; i++)
	{
		if(Strlen(cmdline)!=Strlen(CMD_INNER[i].cmd))
			continue;
		if(Strncmp(CMD_INNER[i].cmd, cmdline, Strlen(CMD_INNER[i].cmd))==0)
			return i;
	}
	
	return -1;
}


/*******************************************************************************************************/
int Help(int argc, char *argv[])
{
	int i;	
	ShowBootInfo(); 
	for(i=1; CMD_INNER[i-1].cmd!=NULL; i++)
	{
		if((i%16)==0)
		{
			printf("Press ESC key to Exit, other key to continue...\n");
			//getch();
			if(getch()==ESC_KEY)
				return 0;
			
		}
		if(CMD_INNER[i-1].hlp!=NULL)
		{
			printf("%-8s   :  %s\n", CMD_INNER[i-1].cmd, CMD_INNER[i-1].hlp);
		}
	}
	
	return 0;
}

/*******************************************************************************************************/
int ShowSysClock(int argc, char *argv[])
{
	int i, j;
	SysClock clk[4];
	
	i = GetSysClock(clk);
	if(i>3) 
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -