Signed-off-by: Jason Hobbs <jason.ho...@calxeda.com> --- changes in v2: - expose abortboot externally instead of using a wrapper - expose abortboot externally when CONFIG_MENU is set
changes in v3: - simplify the conditional export of abortboot - add timeout support for the menu in this patch - add doc for timeout feature common/main.c | 10 ++++++++-- common/menu.c | 17 +++++++++++++++-- doc/README.menu | 25 ++++++++++++++----------- include/common.h | 3 +++ include/menu.h | 2 +- 5 files changed, 41 insertions(+), 16 deletions(-) diff --git a/common/main.c b/common/main.c index 01931a1..1a371b1 100644 --- a/common/main.c +++ b/common/main.c @@ -87,7 +87,10 @@ extern void mdm_init(void); /* defined in board.c */ */ #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0) # if defined(CONFIG_AUTOBOOT_KEYED) -static inline int abortboot(int bootdelay) +#ifndef CONFIG_MENU +static inline +#endif +int abortboot(int bootdelay) { int abort = 0; uint64_t etime = endtick(bootdelay); @@ -201,7 +204,10 @@ static inline int abortboot(int bootdelay) static int menukey = 0; #endif -static inline int abortboot(int bootdelay) +#ifndef CONFIG_MENU +static inline +#endif +int abortboot(int bootdelay) { int abort = 0; diff --git a/common/menu.c b/common/menu.c index 9bcd906..507b122 100644 --- a/common/menu.c +++ b/common/menu.c @@ -30,6 +30,7 @@ struct menu_item { struct menu { struct menu_item *default_item; + int timeout; char *title; int prompt; void (*item_data_print)(void *); @@ -113,9 +114,20 @@ static inline struct menu_item *menu_item_by_key(struct menu *m, return menu_items_iter(m, menu_item_key_match, item_key); } +static inline int menu_interrupted(struct menu *m) +{ + if (!m->timeout) + return 0; + + if (abortboot(m->timeout/10)) + return 1; + + return 0; +} + static inline int menu_use_default(struct menu *m) { - return !m->prompt; + return !m->prompt && !menu_interrupted(m); } static inline int menu_default_choice(struct menu *m, void **choice) @@ -221,7 +233,7 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data) return 1; } -struct menu *menu_create(char *title, int prompt, +struct menu *menu_create(char *title, int timeout, int prompt, void (*item_data_print)(void *)) { struct menu *m; @@ -233,6 +245,7 @@ struct menu *menu_create(char *title, int prompt, m->default_item = NULL; m->prompt = prompt; + m->timeout = timeout; m->item_data_print = item_data_print; if (title) { diff --git a/doc/README.menu b/doc/README.menu index bca44be..aa48b6f 100644 --- a/doc/README.menu +++ b/doc/README.menu @@ -31,7 +31,7 @@ Interfaces struct menu; -struct menu *menu_create(char *title, int prompt, +struct menu *menu_create(char *title, int timeout, int prompt, void (*item_data_print)(void *)); int menu_item_add(struct menu *m, char *item_key, void *item_data); int menu_default_set(struct menu *m, char *item_key); @@ -44,8 +44,12 @@ menu_create() - Creates a menu handle with default settings the list of menu items. It will be copied to internal storage, and is safe to discard after passing to menu_create(). - prompt - If 0, don't ask for user input. If 1, the user will be ed for - promptinput. + timeout - A delay in seconds to wait for user input. If 0, timeout is + disabled, and the default choice will be returned unless prompt is 1. + + prompt - If 0, don't ask for user input unless there is an interrupted + timeout. If 1, the user will be prompted for input regardless of the + value of timeout. item_data_print - If not NULL, will be called for each item when the menu is displayed, with the pointer to the item's data passed @@ -76,7 +80,7 @@ menu_item_add() - Adds or replaces a menu item menu_default_set() - Sets the default choice for the menu. This is safe -to call more than once. + to call more than once. m - Points to a menu created by menu_create(). @@ -88,8 +92,8 @@ to call more than once. menu_get_choice() - Returns the user's selected menu entry, or the -default if the menu is set to not prompt. This is safe to call more than -once. + default if the menu is set to not prompt or the timeout expires. + This is safe to call more than once. m - Points to a menu created by menu_create(). @@ -97,9 +101,9 @@ once. selected menu item. If no item is selected or there is an error, no value will be written at the location it points to. - Returns 1 if successful, -EINVAL if m or choice is NULL, -ENOENT if no - default has been set and the menu is set to not prompt, or -EINTR if - the user exits the menu via ctrl+c. + Returns 1 if successful, -EINVAL if m or choice is NULL, -ENOENT if + no default has been set and the menu is set to not prompt or the + timeout expires, or -EINTR if the user exits the menu via ctrl+c. menu_destroy() - frees the memory used by a menu and its items. @@ -108,7 +112,6 @@ menu_destroy() - frees the memory used by a menu and its items. Returns 1 if successful, or -EINVAL if m is NULL. - Example ------- This example creates a menu that always prompts, and allows the user @@ -129,7 +132,7 @@ char *pick_a_tool(void) int i; char *tool = NULL; - m = menu_create("Tools", 1, NULL); + m = menu_create("Tools", 0, 1, NULL); for(i = 0; tools[i]; i++) { if (menu_item_add(m, tools[i], tools[i]) != 1) { diff --git a/include/common.h b/include/common.h index 1e21b7a..394a005 100644 --- a/include/common.h +++ b/include/common.h @@ -233,6 +233,9 @@ int readline_into_buffer (const char *const prompt, char * buffer); int parse_line (char *, char *[]); void init_cmd_timeout(void); void reset_cmd_timeout(void); +#ifdef CONFIG_MENU +int abortboot(int bootdelay); +#endif /* arch/$(ARCH)/lib/board.c */ void board_init_f (ulong) __attribute__ ((noreturn)); diff --git a/include/menu.h b/include/menu.h index d47e1a0..cf14a9c 100644 --- a/include/menu.h +++ b/include/menu.h @@ -20,7 +20,7 @@ struct menu; -struct menu *menu_create(char *title, int prompt, +struct menu *menu_create(char *title, int timeout, int prompt, void (*item_data_print)(void *)); int menu_default_set(struct menu *m, char *item_key); int menu_get_choice(struct menu *m, void **choice); -- 1.7.0.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot