1*83d290c5STom RiniSPDX-License-Identifier: GPL-2.0+ 2b69bf52dSJason Hobbs/* 3b69bf52dSJason Hobbs * Copyright 2010-2011 Calxeda, Inc. 4b69bf52dSJason Hobbs */ 5b69bf52dSJason Hobbs 6a187559eSBin MengU-Boot provides a set of interfaces for creating and using simple, text 7b69bf52dSJason Hobbsbased menus. Menus are displayed as lists of labeled entries on the 8b69bf52dSJason Hobbsconsole, and an entry can be selected by entering its label. 9b69bf52dSJason Hobbs 10b69bf52dSJason HobbsTo use the menu code, enable CONFIG_MENU, and include "menu.h" where 11b69bf52dSJason Hobbsthe interfaces should be available. 12b69bf52dSJason Hobbs 13b69bf52dSJason HobbsMenus are composed of items. Each item has a key used to identify it in 14b69bf52dSJason Hobbsthe menu, and an opaque pointer to data controlled by the consumer. 15b69bf52dSJason Hobbs 16317d6c57SHeiko SchocherIf you want to show a menu, instead starting the shell, define 17317d6c57SHeiko SchocherCONFIG_MENU_SHOW. You have to code the int menu_show(int bootdelay) 18317d6c57SHeiko Schocherfunction, which handle your menu. This function returns the remaining 19317d6c57SHeiko Schocherbootdelay. 20317d6c57SHeiko Schocher 21b69bf52dSJason HobbsInterfaces 22b69bf52dSJason Hobbs---------- 23b69bf52dSJason Hobbs#include "menu.h" 24b69bf52dSJason Hobbs 25b69bf52dSJason Hobbs/* 26b69bf52dSJason Hobbs * Consumers of the menu interfaces will use a struct menu * as the 27b69bf52dSJason Hobbs * handle for a menu. struct menu is only fully defined in menu.c, 28b69bf52dSJason Hobbs * preventing consumers of the menu interfaces from accessing its 29b69bf52dSJason Hobbs * contents directly. 30b69bf52dSJason Hobbs */ 31b69bf52dSJason Hobbsstruct menu; 32b69bf52dSJason Hobbs 33b69bf52dSJason Hobbs/* 34b69bf52dSJason Hobbs * NOTE: See comments in common/menu.c for more detailed documentation on 35b69bf52dSJason Hobbs * these interfaces. 36b69bf52dSJason Hobbs */ 37b69bf52dSJason Hobbs 38b69bf52dSJason Hobbs/* 39b69bf52dSJason Hobbs * menu_create() - Creates a menu handle with default settings 40b69bf52dSJason Hobbs */ 41b41bc5a8SJason Hobbsstruct menu *menu_create(char *title, int timeout, int prompt, 42fc9d64ffSPali Rohár void (*item_data_print)(void *), 43fc9d64ffSPali Rohár char *(*item_choice)(void *), 44fc9d64ffSPali Rohár void *item_choice_data); 45b69bf52dSJason Hobbs 46b69bf52dSJason Hobbs/* 47b69bf52dSJason Hobbs * menu_item_add() - Adds or replaces a menu item 48b69bf52dSJason Hobbs */ 49b69bf52dSJason Hobbsint menu_item_add(struct menu *m, char *item_key, void *item_data); 50b69bf52dSJason Hobbs 51b69bf52dSJason Hobbs/* 52b69bf52dSJason Hobbs * menu_default_set() - Sets the default choice for the menu 53b69bf52dSJason Hobbs */ 54b69bf52dSJason Hobbsint menu_default_set(struct menu *m, char *item_key); 55b69bf52dSJason Hobbs 56b69bf52dSJason Hobbs/* 576a3439fdSAnatolij Gustschin * menu_default_choice() - Set *choice to point to the default item's data 586a3439fdSAnatolij Gustschin */ 596a3439fdSAnatolij Gustschinint menu_default_choice(struct menu *m, void **choice); 606a3439fdSAnatolij Gustschin 616a3439fdSAnatolij Gustschin/* 62b69bf52dSJason Hobbs * menu_get_choice() - Returns the user's selected menu entry, or the 63b41bc5a8SJason Hobbs * default if the menu is set to not prompt or the timeout expires. 64b69bf52dSJason Hobbs */ 65b69bf52dSJason Hobbsint menu_get_choice(struct menu *m, void **choice); 66b69bf52dSJason Hobbs 67b69bf52dSJason Hobbs/* 68b69bf52dSJason Hobbs * menu_destroy() - frees the memory used by a menu and its items. 69b69bf52dSJason Hobbs */ 70b69bf52dSJason Hobbsint menu_destroy(struct menu *m); 71b69bf52dSJason Hobbs 72e0611dd9SHeiko Schocher/* 73e0611dd9SHeiko Schocher * menu_display_statusline(struct menu *m); 74e0611dd9SHeiko Schocher * shows a statusline for every menu_display call. 75e0611dd9SHeiko Schocher */ 76e0611dd9SHeiko Schochervoid menu_display_statusline(struct menu *m); 77b69bf52dSJason Hobbs 78b69bf52dSJason HobbsExample Code 79b69bf52dSJason Hobbs------------ 80b69bf52dSJason HobbsThis example creates a menu that always prompts, and allows the user 81b69bf52dSJason Hobbsto pick from a list of tools. The item key and data are the same. 82b69bf52dSJason Hobbs 83b69bf52dSJason Hobbs#include "menu.h" 84b69bf52dSJason Hobbs 85b69bf52dSJason Hobbschar *tools[] = { 86b69bf52dSJason Hobbs "Hammer", 87b69bf52dSJason Hobbs "Screwdriver", 88b69bf52dSJason Hobbs "Nail gun", 89b69bf52dSJason Hobbs NULL 90b69bf52dSJason Hobbs}; 91b69bf52dSJason Hobbs 92b69bf52dSJason Hobbschar *pick_a_tool(void) 93b69bf52dSJason Hobbs{ 94b69bf52dSJason Hobbs struct menu *m; 95b69bf52dSJason Hobbs int i; 96b69bf52dSJason Hobbs char *tool = NULL; 97b69bf52dSJason Hobbs 98b41bc5a8SJason Hobbs m = menu_create("Tools", 0, 1, NULL); 99b69bf52dSJason Hobbs 100b69bf52dSJason Hobbs for(i = 0; tools[i]; i++) { 101b69bf52dSJason Hobbs if (menu_item_add(m, tools[i], tools[i]) != 1) { 102b69bf52dSJason Hobbs printf("failed to add item!"); 103b69bf52dSJason Hobbs menu_destroy(m); 104b69bf52dSJason Hobbs return NULL; 105b69bf52dSJason Hobbs } 106b69bf52dSJason Hobbs } 107b69bf52dSJason Hobbs 108b69bf52dSJason Hobbs if (menu_get_choice(m, (void **)&tool) != 1) 109b69bf52dSJason Hobbs printf("Problem picking tool!\n"); 110b69bf52dSJason Hobbs 111b69bf52dSJason Hobbs menu_destroy(m); 112b69bf52dSJason Hobbs 113b69bf52dSJason Hobbs return tool; 114b69bf52dSJason Hobbs} 115b69bf52dSJason Hobbs 116b69bf52dSJason Hobbsvoid caller(void) 117b69bf52dSJason Hobbs{ 118b69bf52dSJason Hobbs char *tool = pick_a_tool(); 119b69bf52dSJason Hobbs 120b69bf52dSJason Hobbs if (tool) { 121b69bf52dSJason Hobbs printf("picked a tool: %s\n", tool); 122b69bf52dSJason Hobbs use_tool(tool); 123b69bf52dSJason Hobbs } 124b69bf52dSJason Hobbs} 125