92 lines
2.4 KiB
C
Executable File
92 lines
2.4 KiB
C
Executable File
/*
|
|
* Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
|
|
*/
|
|
|
|
/*
|
|
* Command for compress.
|
|
*/
|
|
|
|
#include <common.h>
|
|
|
|
#define HEAD_SIZE 0X10
|
|
#define COMPRESSED_SIZE_OFFSET 0X0
|
|
|
|
#define HEAD_MAGIC_NUM0 0X70697A67/*'g''z''i''p'*/
|
|
#define HEAD_MAGIC_NUM0_OFFSET 0X8
|
|
#define HEAD_MAGIC_NUM1 0X64616568/*'h''e''a''d'*/
|
|
#define HEAD_MAGIC_NUM1_OFFSET 0XC
|
|
extern unsigned int hw_dec_type;
|
|
extern void hw_dec_init(void);
|
|
extern void hw_dec_uinit(void);
|
|
|
|
#if ((defined CONFIG_TARGET_GK7205V200) || (defined CONFIG_TARGET_GK7205V300) ||\
|
|
(defined CONFIG_TARGET_GK7202V300) || (defined CONFIG_TARGET_GK7605V100))
|
|
extern int hw_dec_decompress(unsigned char *dst, int *dstlen,
|
|
unsigned char *src, int srclen,
|
|
void *unused);
|
|
#endif
|
|
|
|
static int do_ugzip(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
|
{
|
|
uintptr_t src, dst;
|
|
int size_comparessed, size_uncomparessed;
|
|
unsigned int magic_num0, magic_num1;
|
|
int ret = 0;
|
|
/* need two arguments */
|
|
if (argc != 3)
|
|
goto usage;
|
|
|
|
src = simple_strtoul(argv[1], NULL, 16);
|
|
dst = simple_strtoul(argv[2], NULL, 16);
|
|
|
|
if (src & 0XF) {
|
|
printf("ERR:\n src[0X%08lx] is not 16Byte-aligned!\n", src);
|
|
return 1;
|
|
}
|
|
if (dst & 0XF) {
|
|
printf("ERR:\n dst[0X%08lx] is not 16Byte-aligned!\n", dst);
|
|
return 1;
|
|
}
|
|
|
|
magic_num0 = *(unsigned int *)(src + HEAD_MAGIC_NUM0_OFFSET);
|
|
magic_num1 = *(unsigned int *)(src + HEAD_MAGIC_NUM1_OFFSET);
|
|
if ((magic_num0 != HEAD_MAGIC_NUM0) || (magic_num1 != HEAD_MAGIC_NUM1)) {
|
|
printf("ERR:\n The magic numbers are not correct!\n"\
|
|
" Please check the source data!\n");
|
|
return 1;
|
|
}
|
|
size_comparessed = *(int *)(src + COMPRESSED_SIZE_OFFSET);
|
|
size_uncomparessed = *(int *)(src + UNCOMPRESSED_SIZE_OFFSET);
|
|
/*use direct address mode*/
|
|
hw_dec_type = 0;
|
|
/*init hw decompress IP*/
|
|
hw_dec_init();
|
|
/*start decompress*/
|
|
#if ((defined CONFIG_TARGET_GK7205V200) || (defined CONFIG_TARGET_GK7205V300) || \
|
|
(defined CONFIG_TARGET_GK7202V300) || (defined CONFIG_TARGET_GK7605V100))
|
|
ret = hw_dec_decompress((unsigned char *)dst, &size_uncomparessed, \
|
|
(unsigned char *)(src + HEAD_SIZE), \
|
|
size_comparessed, NULL);
|
|
#endif
|
|
if (ret)
|
|
printf("ERR:\n decompress fail!\n");
|
|
else
|
|
printf("decompress ok!\n");
|
|
/*uinit hw decompress IP*/
|
|
hw_dec_uinit();
|
|
|
|
return 1;
|
|
|
|
usage:
|
|
cmd_usage(cmdtp);
|
|
return 1;
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
ugzip, 3, 1, do_ugzip,
|
|
"Compress gzipfile with hardware IP",
|
|
"ugzip <src> <dst>\n"
|
|
"src and dst must be 16Byte-aligned"
|
|
);
|
|
|