[PATCH] bootmenu: Allow to quit it via CTRL+C
Heinrich Schuchardt
xypron.glpk at gmx.de
Sat Dec 26 23:15:29 CET 2020
On 12/26/20 8:50 PM, Pali Rohár wrote:
> On Saturday 26 December 2020 20:44:45 Heinrich Schuchardt wrote:
>> Am 26. Dezember 2020 20:15:40 MEZ schrieb "Pali Rohár" <pali at kernel.org>:
>>> On Saturday 26 December 2020 20:10:10 Heinrich Schuchardt wrote:
>>>> Am 26. Dezember 2020 20:03:56 MEZ schrieb "Pali Rohár"
>>> <pali at kernel.org>:
>>>>> On Saturday 26 December 2020 19:44:23 Heinrich Schuchardt wrote:
>>>>>> Am 26. Dezember 2020 19:02:25 MEZ schrieb "Pali Rohár"
>>>>> <pali at kernel.org>:
>>>>>>> When CTRL+C is pressed interrupt bootmenu and jump into U-Boot
>>>>> console.
>>>>>>> As the last entry in bootmenu is always U-Boot console just
>>> choose
>>>>> the
>>>>>>> last
>>>>>>> entry when CTRL+C is pressed.
>>>>>>>
>>>>>>> It is useful when bootmenu is part of boot process and you want
>>> to
>>>>>>> interrupt boot process by scripts which control U-Boot (serial)
>>>>>>> console.
>>>>>>
>>>>>> Wouldn't the escape key be a better choice?
>>>>>
>>>>> I can add also escape key. But has escape key stable ANSI sequence
>>>>> which
>>>>> is needed to catch? If you tell me which bytes to catch (for escape
>>>>> key)
>>>>> I will add it.
>>>>
>>>> 0x1b is Escape
>>>
>>> Does not work. 0x1b is not escape key. It is start of the ANSI escape
>>> sequence which matches also existing keys up and down.
>>
>> On the serial console you have to hit the key twice.
>>
>> The device driver will tranlate it to a single 0x1b which is the char you want to react to.
>
> Which device driver? bootmenu code is already catching and reacting to
> the byte 0x1b as part of the key up and key down matching. So single
> 0x1b for sure cannot be caught in bootmenu code as then key up and key
> down keys stops working. If it is really 0x1b byte then it needs to be
> somehow escaped and therefore be part of some longer, not single byte
> sequence.
>
diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c
index 1ba7b622e5..26222ff8b7 100644
--- a/cmd/bootmenu.c
+++ b/cmd/bootmenu.c
@@ -44,6 +44,7 @@ enum bootmenu_key {
KEY_NONE = 0,
KEY_UP,
KEY_DOWN,
+ KEY_QUIT,
KEY_SELECT,
};
@@ -153,11 +154,18 @@ static void bootmenu_loop(struct bootmenu_data *menu,
break;
case 1:
/* Second char of ANSI '[' */
- if (c == '[') {
+ switch (c) {
+ case '\e':
+ *esc = 0;
+ *key = KEY_QUIT;
+ break;
+ case '[':
*esc = 2;
*key = KEY_NONE;
- } else {
+ break;
+ default:
*esc = 0;
+ break;
}
break;
case 2:
@@ -217,6 +225,12 @@ static char *bootmenu_choice_entry(void *data)
++menu->active;
/* no menu key selected, regenerate menu */
return NULL;
+ case KEY_QUIT:
+ /* Quit by choosing the last entry - U-Boot console */
+ iter = menu->first;
+ while (iter->next)
+ iter = iter->next;
+ return iter->key;
case KEY_SELECT:
iter = menu->first;
for (i = 0; i < menu->active; ++i)
More information about the U-Boot
mailing list