您的位置:首页 > 其它

自己写bootloader(4)——实现字符界面

2014-11-19 17:43 106 查看
在main函数中添加如下函数实现字符界面

for (;;) {

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;

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;

}

}

readline的作用是循环读取串口输入并回显

run_command的作用是执行所输入的命令

/*
* 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 (char * prompt)
{

char   *p = console_buffer;
int	n = 0;				/* buffer index		*/
int	plen = 0;			/* prompt length	*/
int	col;				/* output column cnt	*/
char	c;

/* print prompt */
if (prompt) {
plen = strlen (prompt);
puts (prompt);
}
col = plen;

for (;;) {
//WATCHDOG_RESET();		/* Trigger watchdog, if needed */

c = getc();

/*
* Special character handling
*/
switch (c) {
case '\r':				/* Enter		*/
case '\n':
*p = '\0';
puts ("\r\n");
return (p - console_buffer);

case '\0':				/* nul			*/
continue;

case 0x03:				/* ^C - break		*/
console_buffer[0] = '\0';	/* discard input */
return (-1);

case 0x15:				/* ^U - erase line	*/
while (col > plen) {
puts (erase_seq);
--col;
}
p = console_buffer;
n = 0;
continue;

case 0x17:				/* ^W - erase word 	*/
p=delete_char(console_buffer, p, &col, &n, plen);
while ((n > 0) && (*p != ' ')) {
p=delete_char(console_buffer, p, &col, &n, plen);
}
continue;

case 0x08:				/* ^H  - backspace	*/
case 0x7F:				/* DEL - backspace	*/
p=delete_char(console_buffer, p, &col, &n, plen);
continue;

default:
/*
* Must be a normal character then
*/
if (n < 256-2) {
if (c == '\t') {	/* expand TABs		*/
puts (tab_seq+(col&07));
col += 8 - (col&07);
} else {
++col;		/* echo input		*/
putc (c);
}
*p++ = c;
++n;
} else {			/* Buffer full		*/
putc ('\a');
}
}
}

}


首先输出一个prompt,也就是字符界面的提示信息,这是个字符串可以自己定义

在for循环里面循环getc获得串口输入,判断输入字符做相应的处理,如果是\n则return
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐