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