[U-Boot] [PATCH V13 01/12] Add cmd_spl command

Thomas Weber thomas.weber.linux at googlemail.com
Sun Feb 19 07:09:01 CET 2012


On 02/04/2012 11:22 AM, Stefano Babic wrote:
> From: Simon Schwarz<simonschwarzcor at googlemail.com>
>
> This adds a spl command to the u-boot.
>
> Related config:
> CONFIG_CMD_CPL
> 	activate/deactivate the command
> CONFIG_CMD_SPL_NAND_OFS
> 	Offset in NAND to use
>
> Signed-off-by: Simon Schwarz<simonschwarzcor at gmail.com>
> CC: Tom Rini<tom.rini at gmail.com>
> CC: Stefano Babic<sbabic at denx.de>
> CC: Wolfgang Denk<wd at denx.de>
> ---
>   common/Makefile         |    1 +
>   common/cmd_spl.c        |  229 +++++++++++++++++++++++++++++++++++++++++++++++
>   doc/README.commands.spl |   31 +++++++
>   include/cmd_spl.h       |   30 ++++++
>   include/image.h         |    2 +
>   5 files changed, 293 insertions(+), 0 deletions(-)
>   create mode 100644 common/cmd_spl.c
>   create mode 100644 doc/README.commands.spl
>   create mode 100644 include/cmd_spl.h
>
> diff --git a/common/Makefile b/common/Makefile
> index 2d9ae8c..910c056 100644
> --- a/common/Makefile
> +++ b/common/Makefile
> @@ -162,6 +162,7 @@ COBJS-$(CONFIG_USB_STORAGE) += usb_storage.o
>   endif
>   COBJS-$(CONFIG_CMD_XIMG) += cmd_ximg.o
>   COBJS-$(CONFIG_YAFFS2) += cmd_yaffs2.o
> +COBJS-$(CONFIG_CMD_SPL) += cmd_spl.o
>
>   # others
>   ifdef CONFIG_DDR_SPD
> diff --git a/common/cmd_spl.c b/common/cmd_spl.c
> new file mode 100644
> index 0000000..deab8e9
> --- /dev/null
> +++ b/common/cmd_spl.c
> @@ -0,0 +1,229 @@
> +/*
> + * Copyright (C) 2011
> + * Corscience GmbH&  Co. KG - Simon Schwarz<schwarz at corscience.de>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include<common.h>
> +#include<command.h>
> +#include<cmd_spl.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +/* Calls bootm with the parameters given */
> +static int call_bootm(int argc, char * const argv[], char *subcommand[])
> +{
> +	char *bootm_argv[5];
> +	char command[] = "do_bootm";
> +
> +	int i = 0;
> +	int ret = 0;
> +
> +	/* create paramter array */
> +	bootm_argv[0] = command;
> +	switch (argc) {
> +	case 3:
> +		bootm_argv[4] = argv[2]; /* fdt addr */
> +	case 2:
> +		bootm_argv[3] = argv[1]; /* initrd addr */
> +	case 1:
> +		bootm_argv[2] = argv[0]; /* kernel addr */
> +	}
> +
> +
> +	/*
> +	 * - do the work -
> +	 * exec subcommands of do_bootm to init the images
> +	 * data structure
> +	 */
> +	while (subcommand[i] != NULL) {
> +		bootm_argv[1] = subcommand[i];
> +		debug("args: %s, %s, %s, %s, %s, %d\n", bootm_argv[0],
> +			bootm_argv[1], bootm_argv[2], bootm_argv[3],
> +			bootm_argv[4], argc);
> +		ret = do_bootm(find_cmd("do_bootm"), 0, argc+2,
> +			bootm_argv);
> +		debug("Subcommand retcode: %d\n", ret);
> +		i++;
> +	}
> +
> +	if (ret) {
> +		printf("ERROR prep subcommand failed!\n");
> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
> +/* assemble the bootm paramteres for fdt creation */
> +static int spl_export_fdt(int argc, char * const argv[])
> +{
> +#ifdef CONFIG_OF_LIBFDT
> +	/* Create subcommand string */
> +	char *subcommand[] = {
> +	"start",
> +	"loados",
> +#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
> +	"ramdisk",
> +#endif
> +	"fdt",
> +	"cmdline",
> +	"bdt",
> +	"prep",
> +	NULL};
> +
> +	/* inspect paramters and execute bootm */
> +	argc--;
> +	argv++;
> +	if (call_bootm(argc, argv, subcommand))
> +		return -1;
> +
> +	printf("Argument image is now in RAM: 0x%p\n",
> +		(void *)images.ft_addr);
> +	return 0;
> +#else
> +	printf("Das U-Boot was build without fdt support - aborting\n");
> +	return -1;
> +#endif
> +}
> +
> +/* assemble the bootm patameters for atags creation */
> +static int spl_export_atags(int argc, char * const argv[])
> +{
> +#if defined(CONFIG_SETUP_MEMORY_TAGS) || \
> +	defined(CONFIG_CMDLINE_TAG) || \
> +	defined(CONFIG_INITRD_TAG) || \
> +	defined(CONFIG_SERIAL_TAG) || \
> +	defined(CONFIG_REVISION_TAG)
> +	/* Create subcommand string */
> +	char *subcommand[] = {
> +		"start",
> +		"loados",
> +#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
> +		"ramdisk",
> +#endif
> +		"cmdline",
> +		"bdt",
> +		"prep",
> +		NULL};
> +
> +	/* inspect parameters and execute bootm */
> +	argc--;
> +	argv++;
> +	if (call_bootm(argc, argv, subcommand))
> +		return -1;
> +
> +	printf("Argument image is now in RAM at: 0x%p\n",
> +		(void *)gd->bd->bi_boot_params);
> +	return 0;
> +#endif
> +	printf("Das U-Boot was build without ATAGS support - aborting\n");
> +	return -1;
> +}
> +
> +static cmd_tbl_t cmd_spl_export_sub[] = {
> +	U_BOOT_CMD_MKENT(fdt, 0, 1, (void *)SPL_EXPORT_FDT, "", ""),
> +	U_BOOT_CMD_MKENT(atags, 0, 1, (void *)SPL_EXPORT_ATAGS, "", ""),
> +};
> +
> +static int spl_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> +{
> +	const cmd_tbl_t *c;
> +	int cmd;
> +
> +	if (argc<  2) /* no subcommand */
> +		return cmd_usage(cmdtp);
> +
> +	c = find_cmd_tbl(argv[1],&cmd_spl_export_sub[0],
> +		ARRAY_SIZE(cmd_spl_export_sub));
> +	if (c) {
> +		cmd = (int)c->cmd;
> +		switch (cmd) {
> +		case SPL_EXPORT_FDT:
> +			argc--;
> +			argv++;
> +			return spl_export_fdt(argc, argv);
> +			break;
> +		case SPL_EXPORT_ATAGS:
> +			argc--;
> +			argv++;
> +			return spl_export_atags(argc, argv);
> +			break;
> +		default:
> +			/* unrecognized command */
> +			return cmd_usage(cmdtp);
> +		}
> +	} else {
> +		/* Unrecognized command */
> +		return cmd_usage(cmdtp);
> +	}
> +
> +	return 0;
> +}
> +
> +static cmd_tbl_t cmd_spl_sub[] = {
> +	U_BOOT_CMD_MKENT(export, 0, 1, (void *)SPL_EXPORT, "", ""),
> +};
> +
> +static int do_spl(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> +{
> +	const cmd_tbl_t *c;
> +	int cmd;
> +
> +	if (argc<  2) /* no subcommand */
> +		return cmd_usage(cmdtp);
> +
> +	c = find_cmd_tbl(argv[1],&cmd_spl_sub[0], ARRAY_SIZE(cmd_spl_sub));
> +	if (c) {
> +		cmd = (int)c->cmd;
> +		switch (cmd) {
> +		case SPL_EXPORT:
> +			argc--;
> +			argv++;
> +			if (spl_export(cmdtp, flag, argc, argv))
> +				printf("Subcommand failed\n");
> +			break;
> +		default:
> +			/* unrecognized command */
> +			return cmd_usage(cmdtp);
> +		}
> +	} else {
> +		/* Unrecognized command */
> +		return cmd_usage(cmdtp);
> +	}
> +	return 0;
> +}
> +
> +/*
> + * Arguments:
> + * 1: subcommand
> + * 2: image_type
> + * 3: nand_offset
> + * 4: kernel_addr
> + * 5: initrd_addr
> + * 6: fdt_adr
> + */
> +
> +U_BOOT_CMD(
> +	spl, 6 , 1, do_spl, "SPL configuration",
> +	"export<img=atags|fdt>  [kernel_addr] [initrd_addr] "
> +	"[fdt_addr if<img>  = fdt] - export a kernel parameter image\n"
> +	"\t initrd_img can be set to \"-\" if fdt_addr without initrd img is"
> +	"used");
> diff --git a/doc/README.commands.spl b/doc/README.commands.spl
> new file mode 100644
> index 0000000..818dd53
> --- /dev/null
> +++ b/doc/README.commands.spl
> @@ -0,0 +1,31 @@
> +The spl command is used to export a boot parameter image to RAM. Later
> +it may implement more functions connected to the SPL.
> +
> +SUBCOMMAND EXPORT
> +To execute the command everything has to be in place as if bootm should be
> +used. (kernel image, initrd-image, fdt-image etc.)
> +
> +export has to subcommands:
two subcommands:
> +	atags: exports the ATAGS
> +	fdt: exports the FDT
> +
> +Call is:
> +spl export<ftd|atags>  [kernel_addr] [initrd_addr] [fdt_addr if fdt]
> +
> +
> +TYPICAL CALL
> +
> +on OMAP3:
> +nandecc hw
> +nand read 0x82000000 0x280000 0x400000 	/* Read kernel image from NAND*/
> +spl export atags 			/* export ATAGS */
> +nand erase 0x680000 0x20000		/* erase - one page */
> +nand write 0x80000100 0x680000 0x20000	/* write the image - one page */
> +
> +call with FDT:
> +nandecc hw
> +nand read 0x82000000 0x280000 0x400000 	/* Read kernel image from NAND*/
> +tftpboot 0x80000100 devkit8000.dtb /* Read fdt */
> +spl export fdt 0x82000000 - 0x80000100	/* export FDT */
> +nand erase 0x680000 0x20000		/* erase - one page */
> +nand write<adress shown by spl export>  0x680000 0x20000
> diff --git a/include/cmd_spl.h b/include/cmd_spl.h
> new file mode 100644
> index 0000000..2845367
> --- /dev/null
> +++ b/include/cmd_spl.h
> @@ -0,0 +1,30 @@
> +/* Copyright (C) 2011
> + * Corscience GmbH&  Co. KG - Simon Schwarz<schwarz at corscience.de>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +#ifndef _NAND_SPL_H_
> +#define	_NAND_SPL_H_
> +
> +#define SPL_EXPORT	(0x00000001)
> +
> +#define SPL_EXPORT_FDT		(0x00000001)
> +#define SPL_EXPORT_ATAGS	(0x00000002)
> +
> +#endif /* _NAND_SPL_H_ */
> diff --git a/include/image.h b/include/image.h
> index bbf80f0..a1c6e4e 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -268,6 +268,8 @@ typedef struct bootm_headers {
>   #endif
>   } bootm_headers_t;
>
> +extern bootm_headers_t images;
> +
>   /*
>    * Some systems (for example LWMON) have very short watchdog periods;
>    * we must make sure to split long operations like memmove() or



More information about the U-Boot mailing list