* [PATCH] cmd: bootmenu: permit to select bootmenu entry with a shortcut
@ 2025-05-24 22:12 Christian Marangi
2025-05-25 13:02 ` Petr Štetiar
0 siblings, 1 reply; 3+ messages in thread
From: Christian Marangi @ 2025-05-24 22:12 UTC (permalink / raw)
To: Tom Rini, Weijie Gao, Heinrich Schuchardt, Daniel Golle,
Christian Marangi, Ilias Apalodimas, Marek Vasut, Simon Glass,
u-boot
Permit to select a bootmenu entry with a key shortcut. This is
especially useful in production or testing scenario to aitomate flashing
procedure or testing procedure.
The boot entry are changed to append the shortcut key to it.
Example:
1. Run default boot command.
2. Boot system via TFTP.
3. Boot production system from NAND.
4. Boot recovery system from NAND.
5. Load production system via TFTP then write to NAND.
6. Load recovery system via TFTP then write to NAND.
7. Load BL31+U-Boot FIP via TFTP then write to NAND.
8. Load BL2 preloader via TFTP then write to NAND.
9. Reboot.
a. Reset all settings to factory defaults.
0. Exit
0 is always reserved for Exit to console.
On pressing the keyboard key 2, the bootmenu entry 2 is selected and
executed.
Up to 34 key shortcut (0 excluded as reserved) are supported from 1-9
and a-z.
If a shortcut key not present in the bootmenu list is pressed, it is
simply ignored and eventually the autoboot is interrupted.
Capital A-Z are converted to lower a-z and the related option is
selected.
Suggested-by: Weijie Gao <weijie.gao@mediatek.com>
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
| 39 ++++++++++++++++++++++++++++++++++++---
| 44 ++++++++++++++++++++++++++++++++++++++++++--
include/cli.h | 2 ++
| 3 +++
4 files changed, 83 insertions(+), 5 deletions(-)
--git a/cmd/bootmenu.c b/cmd/bootmenu.c
index a5c979079f4..d060cda0ea6 100644
--- a/cmd/bootmenu.c
+++ b/cmd/bootmenu.c
@@ -114,6 +114,12 @@ static char *bootmenu_choice_entry(void *data)
++menu->active;
/* no menu key selected, regenerate menu */
return NULL;
+ case BKEY_SHORTCUT:
+ /* invalid shortcut, regenerate menu */
+ if (cch->shortcut_key >= menu->count - 1)
+ return NULL;
+ menu->active = cch->shortcut_key;
+ fallthrough;
case BKEY_SELECT:
iter = menu->first;
for (i = 0; i < menu->active; ++i)
@@ -161,6 +167,21 @@ static void bootmenu_destroy(struct bootmenu_data *menu)
free(menu);
}
+static char bootmenu_entry_shortcut_key(int index)
+{
+ switch (index) {
+ /* 1-9 shortcut key (0 reserved) */
+ case 0 ... 8:
+ return '1' + index;
+ /* a-z shortcut key */
+ case 9 ... 34:
+ return 'a' + index - 9;
+ /* We support shortcut for up to 34 options (0 reserved) */
+ default:
+ return -ENOENT;
+ }
+}
+
/**
* prepare_bootmenu_entry() - generate the bootmenu_xx entries
*
@@ -184,6 +205,8 @@ static int prepare_bootmenu_entry(struct bootmenu_data *menu,
struct bootmenu_entry *iter = *current;
while ((option = bootmenu_getoption(i))) {
+ char shortcut_key;
+ int len;
/* bootmenu_[num] format is "[title]=[commands]" */
sep = strchr(option, '=');
@@ -196,12 +219,22 @@ static int prepare_bootmenu_entry(struct bootmenu_data *menu,
if (!entry)
return -ENOMEM;
- entry->title = strndup(option, sep - option);
+ /* Add shotcut key option: %c. %s\0 */
+ len = sep - option + 4;
+
+ entry->title = malloc(len);
if (!entry->title) {
free(entry);
return -ENOMEM;
}
+ shortcut_key = bootmenu_entry_shortcut_key(i);
+ /* Use emtpy space if entry doesn't support shortcut key */
+ snprintf(entry->title, len, "%c%c %s",
+ shortcut_key > 0 ? shortcut_key : ' ',
+ shortcut_key > 0 ? '.' : ' ',
+ option);
+
entry->command = strdup(sep + 1);
if (!entry->command) {
free(entry->title);
@@ -388,9 +421,9 @@ static struct bootmenu_data *bootmenu_create(int uefi, int delay)
/* Add Quit entry if exiting bootmenu is disabled */
if (!IS_ENABLED(CONFIG_BOOTMENU_DISABLE_UBOOT_CONSOLE))
- entry->title = strdup("Exit");
+ entry->title = strdup("0. Exit");
else
- entry->title = strdup("Quit");
+ entry->title = strdup("0. Quit");
if (!entry->title) {
free(entry);
--git a/common/menu.c b/common/menu.c
index 5a2126aa01a..b78c2208b8b 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -8,6 +8,7 @@
#include <cli.h>
#include <malloc.h>
#include <errno.h>
+#include <linux/ctype.h>
#include <linux/delay.h>
#include <linux/list.h>
#include <watchdog.h>
@@ -436,6 +437,29 @@ int menu_destroy(struct menu *m)
return 1;
}
+static int bootmenu_conv_shortcut_key(struct bootmenu_data *menu, int ichar)
+{
+ int shortcut_key;
+
+ ichar = tolower(ichar);
+ switch (ichar) {
+ /* a-z for bootmenu entry > 9 */
+ case 'a' ... 'z':
+ shortcut_key = ichar - 'a' + 9;
+ break;
+ /* 1-9 for bootmenu entry <= 9 */
+ case '1' ... '9':
+ shortcut_key = ichar - '1';
+ break;
+ /* Reserve 0 for last option (aka Console) */
+ case '0':
+ default:
+ return menu->count - 1;
+ }
+
+ return shortcut_key;
+}
+
enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,
struct cli_ch_state *cch)
{
@@ -443,12 +467,12 @@ enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,
int i, c;
while (menu->delay > 0) {
+ int ichar;
+
if (ansi)
printf(ANSI_CURSOR_POSITION, menu->count + 5, 3);
printf("Hit any key to stop autoboot: %d ", menu->delay);
for (i = 0; i < 100; ++i) {
- int ichar;
-
if (!tstc()) {
schedule();
mdelay(10);
@@ -470,6 +494,11 @@ enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,
case 0x3: /* ^C */
key = BKEY_QUIT;
break;
+ case 'A' ... 'Z':
+ case 'a' ... 'z':
+ case '0' ... '9':
+ key = BKEY_SHORTCUT;
+ break;
default:
key = BKEY_NONE;
break;
@@ -477,6 +506,9 @@ enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,
break;
}
+ if (key == BKEY_SHORTCUT)
+ cch->shortcut_key = bootmenu_conv_shortcut_key(menu, ichar);
+
if (menu->delay < 0)
break;
@@ -524,6 +556,11 @@ enum bootmenu_key bootmenu_conv_key(int ichar)
case ' ':
key = BKEY_SPACE;
break;
+ case 'A' ... 'Z':
+ case 'a' ... 'z':
+ case '0' ... '9':
+ key = BKEY_SHORTCUT;
+ break;
default:
key = BKEY_NONE;
break;
@@ -554,5 +591,8 @@ enum bootmenu_key bootmenu_loop(struct bootmenu_data *menu,
key = bootmenu_conv_key(c);
+ if (key == BKEY_SHORTCUT)
+ cch->shortcut_key = bootmenu_conv_shortcut_key(menu, c);
+
return key;
}
diff --git a/include/cli.h b/include/cli.h
index e183d561369..453e88fa96d 100644
--- a/include/cli.h
+++ b/include/cli.h
@@ -17,12 +17,14 @@
* @esc_save: Escape characters collected so far
* @emit_upto: Next index to emit from esc_save
* @emitting: true if emitting from esc_save
+ * @shortcut_key: Selected shortcut option index
*/
struct cli_ch_state {
int esc_len;
char esc_save[8];
int emit_upto;
bool emitting;
+ int shortcut_key;
};
/**
--git a/include/menu.h b/include/menu.h
index 6cede89b950..54ff3b2e17a 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -54,6 +54,9 @@ enum bootmenu_key {
BKEY_QUIT,
BKEY_SAVE,
+ /* shortcut key to select menu option directly */
+ BKEY_SHORTCUT,
+
/* 'extra' keys, which are used by menus but not cedit */
BKEY_PLUS,
BKEY_MINUS,
--
2.48.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] cmd: bootmenu: permit to select bootmenu entry with a shortcut
2025-05-24 22:12 [PATCH] cmd: bootmenu: permit to select bootmenu entry with a shortcut Christian Marangi
@ 2025-05-25 13:02 ` Petr Štetiar
2025-05-25 13:34 ` Christian Marangi
0 siblings, 1 reply; 3+ messages in thread
From: Petr Štetiar @ 2025-05-25 13:02 UTC (permalink / raw)
To: Christian Marangi
Cc: Tom Rini, Weijie Gao, Heinrich Schuchardt, Daniel Golle,
Ilias Apalodimas, Marek Vasut, Simon Glass, u-boot
Christian Marangi <ansuelsmth@gmail.com> [2025-05-25 00:12:52]:
Hi,
thanks a lot for your upstreaming efforts!
> Permit to select a bootmenu entry with a key shortcut. This is
> especially useful in production or testing scenario to aitomate flashing
aitomate -> automate
> 0 is always reserved for Exit to console.
BTW this is the only shortcut key which currently doesn't work :-) See below.
> + case BKEY_SHORTCUT:
> + /* invalid shortcut, regenerate menu */
> + if (cch->shortcut_key >= menu->count - 1)
IMO it should be:
if (cch->shortcut_key >= menu->count)
Considering menu with 4 items and user presses '0':
* bootmenu_conv_shortcut_key() returns 3 (menu->count - 1), so shortcut_key = 3
* With the original condition
if (cch->shortcut_key >= menu->count - 1)
if (3 >= 3) → true, so it returns NULL (bug)
* With the fixed condition
if (cch->shortcut_key >= menu->count):
if (3 >= 4) → false, so it correctly proceeds
> + return NULL;
> + menu->active = cch->shortcut_key;
> + fallthrough;
Cheers,
Petr
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] cmd: bootmenu: permit to select bootmenu entry with a shortcut
2025-05-25 13:02 ` Petr Štetiar
@ 2025-05-25 13:34 ` Christian Marangi
0 siblings, 0 replies; 3+ messages in thread
From: Christian Marangi @ 2025-05-25 13:34 UTC (permalink / raw)
To: Petr Štetiar
Cc: Tom Rini, Weijie Gao, Heinrich Schuchardt, Daniel Golle,
Ilias Apalodimas, Marek Vasut, Simon Glass, u-boot
On Sun, May 25, 2025 at 01:02:13PM +0000, Petr Štetiar wrote:
> Christian Marangi <ansuelsmth@gmail.com> [2025-05-25 00:12:52]:
>
> Hi,
>
> thanks a lot for your upstreaming efforts!
>
> > Permit to select a bootmenu entry with a key shortcut. This is
> > especially useful in production or testing scenario to aitomate flashing
>
> aitomate -> automate
>
> > 0 is always reserved for Exit to console.
>
> BTW this is the only shortcut key which currently doesn't work :-) See below.
>
Eh last time bugfix and I forgot to test the 0 case... feel stupid
ahhaha
> > + case BKEY_SHORTCUT:
> > + /* invalid shortcut, regenerate menu */
> > + if (cch->shortcut_key >= menu->count - 1)
>
> IMO it should be:
>
> if (cch->shortcut_key >= menu->count)
>
> Considering menu with 4 items and user presses '0':
>
> * bootmenu_conv_shortcut_key() returns 3 (menu->count - 1), so shortcut_key = 3
>
> * With the original condition
> if (cch->shortcut_key >= menu->count - 1)
> if (3 >= 3) → true, so it returns NULL (bug)
>
> * With the fixed condition
> if (cch->shortcut_key >= menu->count):
> if (3 >= 4) → false, so it correctly proceeds
>
This is also problematic since pressing 'b' will act as exit. I have a
simple fix for this, sending v2.
> > + return NULL;
> > + menu->active = cch->shortcut_key;
> > + fallthrough;
>
> Cheers,
>
> Petr
--
Ansuel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-05-25 13:34 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-24 22:12 [PATCH] cmd: bootmenu: permit to select bootmenu entry with a shortcut Christian Marangi
2025-05-25 13:02 ` Petr Štetiar
2025-05-25 13:34 ` Christian Marangi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.