common, menu: use abortboot for menu timeout
Signed-off-by: Jason Hobbs <jason.hobbs@calxeda.com>
This commit is contained in:
parent
b69bf52dfe
commit
b41bc5a82d
|
@ -88,7 +88,10 @@ extern void mdm_init(void); /* defined in board.c */
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
|
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
|
||||||
# if defined(CONFIG_AUTOBOOT_KEYED)
|
# if defined(CONFIG_AUTOBOOT_KEYED)
|
||||||
static inline int abortboot(int bootdelay)
|
#ifndef CONFIG_MENU
|
||||||
|
static inline
|
||||||
|
#endif
|
||||||
|
int abortboot(int bootdelay)
|
||||||
{
|
{
|
||||||
int abort = 0;
|
int abort = 0;
|
||||||
uint64_t etime = endtick(bootdelay);
|
uint64_t etime = endtick(bootdelay);
|
||||||
|
@ -202,7 +205,10 @@ static inline int abortboot(int bootdelay)
|
||||||
static int menukey = 0;
|
static int menukey = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline int abortboot(int bootdelay)
|
#ifndef CONFIG_MENU
|
||||||
|
static inline
|
||||||
|
#endif
|
||||||
|
int abortboot(int bootdelay)
|
||||||
{
|
{
|
||||||
int abort = 0;
|
int abort = 0;
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ struct menu_item {
|
||||||
*/
|
*/
|
||||||
struct menu {
|
struct menu {
|
||||||
struct menu_item *default_item;
|
struct menu_item *default_item;
|
||||||
|
int timeout;
|
||||||
char *title;
|
char *title;
|
||||||
int prompt;
|
int prompt;
|
||||||
void (*item_data_print)(void *);
|
void (*item_data_print)(void *);
|
||||||
|
@ -157,14 +158,30 @@ static inline struct menu_item *menu_item_by_key(struct menu *m,
|
||||||
return menu_items_iter(m, menu_item_key_match, item_key);
|
return menu_items_iter(m, menu_item_key_match, item_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait for the user to hit a key according to the timeout set for the menu.
|
||||||
|
* Returns 1 if the user hit a key, or 0 if the timeout expired.
|
||||||
|
*/
|
||||||
|
static inline int menu_interrupted(struct menu *m)
|
||||||
|
{
|
||||||
|
if (!m->timeout)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (abortboot(m->timeout/10))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Checks whether or not the default menu item should be used without
|
* Checks whether or not the default menu item should be used without
|
||||||
* prompting for a user choice. If the menu is set to always prompt, return
|
* prompting for a user choice. If the menu is set to always prompt, or the
|
||||||
* 0. Otherwise, return 1 to indicate we should use the default menu item.
|
* user hits a key during the timeout period, return 0. Otherwise, return 1 to
|
||||||
|
* indicate we should use the default menu item.
|
||||||
*/
|
*/
|
||||||
static inline int menu_use_default(struct menu *m)
|
static inline int menu_use_default(struct menu *m)
|
||||||
{
|
{
|
||||||
return !m->prompt;
|
return !m->prompt && !menu_interrupted(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -250,7 +267,8 @@ int menu_default_set(struct menu *m, char *item_key)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* menu_get_choice() - Returns the user's selected menu entry, or the default
|
* 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.
|
* 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().
|
* m - Points to a menu created by menu_create().
|
||||||
*
|
*
|
||||||
|
@ -259,8 +277,8 @@ int menu_default_set(struct menu *m, char *item_key)
|
||||||
* written at the location it points to.
|
* written at the location it points to.
|
||||||
*
|
*
|
||||||
* Returns 1 if successful, -EINVAL if m or choice is NULL, -ENOENT if no
|
* 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
|
* default has been set and the menu is set to not prompt or the timeout
|
||||||
* user exits the menu via ^c.
|
* expires, or -EINTR if the user exits the menu via ^c.
|
||||||
*/
|
*/
|
||||||
int menu_get_choice(struct menu *m, void **choice)
|
int menu_get_choice(struct menu *m, void **choice)
|
||||||
{
|
{
|
||||||
|
@ -330,7 +348,12 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)
|
||||||
* list of menu items. It will be copied to internal storage, and is safe to
|
* list of menu items. It will be copied to internal storage, and is safe to
|
||||||
* discard after passing to menu_create().
|
* discard after passing to menu_create().
|
||||||
*
|
*
|
||||||
* prompt - If 0, don't ask for user input.
|
* 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
|
* 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 as the argument.
|
* is displayed, with the pointer to the item's data passed as the argument.
|
||||||
|
@ -341,7 +364,7 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)
|
||||||
* Returns a pointer to the menu if successful, or NULL if there is
|
* Returns a pointer to the menu if successful, or NULL if there is
|
||||||
* insufficient memory available to create the menu.
|
* insufficient memory available to create the menu.
|
||||||
*/
|
*/
|
||||||
struct menu *menu_create(char *title, int prompt,
|
struct menu *menu_create(char *title, int timeout, int prompt,
|
||||||
void (*item_data_print)(void *))
|
void (*item_data_print)(void *))
|
||||||
{
|
{
|
||||||
struct menu *m;
|
struct menu *m;
|
||||||
|
@ -353,6 +376,7 @@ struct menu *menu_create(char *title, int prompt,
|
||||||
|
|
||||||
m->default_item = NULL;
|
m->default_item = NULL;
|
||||||
m->prompt = prompt;
|
m->prompt = prompt;
|
||||||
|
m->timeout = timeout;
|
||||||
m->item_data_print = item_data_print;
|
m->item_data_print = item_data_print;
|
||||||
|
|
||||||
if (title) {
|
if (title) {
|
||||||
|
|
|
@ -45,7 +45,7 @@ struct menu;
|
||||||
/*
|
/*
|
||||||
* menu_create() - Creates a menu handle with default settings
|
* menu_create() - Creates a menu handle with default settings
|
||||||
*/
|
*/
|
||||||
struct menu *menu_create(char *title, int prompt,
|
struct menu *menu_create(char *title, int timeout, int prompt,
|
||||||
void (*item_data_print)(void *));
|
void (*item_data_print)(void *));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -60,7 +60,7 @@ int menu_default_set(struct menu *m, char *item_key);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* menu_get_choice() - Returns the user's selected menu entry, or the
|
* menu_get_choice() - Returns the user's selected menu entry, or the
|
||||||
* default if the menu is set to not prompt.
|
* default if the menu is set to not prompt or the timeout expires.
|
||||||
*/
|
*/
|
||||||
int menu_get_choice(struct menu *m, void **choice);
|
int menu_get_choice(struct menu *m, void **choice);
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ char *pick_a_tool(void)
|
||||||
int i;
|
int i;
|
||||||
char *tool = NULL;
|
char *tool = NULL;
|
||||||
|
|
||||||
m = menu_create("Tools", 1, NULL);
|
m = menu_create("Tools", 0, 1, NULL);
|
||||||
|
|
||||||
for(i = 0; tools[i]; i++) {
|
for(i = 0; tools[i]; i++) {
|
||||||
if (menu_item_add(m, tools[i], tools[i]) != 1) {
|
if (menu_item_add(m, tools[i], tools[i]) != 1) {
|
||||||
|
|
|
@ -260,6 +260,9 @@ int readline_into_buffer (const char *const prompt, char * buffer);
|
||||||
int parse_line (char *, char *[]);
|
int parse_line (char *, char *[]);
|
||||||
void init_cmd_timeout(void);
|
void init_cmd_timeout(void);
|
||||||
void reset_cmd_timeout(void);
|
void reset_cmd_timeout(void);
|
||||||
|
#ifdef CONFIG_MENU
|
||||||
|
int abortboot(int bootdelay);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* arch/$(ARCH)/lib/board.c */
|
/* arch/$(ARCH)/lib/board.c */
|
||||||
void board_init_f (ulong) __attribute__ ((noreturn));
|
void board_init_f (ulong) __attribute__ ((noreturn));
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
struct menu;
|
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 *));
|
void (*item_data_print)(void *));
|
||||||
int menu_default_set(struct menu *m, char *item_key);
|
int menu_default_set(struct menu *m, char *item_key);
|
||||||
int menu_get_choice(struct menu *m, void **choice);
|
int menu_get_choice(struct menu *m, void **choice);
|
||||||
|
|
Loading…
Reference in New Issue