'imload' provides a more direct means to load from an image file. Also created a load_image routine out of the code in do_bootm() that is shared between do_bootm() and do_imload().
Signed-off-by: Kumar Gala <[EMAIL PROTECTED]> --- Note, this is against the u-boot-testing new-image branch. common/cmd_bootm.c | 180 ++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 133 insertions(+), 47 deletions(-) diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 2ddb191..0211b86 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -112,6 +112,58 @@ static boot_os_fn do_bootm_artos; ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */ +int load_image(image_header_t *hdr, ulong img_data, ulong img_len, ulong dst) +{ + const char *type_name; + uint unc_len = CFG_BOOTM_LEN; + ulong end = 0; + + type_name = image_get_type_name (image_get_type (hdr)); + + switch (image_get_comp (hdr)) { + case IH_COMP_NONE: + if (dst == (ulong)hdr) { + printf (" XIP %s ... ", type_name); + } else { + printf (" Loading %s ... ", type_name); + + memmove_wd ((void *)dst, (void *)img_data, + img_len, CHUNKSZ); + + end = dst + img_len; + } + break; + case IH_COMP_GZIP: + printf (" Uncompressing %s ... ", type_name); + if (gunzip ((void *)dst, unc_len, + (uchar *)img_data, &img_len) != 0) + return -1; + + end = dst + img_len; + break; +#ifdef CONFIG_BZIP2 + case IH_COMP_BZIP2: + printf (" Uncompressing %s ... ", type_name); + /* + * If we've got less than 4 MB of malloc() space, + * use slower decompression algorithm which requires + * at most 2300 KB of memory. + */ + if (BZ2_bzBuffToBuffDecompress ((char*)dst, + &unc_len, (char *)img_data, img_len, + CFG_MALLOC_LEN < (4096 * 1024), 0) != BZ_OK) + return -1; + + end = dst + unc_len; + break; +#endif /* CONFIG_BZIP2 */ + default: + return -2; + } + + puts ("OK\n"); + return end; +} /*******************************************************************/ /* bootm - boot application image from image in memory */ @@ -120,7 +172,6 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulong iflag; const char *type_name; - uint unc_len = CFG_BOOTM_LEN; int verify = getenv_verify(); image_header_t *hdr; @@ -160,61 +211,23 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) image_start = (ulong)hdr; image_end = image_get_image_end (hdr); load_start = image_get_load (hdr); - load_end = 0; - switch (image_get_comp (hdr)) { - case IH_COMP_NONE: - if (image_get_load (hdr) == (ulong)hdr) { - printf (" XIP %s ... ", type_name); - } else { - printf (" Loading %s ... ", type_name); - - memmove_wd ((void *)image_get_load (hdr), - (void *)os_data, os_len, CHUNKSZ); - - load_end = load_start + os_len; - puts("OK\n"); - } - break; - case IH_COMP_GZIP: - printf (" Uncompressing %s ... ", type_name); - if (gunzip ((void *)image_get_load (hdr), unc_len, - (uchar *)os_data, &os_len) != 0) { - puts ("GUNZIP ERROR - must RESET board to recover\n"); - show_boot_progress (-6); - do_reset (cmdtp, flag, argc, argv); - } + load_end = load_image(hdr, os_data, os_len, load_start); - load_end = load_start + os_len; - break; -#ifdef CONFIG_BZIP2 - case IH_COMP_BZIP2: - printf (" Uncompressing %s ... ", type_name); - /* - * If we've got less than 4 MB of malloc() space, - * use slower decompression algorithm which requires - * at most 2300 KB of memory. - */ - int i = BZ2_bzBuffToBuffDecompress ((char*)image_get_load (hdr), - &unc_len, (char *)os_data, os_len, - CFG_MALLOC_LEN < (4096 * 1024), 0); - if (i != BZ_OK) { - printf ("BUNZIP2 ERROR %d - must RESET board to recover\n", i); - show_boot_progress (-6); - do_reset (cmdtp, flag, argc, argv); - } + if (load_end == -1) { + printf("%s ERROR - must RESET board to recover\n", type_name); + show_boot_progress (-6); + do_reset (cmdtp, flag, argc, argv); + } - load_end = load_start + unc_len; - break; -#endif /* CONFIG_BZIP2 */ - default: + if (load_end == -2) { if (iflag) enable_interrupts(); printf ("Unimplemented compression type %d\n", image_get_comp (hdr)); show_boot_progress (-7); return 1; } - puts ("OK\n"); + debug (" kernel loaded at 0x%08lx, end = 0x%08lx\n", load_start, load_end); show_boot_progress (7); @@ -482,6 +495,79 @@ U_BOOT_CMD( ); #endif +/*******************************************************************/ +/* imload - load image file */ +/*******************************************************************/ +#if defined(CONFIG_CMD_IMLOAD) +int do_imload (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + ulong addr = load_addr; + int end; + int verify = getenv_verify(); + char buf[12]; + image_header_t *h; + + if (argc > 1) + addr = simple_strtoul(argv[1], NULL, 16); + + h = (image_header_t *)addr; + + if (!image_check_magic (h)) { + puts (" Bad Magic Number\n"); + return 1; + } + + if (!image_check_hcrc (h)) { + puts (" Bad Header Checksum\n"); + return 1; + } + + print_image_hdr(h); + + if (verify) { + puts (" Verifying Checksum ... "); + if (!image_check_dcrc (h)) { + printf ("Bad Data CRC\n"); + return 1; + } + puts ("OK\n"); + } + + if (argc == 3) + addr = simple_strtoul(argv[2], NULL, 16); + else + addr = image_get_load(h); + + printf("\n Loading image at %08x\n", addr); + + end = load_image(h, image_get_data(h), image_get_data_size(h), addr); + + if (end > 0) { + sprintf(buf, "%lX", addr); + setenv("fileaddr", buf); + sprintf(buf, "%lX", end - addr); + setenv("filesize", buf); + return 0; + } + + if (end == -1) + puts("\n Decompression Error\n"); + + return 1; +} + +U_BOOT_CMD( + imload, 3, 1, do_imload, + "imload - load image from application image\n", + "[addr] [load addr]\n" + " - load image from application image located at address 'addr'\n" + " or $loadaddr if 'addr' is not provided to either the load\n" + " address specified in the application image header or the\n" + " 'load addr' argument; this includes verification of the\n" + " image contents (magic number, header and payload checksums)\n" +); +#endif + /*******************************************************************/ /* imls - list all images found in flash */ -- 1.5.3.8 ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ U-Boot-Users mailing list U-Boot-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/u-boot-users