autoboot: Fix inconsistent countdown output
Commit5f70be08b0("Fix autoboot countdown printing wrong") introduces inconsistency in how the countdown is displayed. For example, in case when BOOTDELAY=5, the next output is observed during the boot: Hit any key to stop autoboot: 5 Hit any key to stop autoboot: 4 Hit any key to stop autoboot: 3 That happens due to different printf format (%2d vs %1d). Moreover, the mentioned commit fails to handle the case when the user is holding some key before the countdown is shown. E.g. if BOOTDELAY=101, the next malformed output is being produced: Hit any key to stop autoboot: 1 0 That's because the fast path code wasn't modified accordingly, and still tries to erase the number using '\b\b\b' format. Fix both issues by introducing a dedicated routine for printing the whole countdown line. Fixes:5f70be08b0("Fix autoboot countdown printing wrong") Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org> Reviewed-by: Tom Rini <trini@konsulko.com> Acked-by: David Zang <davidzangcs@gmail.com>
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <ansi.h>
|
||||
#include <autoboot.h>
|
||||
#include <bootretry.h>
|
||||
#include <cli.h>
|
||||
@@ -376,19 +377,24 @@ static int abortboot_key_sequence(int bootdelay)
|
||||
return abort;
|
||||
}
|
||||
|
||||
static void print_boot_delay(int bootdelay)
|
||||
{
|
||||
printf(ANSI_CLEAR_LINE "\rHit any key to stop autoboot: %d", bootdelay);
|
||||
}
|
||||
|
||||
static int abortboot_single_key(int bootdelay)
|
||||
{
|
||||
int abort = 0;
|
||||
unsigned long ts;
|
||||
|
||||
printf("Hit any key to stop autoboot: %2d ", bootdelay);
|
||||
print_boot_delay(bootdelay);
|
||||
|
||||
/*
|
||||
* Check if key already pressed
|
||||
*/
|
||||
if (tstc()) { /* we got a key press */
|
||||
getchar(); /* consume input */
|
||||
puts("\b\b\b 0");
|
||||
print_boot_delay(0);
|
||||
abort = 1; /* don't auto boot */
|
||||
}
|
||||
|
||||
@@ -410,7 +416,7 @@ static int abortboot_single_key(int bootdelay)
|
||||
udelay(10000);
|
||||
} while (!abort && get_timer(ts) < 1000);
|
||||
|
||||
printf("\rHit any key to stop autoboot: %1d\033[K", bootdelay);
|
||||
print_boot_delay(bootdelay);
|
||||
}
|
||||
|
||||
putc('\n');
|
||||
|
||||
Reference in New Issue
Block a user