From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from metis.ext.pengutronix.de ([2001:6f8:1178:4:290:27ff:fe1d:cc33]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TzQTI-00043Z-Qf for barebox@lists.infradead.org; Sun, 27 Jan 2013 11:32:26 +0000 Date: Sun, 27 Jan 2013 12:32:23 +0100 From: Sascha Hauer Message-ID: <20130127113223.GA1906@pengutronix.de> References: <20130124113051.GU26329@game.jcrosoft.org> <1359027196-20458-1-git-send-email-plagnioj@jcrosoft.com> <1359027196-20458-2-git-send-email-plagnioj@jcrosoft.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1359027196-20458-2-git-send-email-plagnioj@jcrosoft.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: barebox-bounces@lists.infradead.org Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: Re: [PATCH 2/2] at91: bootstrap: add menu support To: Jean-Christophe PLAGNIOL-VILLARD Cc: barebox@lists.infradead.org On Thu, Jan 24, 2013 at 12:33:16PM +0100, Jean-Christophe PLAGNIOL-VILLARD wrote: > This will allow to change the boot mode > > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD I applied 1/2. Can you please ping me about this one after the next release? Thanks Sascha > --- > arch/arm/mach-at91/bootstrap.c | 215 +++++++++++++++++++++++++++++++++++----- > 1 file changed, 190 insertions(+), 25 deletions(-) > > diff --git a/arch/arm/mach-at91/bootstrap.c b/arch/arm/mach-at91/bootstrap.c > index 5ee43ad..4149304 100644 > --- a/arch/arm/mach-at91/bootstrap.c > +++ b/arch/arm/mach-at91/bootstrap.c > @@ -10,6 +10,7 @@ > #include > #include > #include > +#include > > #if defined(CONFIG_MCI_ATMEL) > #define is_mmc() 1 > @@ -35,46 +36,210 @@ > #define is_dataflash() 0 > #endif > > -static void boot_seq(bool is_barebox) > +#if defined(CONFIG_MENU) && !defined(CONFIG_NONE) > +#define is_menu() 1 > +#else > +#define is_menu() 0 > +#endif > + > +static char* is_barebox_to_str(bool is_barebox) > +{ > + return is_barebox ? "barebox" : "unknown"; > +} > + > +static void at91bootstrap_boot_m25p80(bool is_barebox) > +{ > + char *name = is_barebox_to_str(is_barebox); > + int (*func)(void) = NULL; > + > + func = bootstrap_board_read_m25p80(); > + printf("Boot %s from m25p80\n", name); > + bootstrap_boot(func, is_barebox); > + bootstrap_err("... failed\n"); > + free(func); > +} > + > +static void at91bootstrap_boot_dataflash(bool is_barebox) > +{ > + char *name = is_barebox_to_str(is_barebox); > + int (*func)(void) = NULL; > + > + printf("Boot %s from dataflash\n", name); > + func = bootstrap_board_read_dataflash(); > + bootstrap_boot(func, is_barebox); > + bootstrap_err("... failed\n"); > + free(func); > +} > + > +static void at91bootstrap_boot_nand(bool is_barebox) > +{ > + char *name = is_barebox_to_str(is_barebox); > + int (*func)(void) = NULL; > + > + printf("Boot %s from nand\n", name); > + func = bootstrap_read_devfs("nand0", true, SZ_128K, SZ_256K, SZ_1M); > + bootstrap_boot(func, is_barebox); > + bootstrap_err("... failed\n"); > + free(func); > +} > + > +static void at91bootstrap_boot_mmc(void) > { > - char *name = is_barebox ? "barebox" : "unknown"; > int (*func)(void) = NULL; > > + printf("Boot from mmc\n"); > + func = bootstrap_read_disk("disk0.0", NULL); > + bootstrap_boot(func, false); > + bootstrap_err("... failed\n"); > + free(func); > +} > + > +static void boot_nand_barebox_action(struct menu *m, struct menu_entry *me) > +{ > + at91bootstrap_boot_nand(true); > + > + getc(); > +} > + > +static void boot_nand_action(struct menu *m, struct menu_entry *me) > +{ > + at91bootstrap_boot_nand(false); > + > + getc(); > +} > + > +static void boot_m25p80_barebox_action(struct menu *m, struct menu_entry *me) > +{ > + at91bootstrap_boot_nand(true); > + > + getc(); > +} > + > +static void boot_m25p80_action(struct menu *m, struct menu_entry *me) > +{ > + at91bootstrap_boot_nand(false); > + > + getc(); > +} > + > +static void boot_dataflash_barebox_action(struct menu *m, struct menu_entry *me) > +{ > + at91bootstrap_boot_dataflash(true); > + > + getc(); > +} > + > +static void boot_dataflash_action(struct menu *m, struct menu_entry *me) > +{ > + at91bootstrap_boot_dataflash(false); > + > + getc(); > +} > + > +static void boot_mmc_disk_action(struct menu *m, struct menu_entry *me) > +{ > + at91bootstrap_boot_mmc(); > + > + getc(); > +} > + > +static void boot_reset_action(struct menu *m, struct menu_entry *me) > +{ > + reset_cpu(0); > +} > + > +void at91_bootstrap_menu(void) > +{ > + struct menu *m; > + struct menu_entry *me; > + > + m = menu_alloc(); > + m->display = m->name = "boot"; > + > + menu_add(m); > + > + if (is_mmc()) { > + me = menu_entry_alloc(); > + me->action = boot_mmc_disk_action; > + me->type = MENU_ENTRY_NORMAL; > + me->display = "mmc"; > + menu_add_entry(m, me); > + } > + > if (is_m25p80()) { > - func = bootstrap_board_read_m25p80(); > - printf("Boot %s from m25p80\n", name); > - bootstrap_boot(func, is_barebox); > - bootstrap_err("... failed\n"); > - free(func); > + me = menu_entry_alloc(); > + me->action = boot_m25p80_barebox_action; > + me->type = MENU_ENTRY_NORMAL; > + me->display = "m25p80 (barebox)"; > + menu_add_entry(m, me); > + > + me = menu_entry_alloc(); > + me->action = boot_m25p80_action; > + me->type = MENU_ENTRY_NORMAL; > + me->display = "m25p80"; > + menu_add_entry(m, me); > } > + > if (is_dataflash()) { > - printf("Boot %s from dataflash\n", name); > - func = bootstrap_board_read_dataflash(); > - bootstrap_boot(func, is_barebox); > - bootstrap_err("... failed\n"); > - free(func); > + me = menu_entry_alloc(); > + me->action = boot_dataflash_barebox_action; > + me->type = MENU_ENTRY_NORMAL; > + me->display = "dataflash (barebox)"; > + menu_add_entry(m, me); > + > + me = menu_entry_alloc(); > + me->action = boot_dataflash_action; > + me->type = MENU_ENTRY_NORMAL; > + me->display = "dataflash"; > + menu_add_entry(m, me); > } > + > if (is_nand()) { > - printf("Boot %s from nand\n", name); > - func = bootstrap_read_devfs("nand0", true, SZ_128K, SZ_256K, SZ_1M); > - bootstrap_boot(func, is_barebox); > - bootstrap_err("... failed\n"); > - free(func); > + me = menu_entry_alloc(); > + me->action = boot_nand_barebox_action; > + me->type = MENU_ENTRY_NORMAL; > + me->display = "nand (barebox)"; > + menu_add_entry(m, me); > + > + me = menu_entry_alloc(); > + me->action = boot_nand_action; > + me->type = MENU_ENTRY_NORMAL; > + me->display = "nand"; > + menu_add_entry(m, me); > } > + > + me = menu_entry_alloc(); > + me->action = boot_reset_action; > + me->type = MENU_ENTRY_NORMAL; > + me->display = "reset"; > + menu_add_entry(m, me); > + > + menu_show(m); > } > > -static int at91_bootstrap(void) > +static void boot_seq(bool is_barebox) > { > - int (*func)(void) = NULL; > + if (is_m25p80()) > + at91bootstrap_boot_m25p80(is_barebox); > > - if (is_mmc()) { > - printf("Boot from mmc\n"); > - func = bootstrap_read_disk("disk0.0", NULL); > - bootstrap_boot(func, false); > - bootstrap_err("... failed\n"); > - free(func); > + if (is_dataflash()) > + at91bootstrap_boot_dataflash(is_barebox); > + > + if (is_nand()) > + at91bootstrap_boot_nand(is_barebox); > +} > + > +static int at91_bootstrap(void) > +{ > + if (is_menu()) { > + printf("press 'm' to start the menu\n"); > + if (tstc() && getc() == 'm') > + at91_bootstrap_menu(); > } > > + if (is_mmc()) > + at91bootstrap_boot_mmc(); > + > /* First only bootstrap_boot a barebox */ > boot_seq(true); > /* Second bootstrap_boot any */ > -- > 1.7.10.4 > > > _______________________________________________ > barebox mailing list > barebox@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/barebox > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox