[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