main.c

来自「嵌入式试验箱S3C2410的bootloader源代码」· C语言 代码 · 共 1,447 行 · 第 1/3 页

C
1,447
字号
	    extern void video_banner(void);	    video_banner();	}#endif    run_command("menu", 0);	/*	 * Main Loop for Monitor Command Processing	 */PROMPT:#ifdef CFG_HUSH_PARSER	parse_file_outer();	/* This point is never reached */	for (;;);#else	for (;;) {#ifdef CONFIG_BOOT_RETRY_TIME		if (rc >= 0) {			/* Saw enough of a valid command to			 * restart the timeout.			 */			reset_cmd_timeout();		}#endif		len = readline (CFG_PROMPT);		flag = 0;	/* assume no special flags for now */		if (len > 0)			strcpy (lastcommand, console_buffer);		else if (len == 0)			flag |= CMD_FLAG_REPEAT;#ifdef CONFIG_BOOT_RETRY_TIME		else if (len == -2) {			/* -2 means timed out, retry autoboot			 */			puts ("\nTimed out waiting for command\n");# ifdef CONFIG_RESET_TO_RETRY			/* Reinit board to run initialization code again */			do_reset (NULL, 0, 0, NULL);# else			return;		/* retry autoboot */# endif		}#endif		if (len == -1)			puts ("<INTERRUPT>\n");		else			rc = run_command (lastcommand, flag);		if (rc <= 0) {			/* invalid command or not repeatable, forget it */			lastcommand[0] = 0;		}	}#endif /*CFG_HUSH_PARSER*/}#ifdef CONFIG_BOOT_RETRY_TIME/*************************************************************************** * initialize command line timeout */void init_cmd_timeout(void){	char *s = getenv ("bootretry");	if (s != NULL)		retry_time = (int)simple_strtol(s, NULL, 10);	else		retry_time =  CONFIG_BOOT_RETRY_TIME;	if (retry_time >= 0 && retry_time < CONFIG_BOOT_RETRY_MIN)		retry_time = CONFIG_BOOT_RETRY_MIN;}/*************************************************************************** * reset command line timeout to retry_time seconds */void reset_cmd_timeout(void){	endtime = endtick(retry_time);}#endif#ifdef CONFIG_CMDLINE_EDITING/* * cmdline-editing related codes from vivi. * Author: Janghoon Lyu <nandy@mizi.com> */#define putnstr(str,n)	do {			\		printf ("%.*s", n, str);	\	} while (0)#define CTL_CH(c)		((c) - 'a' + 1)#define MAX_CMDBUF_SIZE		256#define CTL_BACKSPACE		('\b')#define DEL			((char)255)#define DEL7			((char)127)#define CREAD_HIST_CHAR		('!')#define getcmd_putch(ch)	putc(ch)#define getcmd_getch()		getc()#define getcmd_cbeep()		getcmd_putch('\a')#define HIST_MAX		20#define HIST_SIZE		MAX_CMDBUF_SIZEstatic int hist_max = 0;static int hist_add_idx = 0;static int hist_cur = -1;unsigned hist_num = 0;char* hist_list[HIST_MAX];char hist_lines[HIST_MAX][HIST_SIZE];#define add_idx_minus_one() ((hist_add_idx == 0) ? hist_max : hist_add_idx-1)static void hist_init(void){	int i;	hist_max = 0;	hist_add_idx = 0;	hist_cur = -1;	hist_num = 0;	for (i = 0; i < HIST_MAX; i++) {		hist_list[i] = hist_lines[i];		hist_list[i][0] = '\0';	}}static void cread_add_to_hist(char *line){	strcpy(hist_list[hist_add_idx], line);	if (++hist_add_idx >= HIST_MAX)		hist_add_idx = 0;	if (hist_add_idx > hist_max)		hist_max = hist_add_idx;	hist_num++;}static char* hist_prev(void){	char *ret;	int old_cur;	if (hist_cur < 0)		return NULL;	old_cur = hist_cur;	if (--hist_cur < 0)		hist_cur = hist_max;	if (hist_cur == hist_add_idx) {		hist_cur = old_cur;		ret = NULL;	} else		ret = hist_list[hist_cur];	return (ret);}static char* hist_next(void){	char *ret;	if (hist_cur < 0)		return NULL;	if (hist_cur == hist_add_idx)		return NULL;	if (++hist_cur > hist_max)		hist_cur = 0;	if (hist_cur == hist_add_idx) {		ret = "";	} else		ret = hist_list[hist_cur];	return (ret);}#ifndef CONFIG_CMDLINE_EDITINGstatic void cread_print_hist_list(void){	int i;	unsigned long n;	n = hist_num - hist_max;	i = hist_add_idx + 1;	while (1) {		if (i > hist_max)			i = 0;		if (i == hist_add_idx)			break;		printf("%s\n", hist_list[i]);		n++;		i++;	}}#endif /* CONFIG_CMDLINE_EDITING */#define BEGINNING_OF_LINE() {			\	while (num) {				\		getcmd_putch(CTL_BACKSPACE);	\		num--;				\	}					\}#define ERASE_TO_EOL() {				\	if (num < eol_num) {				\		int tmp;				\		for (tmp = num; tmp < eol_num; tmp++)	\			getcmd_putch(' ');		\		while (tmp-- > num)			\			getcmd_putch(CTL_BACKSPACE);	\		eol_num = num;				\	}						\}#define REFRESH_TO_EOL() {			\	if (num < eol_num) {			\		wlen = eol_num - num;		\		putnstr(buf + num, wlen);	\		num = eol_num;			\	}					\}static void cread_add_char(char ichar, int insert, unsigned long *num,	       unsigned long *eol_num, char *buf, unsigned long len){	unsigned long wlen;	/* room ??? */	if (insert || *num == *eol_num) {		if (*eol_num > len - 1) {			getcmd_cbeep();			return;		}		(*eol_num)++;	}	if (insert) {		wlen = *eol_num - *num;		if (wlen > 1) {			memmove(&buf[*num+1], &buf[*num], wlen-1);		}		buf[*num] = ichar;		putnstr(buf + *num, wlen);		(*num)++;		while (--wlen) {			getcmd_putch(CTL_BACKSPACE);		}	} else {		/* echo the character */		wlen = 1;		buf[*num] = ichar;		putnstr(buf + *num, wlen);		(*num)++;	}}static void cread_add_str(char *str, int strsize, int insert, unsigned long *num,	      unsigned long *eol_num, char *buf, unsigned long len){	while (strsize--) {		cread_add_char(*str, insert, num, eol_num, buf, len);		str++;	}}static int cread_line(char *buf, unsigned int *len){	unsigned long num = 0;	unsigned long eol_num = 0;	unsigned long rlen;	unsigned long wlen;	char ichar;	int insert = 1;	int esc_len = 0;	int rc = 0;	char esc_save[8];	while (1) {		rlen = 1;		ichar = getcmd_getch();		if ((ichar == '\n') || (ichar == '\r')) {			putc('\n');			break;		}		/*		 * handle standard linux xterm esc sequences for arrow key, etc.		 */		if (esc_len != 0) {			if (esc_len == 1) {				if (ichar == '[') {					esc_save[esc_len] = ichar;					esc_len = 2;				} else {					cread_add_str(esc_save, esc_len, insert,						      &num, &eol_num, buf, *len);					esc_len = 0;				}				continue;			}			switch (ichar) {			case 'D':	/* <- key */				ichar = CTL_CH('b');				esc_len = 0;				break;			case 'C':	/* -> key */				ichar = CTL_CH('f');				esc_len = 0;				break;	/* pass off to ^F handler */			case 'H':	/* Home key */				ichar = CTL_CH('a');				esc_len = 0;				break;	/* pass off to ^A handler */			case 'A':	/* up arrow */				ichar = CTL_CH('p');				esc_len = 0;				break;	/* pass off to ^P handler */			case 'B':	/* down arrow */				ichar = CTL_CH('n');				esc_len = 0;				break;	/* pass off to ^N handler */			default:				esc_save[esc_len++] = ichar;				cread_add_str(esc_save, esc_len, insert,					      &num, &eol_num, buf, *len);				esc_len = 0;				continue;			}		}		switch (ichar) {		case 0x1b:			if (esc_len == 0) {				esc_save[esc_len] = ichar;				esc_len = 1;			} else {				puts("impossible condition #876\n");				esc_len = 0;			}			break;		case CTL_CH('a'):			BEGINNING_OF_LINE();			break;		case CTL_CH('c'):	/* ^C - break */			*buf = '\0';	/* discard input */			return (-1);		case CTL_CH('f'):			if (num < eol_num) {				getcmd_putch(buf[num]);				num++;			}			break;		case CTL_CH('b'):			if (num) {				getcmd_putch(CTL_BACKSPACE);				num--;			}			break;		case CTL_CH('d'):			if (num < eol_num) {				wlen = eol_num - num - 1;				if (wlen) {					memmove(&buf[num], &buf[num+1], wlen);					putnstr(buf + num, wlen);				}				getcmd_putch(' ');				do {					getcmd_putch(CTL_BACKSPACE);				} while (wlen--);				eol_num--;			}			break;		case CTL_CH('k'):			ERASE_TO_EOL();			break;		case CTL_CH('e'):			REFRESH_TO_EOL();			break;		case CTL_CH('o'):			insert = !insert;			break;		case CTL_CH('x'):			BEGINNING_OF_LINE();			ERASE_TO_EOL();			break;		case DEL:		case DEL7:		case 8:			if (num) {				wlen = eol_num - num;				num--;				memmove(&buf[num], &buf[num+1], wlen);				getcmd_putch(CTL_BACKSPACE);				putnstr(buf + num, wlen);				getcmd_putch(' ');				do {					getcmd_putch(CTL_BACKSPACE);				} while (wlen--);				eol_num--;			}			break;		case CTL_CH('p'):		case CTL_CH('n'):		{			char * hline;			esc_len = 0;			if (ichar == CTL_CH('p'))				hline = hist_prev();			else				hline = hist_next();			if (!hline) {				getcmd_cbeep();				continue;			}			/* nuke the current line */			/* first, go home */			BEGINNING_OF_LINE();			/* erase to end of line */			ERASE_TO_EOL();			/* copy new line into place and display */			strcpy(buf, hline);			eol_num = strlen(buf);			REFRESH_TO_EOL();			continue;		}		default:			cread_add_char(ichar, insert, &num, &eol_num, buf, *len);			break;		}	}	*len = eol_num;	buf[eol_num] = '\0';	/* lose the newline */	if (buf[0] && buf[0] != CREAD_HIST_CHAR)		cread_add_to_hist(buf);	hist_cur = hist_add_idx;	return (rc);}#endif /* CONFIG_CMDLINE_EDITING *//****************************************************************************//* * Prompt for input and read a line. * If  CONFIG_BOOT_RETRY_TIME is defined and retry_time >= 0, * time out when time goes past endtime (timebase time in ticks). * Return:	number of read characters *		-1 if break *		-2 if timed out */int readline (const char *const prompt){#ifdef CONFIG_CMDLINE_EDITING

⌨️ 快捷键说明

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