xref: /rk3399_rockchip-uboot/cmd/android.c (revision b27ae02dfdf0e26d23901e9b898629d6ec470a60)
1 /*
2  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <android_image.h>
9 #include <blk.h>
10 #include <boot_rkimg.h>
11 #include <command.h>
12 #include <malloc.h>
13 
14 static int do_android_print_hdr(cmd_tbl_t *cmdtp, int flag,
15 				int argc, char * const argv[])
16 {
17 	struct blk_desc *dev_desc;
18 	struct andr_img_hdr *hdr;
19 	disk_partition_t part_info;
20 	const char *part_name;
21 	int blkcnt, ret;
22 
23 	if (argc != 2)
24 		return CMD_RET_USAGE;
25 
26 	part_name = argv[1];
27 
28 	dev_desc = rockchip_get_bootdev();
29 	if (!dev_desc) {
30 		printf("dev_desc is NULL!\n");
31 		return -ENODEV;
32 	}
33 
34 	ret = part_get_info_by_name(dev_desc, part_name, &part_info);
35 	if (ret < 0) {
36 		printf("Failed to get \"%s\" part, ret=%d\n", part_name, ret);
37 		return -ENODEV;
38 	}
39 
40 	blkcnt = DIV_ROUND_UP(sizeof(*hdr), dev_desc->blksz);
41 	hdr = memalign(ARCH_DMA_MINALIGN, dev_desc->blksz * blkcnt);
42 	if (!hdr) {
43 		printf("%s: out of memory!\n", __func__);
44 		return -ENOMEM;
45 	}
46 
47 	ret = blk_dread(dev_desc, part_info.start, blkcnt, hdr);
48 	if (ret != blkcnt) {
49 		printf("Failed to read %s sector, ret=%d\n", part_info.name, ret);
50 		free(hdr);
51 		return -EIO;
52 	}
53 
54 	if (!android_image_check_header(hdr)) {
55 		printf("Partition \"%s\"\n", part_info.name);
56 		android_print_contents(hdr);
57 	} else {
58 		printf("Not an android image\n");
59 	}
60 
61 	free(hdr);
62 
63 	return 0;
64 }
65 
66 U_BOOT_CMD(
67 	android_print_hdr, 2, 1, do_android_print_hdr,
68 	"print android image header", "<partition name>"
69 );
70