libpayload:  Add a timeout function for getchar and getch

Implement a timeout option for getchar() to return after so many
milliseconds.  Also implement the same thing for curses using
the halfdelay() function.

Signed-off-by: Jordan Crouse <jordan.crouse@amd.com>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>



git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3223 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
diff --git a/payloads/libpayload/curses/keyboard.c b/payloads/libpayload/curses/keyboard.c
index 2062ac2..8e9212c 100644
--- a/payloads/libpayload/curses/keyboard.c
+++ b/payloads/libpayload/curses/keyboard.c
@@ -39,6 +39,8 @@
 
 #include "local.h"
 
+static int _halfdelay = 0;
+
 /* ============== Serial ==================== */
 
 /* FIXME:  Cook the serial correctly */
@@ -241,8 +243,13 @@
 				return cook_serial(c);
 			}
 
-			if (!delay)
+			if (delay == 0)
 				break;
+
+			if (delay > 0) {
+				mdelay(100);
+				delay--;
+			}
 		}
 
 		c = inb(0x60);
@@ -262,12 +269,33 @@
 
 int wgetch(WINDOW *win)
 {
-	return curses_getchar(win->_delay);
+	int delay = -1;
+
+	if (_halfdelay || win->_delay)
+		delay = win->_delay ? 0 : _halfdelay;
+
+	return curses_getchar(delay);
 }
 
 int nodelay(WINDOW *win, NCURSES_BOOL flag)
 {
-	win->_delay = flag ? 0 : -1;
+	win->_delay = flag ? 1 : 0;
+	return 0;
+}
+
+int halfdelay(int tenths)
+{
+	if (tenths > 255)
+		return ERR;
+
+	_halfdelay = tenths;
+	return 0;
+}
+
+int nocbreak(void)
+{
+	/* Remove half delay timeout. */
+	_halfdelay = 0;
 	return 0;
 }
 
diff --git a/payloads/libpayload/curses/tinycurses.c b/payloads/libpayload/curses/tinycurses.c
index 5e707c4..6fcb43f 100644
--- a/payloads/libpayload/curses/tinycurses.c
+++ b/payloads/libpayload/curses/tinycurses.c
@@ -318,7 +318,6 @@
 	return win;
 }
 /* D */ int nl(void) { SP->_nl = TRUE; return OK; }
-int nocbreak(void) { /* TODO */ return(*(int *)0); }
 /* D */ int noecho(void) { SP->_echo = FALSE; return OK; }
 /* D */ int nonl(void) { SP->_nl = FALSE; return OK; }
 // void noqiflush (void) {}
diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h
index b74fbfe..388785d 100644
--- a/payloads/libpayload/include/libpayload.h
+++ b/payloads/libpayload/include/libpayload.h
@@ -94,6 +94,7 @@
 int puts(const char *s);
 int havekey(void);
 int getchar(void);
+int getchar_timeout(int *ms);
 
 extern int last_putchar;
 
diff --git a/payloads/libpayload/libc/console.c b/payloads/libpayload/libc/console.c
index b2b115b..73e2644 100644
--- a/payloads/libpayload/libc/console.c
+++ b/payloads/libpayload/libc/console.c
@@ -101,3 +101,19 @@
 #endif
 	}
 }
+
+int getchar_timeout(int *ms)
+{
+	while (*ms > 0) {
+		if (havekey())
+			return getchar();
+
+		mdelay(100);
+		*ms -= 100;
+	}
+
+	if (*ms < 0)
+		*ms = 0;
+
+	return 0;
+}