xref: /openbmc/u-boot/doc/README.menu (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
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