[U-Boot] [PATCH v3 3/7] common, menu: use abortboot for menu timeout

Jason Hobbs jason.hobbs at calxeda.com
Wed Jun 29 18:25:15 CEST 2011


Signed-off-by: Jason Hobbs <jason.hobbs at 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



More information about the U-Boot mailing list