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