blob: f89b0e29d7e44b436fc6409ab5836b8e90de78bb [file] [log] [blame]
#include <common.h>
#include <command.h>
#include "menu.h"
#include "bootselect_menu.h"
#include "creation.h"
#include "bios_menu.h"
#include <asm/processor.h>
static form_t *root = 0;
static form_t *bootselect = 0;
#define MAIN_MENU_NAME "U-BOOT Preferences Menu"
#define BOOT_MENU_NAME "U-Boot Boot Select"
static void establish_menu_settings(void);
static int do_menu_countdown(void);
static int fromsilent = 0;
DECLARE_GLOBAL_DATA_PTR;
int show_and_do_boot_select(void)
{
unsigned long delta = TEXT_BASE - gd->relocaddr;
menu_item_relocate(delta);
bootselect = new_form(BOOT_MENU_NAME);
if (!bootselect) return 0;
make_bootselect_menu(bootselect);
menu_set_form(bootselect);
menu_form_switch_menu(bootselect, BOOT_MENU_NAME);
menu_do(false);
return return_value;
}
void show_and_do_bios_menu(void)
{
unsigned long delta = TEXT_BASE - gd->relocaddr;
menu_item_relocate(delta);
root = new_form("U-BOOT Setup Menu");
if (!root) return;
make_menus(root);
menu_set_form(root);
menu_form_switch_menu(root, MAIN_MENU_NAME);
menu_do(true);
}
static int do_menu_countdown(void)
{
int bootdelay;
int current;
char *s, c;
bootdelay = 0;
s = GETENV("menuboot_delay");
if (s) bootdelay = atoi(s);
if (bootdelay == 0)
{
if (tstc() != -1) return 1;
else return 0;
}
putc('\n');
if (fromsilent) puts(" ");
puts("Press SPACE for prefs, ENTER for boot select, ESC for prompt\n");
if (fromsilent) puts(" ");
puts("Booting... ");
current = 0;
while (current < bootdelay)
{
int i;
printf("\b\b\b%2d ", bootdelay - current);
for (i=0; i<1000; i++)
{
if (tstc())
{
c = getc();
// ESC
if ((c == 5) || (c == 113)) return -10;
// ENTER
if (c == 13) return show_and_do_boot_select();
// SPACE
if (c == 32) return 1;
}
udelay(1000);
}
current++;
}
return 0;
}
extern u32 *fb_base_phys;
extern u32 *fb_base_phys_sm502;
int do_menu( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[] )
{
int ret = 0;
// if console was silent, revert it back
if (gd->flags & GD_FLG_SILENT) {
fromsilent = 1;
gd->flags &= ~GD_FLG_SILENT;
}
// only if there is an active vga -------------------------------
#ifdef CONFIG_SAM440EP
if (fb_base_phys)
#else
if ((fb_base_phys) || (fb_base_phys_sm502))
#endif
{
if (flag==0)
{
video_set_color(0);
show_and_do_bios_menu();
puts("\n");
video_set_color(0);
return 0;
}
else
{
ret = do_menu_countdown();
if (ret == -10)
{
puts("\b\b\b break..\n");
setenv("menuboot_cmd", " ");
return 0;
}
if (ret == 1)
{
video_set_color(0);
show_and_do_bios_menu();
}
video_clear_attr();
establish_menu_settings();
puts("\n");
video_set_color(0);
return 0;
}
}
else return -1;
}
/*
* This routine establishes all settings from the menu that aren't already done
* by the standard setup.
*/
static void establish_menu_settings(void)
{
boot_establish();
}
U_BOOT_CMD(
menu, 1, 1, do_menu,
"Show preferences menu",
"Show the preferences menu that is used to boot an OS\n"
);