summaryrefslogtreecommitdiff
path: root/board/MAI/menu
diff options
context:
space:
mode:
authorwdenk <wdenk>2002-11-19 11:04:11 +0000
committerwdenk <wdenk>2002-11-19 11:04:11 +0000
commitc7de829c796978e519984df2f1c8cfcf921a39a4 (patch)
tree43e42aa9a09f5265783c1622a5cea080471ef50e /board/MAI/menu
parent2262cfeef91458b01a1bfe3812ccbbfdf8b82807 (diff)
downloadu-boot-imx-c7de829c796978e519984df2f1c8cfcf921a39a4.zip
u-boot-imx-c7de829c796978e519984df2f1c8cfcf921a39a4.tar.gz
u-boot-imx-c7de829c796978e519984df2f1c8cfcf921a39a4.tar.bz2
* Patch by Thomas Frieden, 13 Nov 2002:
Add code for AmigaOne board (preliminary merge to U-Boot, still WIP) * Patch by Jon Diekema, 12 Nov 2002: - Adding URL for IEEE OUI lookup - Making the autoboot #defines dependent on CONFIG_AUTOBOOT_KEYED being defined. - In the CONFIG_EXTRA_ENV_SETTINGS #define, the root-on-initrd and root-on-nfs macros are designed to switch how the default boot method gets defined.
Diffstat (limited to 'board/MAI/menu')
-rw-r--r--board/MAI/menu/cmd_menu.c9
-rw-r--r--board/MAI/menu/menu.c66
-rw-r--r--board/MAI/menu/menu.h174
3 files changed, 249 insertions, 0 deletions
diff --git a/board/MAI/menu/cmd_menu.c b/board/MAI/menu/cmd_menu.c
new file mode 100644
index 0000000..a24ab49
--- /dev/null
+++ b/board/MAI/menu/cmd_menu.c
@@ -0,0 +1,9 @@
+#include <common.h>
+#include <command.h>
+#include <cmd_menu.h>
+
+int do_menu( cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[] )
+{
+// printf("<NOT YET IMPLEMENTED>\n");
+ return 0;
+}
diff --git a/board/MAI/menu/menu.c b/board/MAI/menu/menu.c
new file mode 100644
index 0000000..3130142
--- /dev/null
+++ b/board/MAI/menu/menu.c
@@ -0,0 +1,66 @@
+#include "menu.h"
+
+#define SINGLE_BOX 0
+#define DOUBLE_BOX 1
+
+void video_draw_box(int style, int attr, char *title, int separate, int x, int y, int w, int h);
+void video_draw_text(int x, int y, int attr, char *text);
+void video_save_rect(int x, int y, int w, int h, void *save_area, int clearchar, int clearattr);
+void video_restore_rect(int x, int y, int w, int h, void *save_area);
+int video_rows(void);
+int video_cols(void);
+
+#define MAX_MENU_OPTIONS 200
+
+typedef struct
+{
+ int used; /* flag if this entry is used */
+ int entry_x; /* Character column of the menu entry */
+ int entry_y; /* Character line of the entry */
+ int option_x; /* Character colum of the option (entry is same) */
+} option_data_t;
+
+option_data_t odata[MAX_MENU_OPTIONS];
+
+int normal_attr = 0x0F;
+int select_attr = 0x2F;
+int disabled_attr = 0x07;
+
+menu_t *root_menu;
+
+int menu_init (menu_t *root)
+{
+ char *s;
+ int i;
+
+ s = getenv("menu_normal");
+ if (s) normal_attr = atoi(s);
+
+ s = getenv("menu_select");
+ if (s) select_attr = atoi(s);
+
+ s = getenv("menu_disabled");
+ if (s) disabled_attr = atoi(s);
+
+ for (i=0; i<MAX_MENU_OPTIONS; i++) odata[i].used = 0;
+
+ root_menu = root;
+}
+
+option_data_t *menu_alloc_odata(void)
+{
+ int i;
+ for (int i=0; i<MAX_MENU_OPTIONS; i++)
+ {
+ if (odata[i].used == 0) return &odata[i];
+ }
+ return NULL;
+}
+
+void menu_free_odata(option_data_t *odata)
+{
+ odata->used = 0;
+}
+
+void menu_layout (menu_t *menu)
+{
diff --git a/board/MAI/menu/menu.h b/board/MAI/menu/menu.h
new file mode 100644
index 0000000..e5886b8
--- /dev/null
+++ b/board/MAI/menu/menu.h
@@ -0,0 +1,174 @@
+#ifndef MENU_H
+#define MENU_H
+
+/* A single menu */
+typedef void (*menu_finish_callback)(struct menu_s *menu);
+
+typedef struct menu_s
+{
+ char *name; /* Menu name */
+ int num_options; /* Number of options in this menu */
+ int flags; /* Various flags - see below */
+ int option_align; /* Aligns options to a field width of this much characters if != 0 */
+
+ struct menu_option_s **options; /* Pointer to this menu's options */
+ menu_finish_callback callback; /* Called when the menu closes */
+} menu_t;
+
+/*
+ * type: Type of the option (see below)
+ * name: Name to display for this option
+ * help: Optional help string
+ * id : optional id number
+ * sys : pointer for system-specific data, init to NULL and don't touch
+ */
+
+#define OPTION_PREAMBLE \
+ int type; \
+ char *name; \
+ char *help; \
+ int id; \
+ void *sys; \
+
+
+/*
+ * Menu option types.
+ * There are a number of different layouts for menu options depending
+ * on their types. Currently there are the following possibilities:
+ *
+ * Submenu:
+ * This entry links to a new menu.
+ *
+ * Boolean:
+ * A simple on/off toggle entry. Booleans can be either yes/no, 0/1 or on/off.
+ * Optionally, this entry can enable/disable a set of other options. An example would
+ * be to enable/disable on-board USB, and if enabled give access to further options like
+ * irq settings, base address etc.
+ *
+ * Text:
+ * A single line/limited number of characters text entry box. Text can be restricted
+ * to a certain charset (digits/hex digits/all/custom). Result is also available as an
+ * int if numeric.
+ *
+ * Selection:
+ * One-of-many type of selection entry. User may choose on of a set of strings, which
+ * maps to a specific value for the variable.
+ *
+ * Routine:
+ * Selecting this calls an entry-specific routine. This can be used for saving contents etc.
+ *
+ * Custom:
+ * Display and behaviour of this entry is defined by a set of callbacks.
+ */
+
+#define MENU_SUBMENU_TYPE 0
+typedef struct menu_submenu_s
+{
+ OPTION_PREAMBLE
+
+ menu_t * submenu; /* Pointer to the submenu */
+} menu_submenu_t;
+
+#define MENU_BOOLEAN_TYPE 1
+typedef struct menu_boolean_s
+{
+ OPTION_PREAMBLE
+
+ char *variable; /* Name of the variable to getenv()/setenv() */
+ int subtype; /* Subtype (on/off, 0/1, yes/no, enable/disable), see below */
+ int mutex; /* Bit mask of options to enable/disable. Bit 0 is the option
+ immediately following this one, bit 1 is the next one etc.
+ bit 7 = 0 means to disable when this option is off,
+ bit 7 = 1 means to disable when this option is on.
+ An option is disabled when the type field's upper bit is set */
+} menu_boolean_t;
+
+/* BOOLEAN Menu flags */
+#define MENU_BOOLEAN_ONOFF 0x01
+#define MENU_BOOLEAN_01 0x02
+#define MENU_BOOLEAN_YESNO 0x03
+#define MENU_BOOLEAN_ENDIS 0x04
+#define MENU_BOOLEAN_TYPE_MASK 0x07
+
+
+#define MENU_TEXT_TYPE 2
+typedef struct menu_text_s
+{
+ OPTION_PREAMBLE
+
+ char *variable; /* Name of the variable to getenv()/setenv() */
+ int maxchars; /* Max number of characters */
+ char *charset; /* Optional charset to use */
+ int flags; /* Flags - see below */
+} menu_text_t;
+
+/* TEXT entry menu flags */
+#define MENU_TEXT_NUMERIC 0x01
+#define MENU_TEXT_HEXADECIMAL 0x02
+#define MENU_TEXT_FREE 0x03
+#define MENU_TEXT_TYPE_MASK 0x07
+
+
+#define MENU_SELECTION_TYPE 3
+typedef struct menu_select_option_s
+{
+ char *map_from; /* Map this variable contents ... */
+ char *map_to; /* ... to this menu text and vice versa */
+} menu_select_option_t;
+
+typedef struct menu_select_s
+{
+ OPTION_PREAMBLE
+
+ int num_options; /* Number of mappings */
+ menu_select_option_t **options;
+ /* Option list array */
+} menu_select_t;
+
+
+#define MENU_ROUTINE_TYPE 4
+typedef void (*menu_routine_callback)(struct menu_routine_s *);
+
+typedef struct menu_routine_s
+{
+ OPTION_PREAMBLE
+ menu_routine_callback callback;
+ /* routine to be called */
+ void *user_data; /* User data, don't care for system */
+} menu_routine_t;
+
+
+#define MENU_CUSTOM_TYPE 5
+typedef void (*menu_custom_draw)(struct menu_custom_s *);
+typedef void (*menu_custom_key)(struct menu_custom_s *, int);
+
+typedef struct menu_custom_s
+{
+ OPTION_PREAMBLE
+ menu_custom_draw drawfunc;
+ menu_custom_key keyfunc;
+ void *user_data;
+} menu_custom_t;
+
+/*
+ * The menu option superstructure
+ */
+typedef struct menu_option_s
+{
+ union
+ {
+ menu_submenu_t m_sub_menu;
+ menu_boolean_t m_boolean;
+ menu_text_t m_text;
+ menu_select_t m_select;
+ menu_routine_t m_routine;
+ };
+} menu_option_t;
+
+/* Init the menu system. Returns <0 on error */
+int menu_init(menu_t *root);
+
+/* Execute a single menu. Returns <0 on error */
+int menu_do(menu_t *menu);
+
+#endif