[U-Boot] [PATCH 2/7] Add savebp command
Simon Schwarz
simonschwarzcor at googlemail.com
Thu Aug 11 16:44:51 CEST 2011
This adds a savebp command to the u-boot.
Related config:
CONFIG_CMD_SAVEBP
activate/deactivate the command
CONFIG_CMD_SAVEBP_NAND_OFS
Offset in NAND to use
CONFIG_SYS_NAND_SPL_KERNEL_OFFS
Offset in NAND of direct boot kernel image to use in SPL
CONFIG_SYS_SPL_ARGS_ADDR
Address where the kernel boot arguments are expected - this is normally
RAM-begin + 0x100
Signed-off-by: Simon Schwarz <simonschwarzcor at gmail.com>
---
common/Makefile | 1 +
common/cmd_savebp.c | 123 ++++++++++++++++++++++++++++++++++++++++++
include/configs/devkit8000.h | 6 ++
3 files changed, 130 insertions(+), 0 deletions(-)
create mode 100644 common/cmd_savebp.c
diff --git a/common/Makefile b/common/Makefile
index 124a427..0b42968 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -158,6 +158,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_SAVEBP) += cmd_savebp.o
# others
COBJS-$(CONFIG_DDR_SPD) += ddr_spd.o
diff --git a/common/cmd_savebp.c b/common/cmd_savebp.c
new file mode 100644
index 0000000..cc988fd
--- /dev/null
+++ b/common/cmd_savebp.c
@@ -0,0 +1,123 @@
+/* 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>
+
+#define TYPE_FDT 0
+#define TYPE_ATAGS 1
+
+static inline int str2off(const char *p, loff_t *num)
+{
+ char *endptr;
+
+ *num = simple_strtoull(p, &endptr, 16);
+ return *p != '\0' && *endptr == '\0';
+}
+
+int do_savebp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ loff_t offset;
+ char *bootm_argsv[] = {"do_bootm", "xxxxxxx"};
+ int img_type = TYPE_ATAGS;
+ int ret = 0;
+
+ /* - Validate args - */
+ switch (argc) {
+ case 3: /*2. arg offset */
+ if (!str2off(argv[2], &offset)) {
+ printf("'%s' is not a number\n", argv[2]);
+ return cmd_usage(cmdtp);
+ }
+ case 2: /* 1. arg atags or fdt */
+ if (!(strcmp(argv[1], "fdt") || strcmp(argv[1], "atags")))
+ return cmd_usage(cmdtp);
+ if (!strcmp(argv[1], "fdt"))
+ img_type = TYPE_FDT;
+ /* using standard offset */
+ offset = (loff_t)CONFIG_CMD_SAVEBP_NAND_OFS;
+ printf("using standard destination at: 0x%x\n",
+ (uint32_t)offset);
+ break;
+ default:
+ return cmd_usage(cmdtp);
+ }
+
+ /* - do the work - */
+ /* exec bootm_start as subcommand of do_bootm to init the images
+ * data structure */
+ debug("exec bootm subcommand start\n");
+ bootm_argsv[1] = "start";
+ ret = do_bootm(find_cmd("do_bootm"), 0, 2, bootm_argsv);
+ debug("Subcommand start bootm retcode: %d\n", ret);
+
+ debug("exec bootm subcommand loados\n");
+ bootm_argsv[1] = "loados";
+ ret = do_bootm(find_cmd("do_bootm"), 0, 2, bootm_argsv);
+ debug("Subcommand loados bootm retcode: %d\n", ret);
+
+#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
+ debug("exec bootm subcommand ramdisk\n");
+ bootm_argsv[1] = "ramdisk";
+ ret = do_bootm(find_cmd("do_bootm"), 0, 2, bootm_argsv);
+ debug("Subcommand ramdisk bootm retcode: %d\n", ret);
+#endif
+
+#ifdef CONFIG_OF_LIBFDT
+ if (img_type == TYPE_FDT) {
+ debug("exec bootm subcommand fdt\n");
+ bootm_argsv[1] = "fdt";
+ ret = do_bootm(find_cmd("do_bootm"), 0, 2, bootm_argsv);
+ debug("Subcommand fdt bootm retcode: %d\n", ret);
+ }
+#endif
+
+ debug("exec bootm subcommand cmdline\n");
+ bootm_argsv[1] = "cmdline";
+ ret = do_bootm(find_cmd("do_bootm"), 0, 2, bootm_argsv);
+ debug("Subcommand cmdline bootm retcode: %d\n", ret);
+
+ debug("exec bootm bdt cmdline\n");
+ bootm_argsv[1] = "bdt";
+ ret = do_bootm(find_cmd("do_bootm"), 0, 2, bootm_argsv);
+ debug("Subcommand bdt bootm retcode: %d\n", ret);
+
+ debug("exec bootm subcommand prep\n");
+ bootm_argsv[1] = "prep";
+ ret = do_bootm(find_cmd("do_bootm"), 0, 2, bootm_argsv);
+ debug("Subcommand prep bootm retcode: %d\n", ret);
+ if (ret) {
+ printf("ERROR prep subcommand failed!\n");
+ return -1;
+ }
+ /* call arch specific handlers */
+ if (img_type == TYPE_FDT)
+ do_savebp_fdt(offset);
+ else
+ do_savebp_atags(offset);
+
+ return 0;
+}
+
+U_BOOT_CMD(
+ savebp, 3 , 1, do_savebp, "save boot params to NAND flash",
+ "[ftd|atags] [nand_offset] saves the parameter image to NAND. Kernel image has to be in RAM!");
diff --git a/include/configs/devkit8000.h b/include/configs/devkit8000.h
index 9cbdb5d..80b441a 100644
--- a/include/configs/devkit8000.h
+++ b/include/configs/devkit8000.h
@@ -353,4 +353,10 @@
#define CONFIG_SYS_NAND_U_BOOT_OFFS 0x80000
#define CONFIG_SYS_NAND_U_BOOT_SIZE 0x200000
+/* SPL OS boot options */
+#define CONFIG_CMD_SAVEBP
+#define CONFIG_CMD_SAVEBP_NAND_OFS (CONFIG_SYS_NAND_SPL_KERNEL_OFFS+\
+ 0x400000)
+#define CONFIG_SYS_NAND_SPL_KERNEL_OFFS 0x280000
+#define CONFIG_SYS_SPL_ARGS_ADDR (PHYS_SDRAM_1 + 0x100)
#endif /* __CONFIG_H */
--
1.7.4.1
More information about the U-Boot
mailing list