]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
menu: fix the logic checking whether ESC key is pressed
authorWeijie Gao <weijie.gao@mediatek.com>
Tue, 29 Oct 2024 09:47:10 +0000 (17:47 +0800)
committerTom Rini <trini@konsulko.com>
Mon, 4 Nov 2024 22:41:38 +0000 (16:41 -0600)
It's observed that the bootmenu on a serial console sometimes
incorrectly quitted with superfluous characters filled to command
line input:

>  *** U-Boot Boot Menu ***
>
>      1. Startup system (Default)
>      2. Upgrade firmware
>      3. Upgrade ATF BL2
>      4. Upgrade ATF FIP
>      5. Load image
>      0. U-Boot console
>
>
>  Press UP/DOWN to move, ENTER to select, ESC to quit
>MT7988> [B

Analysis shows it was caused by the wrong logic of bootmenu_loop:

At first the bootmenu_loop received the first ESC char correctly.

However, during the second call to bootmenu_loop, there's no data
in the UART Rx FIFO. Due to the low baudrate, the second char of
the down array key sequence hasn't be fully received.

But bootmenu_loop just did a mdelay(10), and then treated it as a
single ESC key press event. It didn't even try tstc() again after
the 10ms timeout.

This patch fixes this issue by letting bootmenu_loop check tstc()
twice.

Tested-By: E Shattow <lucent@gmail.com>
Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
Reviewed-by: Daniel Golle <daniel@makrotopia.org>
Tested-by: Daniel Golle <daniel@makrotopia.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/menu.c

index 8cc9bf06d9c266fe1d9302ba52a8a368640229e7..48ab7f0f398c6a10fd3a01a08aca02f013dc4c44 100644 (file)
@@ -525,14 +525,15 @@ enum bootmenu_key bootmenu_loop(struct bootmenu_data *menu,
                                struct cli_ch_state *cch)
 {
        enum bootmenu_key key;
-       int c;
+       int c, errchar = 0;
 
        c = cli_ch_process(cch, 0);
        if (!c) {
                while (!c && !tstc()) {
                        schedule();
                        mdelay(10);
-                       c = cli_ch_process(cch, -ETIMEDOUT);
+                       c = cli_ch_process(cch, errchar);
+                       errchar = -ETIMEDOUT;
                }
                if (!c) {
                        c = getchar();