On Tue, 29 Oct 2024 at 10:47, Weijie Gao <weijie....@mediatek.com> wrote: > > 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 <luc...@gmail.com> > Signed-off-by: Weijie Gao <weijie....@mediatek.com> > --- > common/menu.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/common/menu.c b/common/menu.c > index 8cc9bf06d9c..48ab7f0f398 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(); > -- > 2.45.2 >
Reviewed-by: Simon Glass <s...@chromium.org>