From: Weijie Gao Date: Tue, 29 Oct 2024 09:47:10 +0000 (+0800) Subject: menu: fix the logic checking whether ESC key is pressed X-Git-Url: http://git.dujemihanovic.xyz/img/sics.gif?a=commitdiff_plain;h=ddac69885efaffc68a71c1a159dc2b3ff4b9fda3;p=u-boot.git menu: fix the logic checking whether ESC key is pressed 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 Signed-off-by: Weijie Gao Reviewed-by: Daniel Golle Tested-by: Daniel Golle Reviewed-by: Simon Glass --- diff --git a/common/menu.c b/common/menu.c index 8cc9bf06d9..48ab7f0f39 100644 --- a/common/menu.c +++ b/common/menu.c @@ -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();