ソースを参照

common, menu: use abortboot for menu timeout

Signed-off-by: Jason Hobbs <jason.hobbs@calxeda.com>
Jason Hobbs 13 年 前
コミット
b41bc5a82d
5 ファイル変更47 行追加14 行削除
  1. 8 2
      common/main.c
  2. 32 8
      common/menu.c
  3. 3 3
      doc/README.menu
  4. 3 0
      include/common.h
  5. 1 1
      include/menu.h

+ 8 - 2
common/main.c

@@ -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;
 
 

+ 32 - 8
common/menu.c

@@ -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
- * 0. Otherwise, return 1 to indicate we should use the default menu item.
+ * prompting for a user choice. If the menu is set to always prompt, or the
+ * 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
- * user exits the menu via ^c.
+ * 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 ^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) {

+ 3 - 3
doc/README.menu

@@ -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) {

+ 3 - 0
include/common.h

@@ -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));

+ 1 - 1
include/menu.h

@@ -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);