From 3af26ab6c59e9527353f7759eaff21923bf5726d Mon Sep 17 00:00:00 2001 From: Peter Nessrup Date: Thu, 16 Sep 2010 10:10:40 +0200 Subject: Added TOC commands TOC commands added under common to be able to print the TOC and sub TOC and to be able to load whatever a TOC entry points to into RAM at the address specified in the TOC entry loadaddr field New file: cmd_toc.c CONFIG_TOC_PARTITION needs to be set for it to be available ST-Ericsson ID: ER256835 Change-Id: I826337e2608076fad74b1a7125d7e93b5ad66e43 Signed-off-by: Peter Nessrup Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/5112 Reviewed-by: Ulf HANSSON Reviewed-by: Michael BRANDT --- common/cmd_toc.c | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 common/cmd_toc.c (limited to 'common/cmd_toc.c') diff --git a/common/cmd_toc.c b/common/cmd_toc.c new file mode 100644 index 000000000..e7312df63 --- /dev/null +++ b/common/cmd_toc.c @@ -0,0 +1,116 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * Author: Peter Nessrup for + * ST-Ericsson. + * License terms: GNU General Public License (GPL), version 2. + */ + +/* + * Support for printing the TOC and sub TOC structures + * + * Support also for reading data pointed to by a TOC entry, into RAM, + * at the destintion address specified in the TOC entry + */ +#include +#include + +#if !defined(CONFIG_TOC_PARTITION) +#error TOC partition support must be selected +#endif + +int do_toc_print (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + block_dev_desc_t *dev_desc; + char *ep; + + if (argc < 2) { + cmd_usage(cmdtp); + return 1; + } + + dev_desc = get_dev(argv[1], (int) simple_strtoul(argv[2], &ep, 16)); + + if (dev_desc == NULL) { + printf("Invalid device\n"); + return 1; + } + + if (dev_desc->part_type == PART_TYPE_TOC) + print_part(dev_desc); + else + printf("Device is not TOC partitioned!\n"); + + return 0; +} + + +U_BOOT_CMD( + tocprint, 3, 1, do_toc_print, + "prints the TOC and sub TOC contents", + " \n" + " - print TOC and sub TOC from 'dev' on 'interface'" +); + + +int do_toc_entry_load(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + u32 offset; + u32 size; + u32 addr; + char loadaddr[16]; + block_dev_desc_t *dev_desc; + int blks; + char *ep; + + if (argc < 3) { + cmd_usage(cmdtp); + return 1; + } + + dev_desc = get_dev(argv[1], (int) simple_strtoul(argv[2], &ep, 16)); + + if (dev_desc == NULL) { + printf("Invalid device\n"); + return 1; + } + + if (dev_desc->part_type != PART_TYPE_TOC) { + printf("Device is not TOC partitioned!\n"); + return 1; + } + + if (get_entry_info_toc(dev_desc, + argv[3], + &offset, + &size, + &addr) == 0) { + + blks = (size / dev_desc->blksz) + + (size % dev_desc->blksz ? 1 : 0); + + if (dev_desc->block_read(dev_desc->dev, + offset / dev_desc->blksz, + blks, + (ulong *) addr) != blks) { + printf("Unable to read from block device\n"); + return 1; + } + + sprintf(loadaddr, "0x%x", addr); + setenv("loadaddr", loadaddr); + + return 0; + } else + printf("Failed to get TOC entry!\n"); + + return 1; +} + +U_BOOT_CMD( + tocload, 4, 0, do_toc_entry_load, + "load from the TOC entry to memory", + " \n" + " - load the data pointed to by the to the RAM address\n" + " specified in the TOC entry loadaddr field, from on\n" + " " +); -- cgit v1.2.3