Skip to content
Snippets Groups Projects
Commit 5912d365 authored by Wolfgang Wegner's avatar Wolfgang Wegner Committed by Wolfgang Denk
Browse files

add ability to handle compressed images to imxtract


imxtract currently can not handle compressed images. This patch adds
handling for bzip2 and zip compression. In both cases, a destination
address has to be specified for extraction.

Signed-off-by: default avatarWolfgang Wegner <w.wegner@astro-kom.de>
parent a16e9a5b
No related branches found
No related tags found
No related merge requests found
...@@ -31,8 +31,17 @@ ...@@ -31,8 +31,17 @@
#include <common.h> #include <common.h>
#include <command.h> #include <command.h>
#include <image.h> #include <image.h>
#include <watchdog.h>
#if defined(CONFIG_BZIP2)
#include <bzlib.h>
#endif
#include <asm/byteorder.h> #include <asm/byteorder.h>
#ifndef CONFIG_SYS_XIMG_LEN
/* use 8MByte as default max gunzip size */
#define CONFIG_SYS_XIMG_LEN 0x800000
#endif
int int
do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{ {
...@@ -50,6 +59,8 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ...@@ -50,6 +59,8 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
const void *fit_data; const void *fit_data;
size_t fit_len; size_t fit_len;
#endif #endif
uint unc_len = CONFIG_SYS_XIMG_LEN;
uint8_t comp;
verify = getenv_yesno ("verify"); verify = getenv_yesno ("verify");
...@@ -92,8 +103,10 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ...@@ -92,8 +103,10 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
return 1; return 1;
} }
if (image_get_comp (hdr) != IH_COMP_NONE) { comp = image_get_comp (hdr);
printf("Wrong Compression Type for %s command\n", if ((comp != IH_COMP_NONE) && (argc < 4)) {
printf("Must specify load address for %s command "
"with compressed image\n",
cmdtp->name); cmdtp->name);
return 1; return 1;
} }
...@@ -138,9 +151,11 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ...@@ -138,9 +151,11 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
return 1; return 1;
} }
if (fit_image_check_comp (fit_hdr, noffset, IH_COMP_NONE)) { if (fit_image_check_comp (fit_hdr, noffset, IH_COMP_NONE)
printf("Wrong Compression Type for %s command\n", && (argc < 4)) {
cmdtp->name); printf("Must specify load address for %s command "
"with compressed image\n",
cmdtp->name);
return 1; return 1;
} }
...@@ -153,11 +168,18 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ...@@ -153,11 +168,18 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
} }
/* get subimage data address and length */ /* get subimage data address and length */
if (fit_image_get_data (fit_hdr, noffset, &fit_data, &fit_len)) { if (fit_image_get_data (fit_hdr, noffset,
&fit_data, &fit_len)) {
puts ("Could not find script subimage data\n"); puts ("Could not find script subimage data\n");
return 1; return 1;
} }
if (fit_image_get_comp (fit_hdr, noffset, &comp)) {
puts ("Could not find script subimage "
"compression type\n");
return 1;
}
data = (ulong)fit_data; data = (ulong)fit_data;
len = (ulong)fit_len; len = (ulong)fit_len;
break; break;
...@@ -168,7 +190,63 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ...@@ -168,7 +190,63 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
} }
if (argc > 3) { if (argc > 3) {
memcpy((char *) dest, (char *) data, len); switch (comp) {
case IH_COMP_NONE:
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
{
size_t l = len;
size_t tail;
void *to = (void *) dest;
void *from = (void *)data;
printf (" Loading part %d ... ", part);
while (l > 0) {
tail = (l > CHUNKSZ) ? CHUNKSZ : l;
WATCHDOG_RESET();
memmove (to, from, tail);
to += tail;
from += tail;
l -= tail;
}
}
#else /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
printf (" Loading part %d ... ", part);
memmove ((char *) dest, (char *)data, len);
#endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
break;
case IH_COMP_GZIP:
printf (" Uncompressing part %d ... ", part);
if (gunzip ((void *) dest, unc_len,
(uchar *) data, &len) != 0) {
puts ("GUNZIP ERROR - image not loaded\n");
return 1;
}
break;
#if defined(CONFIG_BZIP2)
case IH_COMP_BZIP2:
printf (" Uncompressing part %d ... ", part);
/*
* If we've got less than 4 MB of malloc() space,
* use slower decompression algorithm which requires
* at most 2300 KB of memory.
*/
i = BZ2_bzBuffToBuffDecompress
((char*)ntohl(hdr->ih_load),
&unc_len, (char *)data, len,
CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
if (i != BZ_OK) {
printf ("BUNZIP2 ERROR %d - "
"image not loaded\n", i);
return 1;
}
break;
#endif /* CONFIG_BZIP2 */
default:
printf ("Unimplemented compression type %d\n", comp);
return 1;
}
puts ("OK\n");
} }
sprintf(pbuf, "%8lx", data); sprintf(pbuf, "%8lx", data);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment