From patchwork Wed Jun 29 16:25:15 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Hobbs X-Patchwork-Id: 102628 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id B96D2B6F54 for ; Thu, 30 Jun 2011 02:27:01 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 53414280AA; Wed, 29 Jun 2011 18:26:39 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Agn3ThNyHAVG; Wed, 29 Jun 2011 18:26:38 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 6BED7280B8; Wed, 29 Jun 2011 18:26:18 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id AE18E2809F for ; Wed, 29 Jun 2011 18:26:12 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oy+uLWEE+F0f for ; Wed, 29 Jun 2011 18:26:11 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from smtp155.dfw.emailsrvr.com (smtp155.dfw.emailsrvr.com [67.192.241.155]) by theia.denx.de (Postfix) with ESMTPS id A7BCB280A0 for ; Wed, 29 Jun 2011 18:26:05 +0200 (CEST) Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp15.relay.dfw1a.emailsrvr.com (SMTP Server) with ESMTP id EC52830007D; Wed, 29 Jun 2011 12:26:00 -0400 (EDT) X-Virus-Scanned: OK Received: by smtp15.relay.dfw1a.emailsrvr.com (Authenticated sender: jason.hobbs-AT-calxeda.com) with ESMTPSA id DF4BF300324; Wed, 29 Jun 2011 12:25:57 -0400 (EDT) Received: by jhobbs-laptop (sSMTP sendmail emulation); Wed, 29 Jun 2011 11:25:48 -0500 From: "Jason Hobbs" To: u-boot@lists.denx.de Date: Wed, 29 Jun 2011 11:25:15 -0500 Message-Id: <1309364719-16219-4-git-send-email-jason.hobbs@calxeda.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1309364719-16219-1-git-send-email-jason.hobbs@calxeda.com> References: <1309364719-16219-1-git-send-email-jason.hobbs@calxeda.com> Cc: Jason Hobbs Subject: [U-Boot] [PATCH v3 3/7] common, menu: use abortboot for menu timeout X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.9 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de Signed-off-by: Jason Hobbs --- 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);