xref: /rk3399_rockchip-uboot/cmd/unzip.c (revision 018f530323b2cc41be05be5b12375d3648f06554)
12e192b24SSimon Glass /*
22e192b24SSimon Glass  * (C) Copyright 2000
32e192b24SSimon Glass  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
42e192b24SSimon Glass  *
52e192b24SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
62e192b24SSimon Glass  */
72e192b24SSimon Glass 
82e192b24SSimon Glass #include <common.h>
92e192b24SSimon Glass #include <command.h>
102e192b24SSimon Glass 
do_unzip(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])112e192b24SSimon Glass static int do_unzip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
122e192b24SSimon Glass {
132e192b24SSimon Glass 	unsigned long src, dst;
142e192b24SSimon Glass 	unsigned long src_len = ~0UL, dst_len = ~0UL;
152e192b24SSimon Glass 
162e192b24SSimon Glass 	switch (argc) {
172e192b24SSimon Glass 		case 4:
182e192b24SSimon Glass 			dst_len = simple_strtoul(argv[3], NULL, 16);
192e192b24SSimon Glass 			/* fall through */
202e192b24SSimon Glass 		case 3:
212e192b24SSimon Glass 			src = simple_strtoul(argv[1], NULL, 16);
222e192b24SSimon Glass 			dst = simple_strtoul(argv[2], NULL, 16);
232e192b24SSimon Glass 			break;
242e192b24SSimon Glass 		default:
252e192b24SSimon Glass 			return CMD_RET_USAGE;
262e192b24SSimon Glass 	}
272e192b24SSimon Glass 
282e192b24SSimon Glass 	if (gunzip((void *) dst, dst_len, (void *) src, &src_len) != 0)
292e192b24SSimon Glass 		return 1;
302e192b24SSimon Glass 
312e192b24SSimon Glass 	printf("Uncompressed size: %ld = 0x%lX\n", src_len, src_len);
32*018f5303SSimon Glass 	env_set_hex("filesize", src_len);
332e192b24SSimon Glass 
342e192b24SSimon Glass 	return 0;
352e192b24SSimon Glass }
362e192b24SSimon Glass 
372e192b24SSimon Glass U_BOOT_CMD(
382e192b24SSimon Glass 	unzip,	4,	1,	do_unzip,
392e192b24SSimon Glass 	"unzip a memory region",
402e192b24SSimon Glass 	"srcaddr dstaddr [dstsize]"
412e192b24SSimon Glass );
422e192b24SSimon Glass 
do_gzwrite(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])432e192b24SSimon Glass static int do_gzwrite(cmd_tbl_t *cmdtp, int flag,
442e192b24SSimon Glass 		      int argc, char * const argv[])
452e192b24SSimon Glass {
464101f687SSimon Glass 	struct blk_desc *bdev;
472e192b24SSimon Glass 	int ret;
482e192b24SSimon Glass 	unsigned char *addr;
492e192b24SSimon Glass 	unsigned long length;
502e192b24SSimon Glass 	unsigned long writebuf = 1<<20;
512e192b24SSimon Glass 	u64 startoffs = 0;
522e192b24SSimon Glass 	u64 szexpected = 0;
532e192b24SSimon Glass 
542e192b24SSimon Glass 	if (argc < 5)
552e192b24SSimon Glass 		return CMD_RET_USAGE;
56ebac37cfSSimon Glass 	ret = blk_get_device_by_str(argv[1], argv[2], &bdev);
572e192b24SSimon Glass 	if (ret < 0)
582e192b24SSimon Glass 		return CMD_RET_FAILURE;
592e192b24SSimon Glass 
602e192b24SSimon Glass 	addr = (unsigned char *)simple_strtoul(argv[3], NULL, 16);
612e192b24SSimon Glass 	length = simple_strtoul(argv[4], NULL, 16);
622e192b24SSimon Glass 
632e192b24SSimon Glass 	if (5 < argc) {
642e192b24SSimon Glass 		writebuf = simple_strtoul(argv[5], NULL, 16);
652e192b24SSimon Glass 		if (6 < argc) {
662e192b24SSimon Glass 			startoffs = simple_strtoull(argv[6], NULL, 16);
672e192b24SSimon Glass 			if (7 < argc)
682e192b24SSimon Glass 				szexpected = simple_strtoull(argv[7],
692e192b24SSimon Glass 							     NULL, 16);
702e192b24SSimon Glass 		}
712e192b24SSimon Glass 	}
722e192b24SSimon Glass 
732e192b24SSimon Glass 	ret = gzwrite(addr, length, bdev, writebuf, startoffs, szexpected);
742e192b24SSimon Glass 
752e192b24SSimon Glass 	return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
762e192b24SSimon Glass }
772e192b24SSimon Glass 
782e192b24SSimon Glass U_BOOT_CMD(
792e192b24SSimon Glass 	gzwrite, 8, 0, do_gzwrite,
802e192b24SSimon Glass 	"unzip and write memory to block device",
812e192b24SSimon Glass 	"<interface> <dev> <addr> length [wbuf=1M [offs=0 [outsize=0]]]\n"
822e192b24SSimon Glass 	"\twbuf is the size in bytes (hex) of write buffer\n"
832e192b24SSimon Glass 	"\t\tand should be padded to erase size for SSDs\n"
842e192b24SSimon Glass 	"\toffs is the output start offset in bytes (hex)\n"
852e192b24SSimon Glass 	"\toutsize is the size of the expected output (hex bytes)\n"
862e192b24SSimon Glass 	"\t\tand is required for files with uncompressed lengths\n"
872e192b24SSimon Glass 	"\t\t4 GiB or larger\n"
882e192b24SSimon Glass );
89