xref: /rk3399_rockchip-uboot/cmd/unzip.c (revision 2e192b245ed36a63bab0ef576999a95e23f60ecd)
1*2e192b24SSimon Glass /*
2*2e192b24SSimon Glass  * (C) Copyright 2000
3*2e192b24SSimon Glass  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4*2e192b24SSimon Glass  *
5*2e192b24SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
6*2e192b24SSimon Glass  */
7*2e192b24SSimon Glass 
8*2e192b24SSimon Glass #include <common.h>
9*2e192b24SSimon Glass #include <command.h>
10*2e192b24SSimon Glass 
11*2e192b24SSimon Glass static int do_unzip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
12*2e192b24SSimon Glass {
13*2e192b24SSimon Glass 	unsigned long src, dst;
14*2e192b24SSimon Glass 	unsigned long src_len = ~0UL, dst_len = ~0UL;
15*2e192b24SSimon Glass 
16*2e192b24SSimon Glass 	switch (argc) {
17*2e192b24SSimon Glass 		case 4:
18*2e192b24SSimon Glass 			dst_len = simple_strtoul(argv[3], NULL, 16);
19*2e192b24SSimon Glass 			/* fall through */
20*2e192b24SSimon Glass 		case 3:
21*2e192b24SSimon Glass 			src = simple_strtoul(argv[1], NULL, 16);
22*2e192b24SSimon Glass 			dst = simple_strtoul(argv[2], NULL, 16);
23*2e192b24SSimon Glass 			break;
24*2e192b24SSimon Glass 		default:
25*2e192b24SSimon Glass 			return CMD_RET_USAGE;
26*2e192b24SSimon Glass 	}
27*2e192b24SSimon Glass 
28*2e192b24SSimon Glass 	if (gunzip((void *) dst, dst_len, (void *) src, &src_len) != 0)
29*2e192b24SSimon Glass 		return 1;
30*2e192b24SSimon Glass 
31*2e192b24SSimon Glass 	printf("Uncompressed size: %ld = 0x%lX\n", src_len, src_len);
32*2e192b24SSimon Glass 	setenv_hex("filesize", src_len);
33*2e192b24SSimon Glass 
34*2e192b24SSimon Glass 	return 0;
35*2e192b24SSimon Glass }
36*2e192b24SSimon Glass 
37*2e192b24SSimon Glass U_BOOT_CMD(
38*2e192b24SSimon Glass 	unzip,	4,	1,	do_unzip,
39*2e192b24SSimon Glass 	"unzip a memory region",
40*2e192b24SSimon Glass 	"srcaddr dstaddr [dstsize]"
41*2e192b24SSimon Glass );
42*2e192b24SSimon Glass 
43*2e192b24SSimon Glass static int do_gzwrite(cmd_tbl_t *cmdtp, int flag,
44*2e192b24SSimon Glass 		      int argc, char * const argv[])
45*2e192b24SSimon Glass {
46*2e192b24SSimon Glass 	block_dev_desc_t *bdev;
47*2e192b24SSimon Glass 	int ret;
48*2e192b24SSimon Glass 	unsigned char *addr;
49*2e192b24SSimon Glass 	unsigned long length;
50*2e192b24SSimon Glass 	unsigned long writebuf = 1<<20;
51*2e192b24SSimon Glass 	u64 startoffs = 0;
52*2e192b24SSimon Glass 	u64 szexpected = 0;
53*2e192b24SSimon Glass 
54*2e192b24SSimon Glass 	if (argc < 5)
55*2e192b24SSimon Glass 		return CMD_RET_USAGE;
56*2e192b24SSimon Glass 	ret = get_device(argv[1], argv[2], &bdev);
57*2e192b24SSimon Glass 	if (ret < 0)
58*2e192b24SSimon Glass 		return CMD_RET_FAILURE;
59*2e192b24SSimon Glass 
60*2e192b24SSimon Glass 	addr = (unsigned char *)simple_strtoul(argv[3], NULL, 16);
61*2e192b24SSimon Glass 	length = simple_strtoul(argv[4], NULL, 16);
62*2e192b24SSimon Glass 
63*2e192b24SSimon Glass 	if (5 < argc) {
64*2e192b24SSimon Glass 		writebuf = simple_strtoul(argv[5], NULL, 16);
65*2e192b24SSimon Glass 		if (6 < argc) {
66*2e192b24SSimon Glass 			startoffs = simple_strtoull(argv[6], NULL, 16);
67*2e192b24SSimon Glass 			if (7 < argc)
68*2e192b24SSimon Glass 				szexpected = simple_strtoull(argv[7],
69*2e192b24SSimon Glass 							     NULL, 16);
70*2e192b24SSimon Glass 		}
71*2e192b24SSimon Glass 	}
72*2e192b24SSimon Glass 
73*2e192b24SSimon Glass 	ret = gzwrite(addr, length, bdev, writebuf, startoffs, szexpected);
74*2e192b24SSimon Glass 
75*2e192b24SSimon Glass 	return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
76*2e192b24SSimon Glass }
77*2e192b24SSimon Glass 
78*2e192b24SSimon Glass U_BOOT_CMD(
79*2e192b24SSimon Glass 	gzwrite, 8, 0, do_gzwrite,
80*2e192b24SSimon Glass 	"unzip and write memory to block device",
81*2e192b24SSimon Glass 	"<interface> <dev> <addr> length [wbuf=1M [offs=0 [outsize=0]]]\n"
82*2e192b24SSimon Glass 	"\twbuf is the size in bytes (hex) of write buffer\n"
83*2e192b24SSimon Glass 	"\t\tand should be padded to erase size for SSDs\n"
84*2e192b24SSimon Glass 	"\toffs is the output start offset in bytes (hex)\n"
85*2e192b24SSimon Glass 	"\toutsize is the size of the expected output (hex bytes)\n"
86*2e192b24SSimon Glass 	"\t\tand is required for files with uncompressed lengths\n"
87*2e192b24SSimon Glass 	"\t\t4 GiB or larger\n"
88*2e192b24SSimon Glass );
89