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

Simon Glass sjg at chromium.org
Mon Jan 11 17:59:18 CET 2016


Hi Craig,

On 20 December 2015 at 19:07, Craig McQueen
<craig.mcqueen at innerrange.com> wrote:
> 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.

I wonder if this can be fixed for that board only?

One option might be to clear out the UART input buffer when the driver
is probed. You could copy the TI maintainer also, for comments.

At present I can press a key before U-Boot comes up and it will be
picked up. I suspect that this patch would break that, although I have
not tested 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
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

Regards,
Simon


More information about the U-Boot mailing list