[U-Boot] [PATCH] At start of autoboot check, flush any pending RX bytes

Craig McQueen craig.mcqueen at innerrange.com
Mon Dec 21 03:07:50 CET 2015


This is to avoid the boot sequence halting due to initial "junk"
received on serial input.

Signed-off-by: Craig McQueen <craig.mcqueen at innerrange.com>
---
I have found that on the BeagleBone Black, U-Boot occasionally halts at 
the U-Boot prompt at boot-up, whether power-up, warm external 
reset or software reset. I have seen other people report the same issue.

This seems to be due to U-Boot receiving "junk" data on the serial 
console. The BeagleBone Black has a pull-down resistor which was 
apparently added to try to mitigate this issue, but it doesn't entirely 
fix it.

 common/autoboot.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/common/autoboot.c b/common/autoboot.c
index c11fb31..3ab51d9 100644
--- a/common/autoboot.c
+++ b/common/autoboot.c
@@ -230,19 +230,29 @@ static int abortboot_normal(int bootdelay)
 		printf("Hit any key to stop autoboot: %2d ", bootdelay);
 #endif
 
-#if defined CONFIG_ZERO_BOOTDELAY_CHECK
 	/*
-	 * Check if key already pressed
-	 * Don't check if bootdelay < 0
+	 * Flush any pending input key presses.
+	 * On some systems, there might be some junk input.
+	 * No need if bootdelay < 0.
 	 */
 	if (bootdelay >= 0) {
-		if (tstc()) {	/* we got a key press	*/
+		ts = get_timer(0);
+		while (tstc()) {	/* we got a key press	*/
 			(void) getc();  /* consume input	*/
+#if defined CONFIG_ZERO_BOOTDELAY_CHECK
 			puts("\b\b\b 0");
 			abort = 1;	/* don't auto boot	*/
+			break;
+#else
+			/*
+			 * Sanity check just to avoid infinite loop. It should
+			 * never happen if hardware is working as expected.
+			 */
+			if (get_timer(ts) >= 1000)
+				break;
+#endif
 		}
 	}
-#endif
 
 	while ((bootdelay > 0) && (!abort)) {
 		--bootdelay;
-- 
2.1.4



More information about the U-Boot mailing list