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