mirror of
https://github.com/Stichting-MINIX-Research-Foundation/u-boot.git
synced 2025-09-09 20:18:54 -04:00
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: Wolfgang Wegner <w.wegner@astro-kom.de>
This commit is contained in:
parent
a16e9a5b5f
commit
5912d36507
@ -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[])
|
|||||||
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[])
|
|||||||
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[])
|
|||||||
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[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user