diff options
-rw-r--r-- | common/image-android.c | 12 | ||||
-rw-r--r-- | drivers/usb/gadget/f_fastboot.c | 38 | ||||
-rw-r--r-- | include/android_image.h | 12 | ||||
-rw-r--r-- | include/image.h | 1 |
4 files changed, 57 insertions, 6 deletions
diff --git a/common/image-android.c b/common/image-android.c index 66f4316..d2ad997 100644 --- a/common/image-android.c +++ b/common/image-android.c @@ -220,3 +220,15 @@ int android_image_get_fdt(const struct andr_img_hdr *hdr, *fdt_len = hdr->second_size; return 0; } + +#define ARM64_IMAGE_MAGIC 0x644d5241 +bool image_arm64(void *images) +{ + struct header_image *ih; + + ih = (struct header_image *)images; + debug("image magic: %x\n", ih->magic); + if (ih->magic == le32_to_cpu(ARM64_IMAGE_MAGIC)) + return true; + return false; +} diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index fdbf2f8..33cad88 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -41,6 +41,7 @@ #include <part.h> #include <sparse_format.h> #include <image-sparse.h> +#include <image.h> #include <asm/imx-common/boot_mode.h> #ifdef CONFIG_ANDROID_RECOVERY #include <recovery.h> @@ -187,7 +188,11 @@ static struct usb_gadget_strings *fastboot_strings[] = { #define ANDROID_MBR_OFFSET 0 #define ANDROID_MBR_SIZE 0x200 +#ifdef CONFIG_BOOTLOADER_OFFSET_33K +#define ANDROID_BOOTLOADER_OFFSET 0x8400 +#else #define ANDROID_BOOTLOADER_OFFSET 0x400 +#endif #define ANDROID_BOOTLOADER_SIZE 0xFFC00 #define ANDROID_KERNEL_OFFSET 0x100000 #define ANDROID_KERNEL_SIZE 0x500000 @@ -1768,6 +1773,7 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) int mmcc = -1; struct andr_img_hdr *hdr = &boothdr; ulong image_size; + bool check_image_arm64; #ifdef CONFIG_SECURE_BOOT #define IVT_SIZE 0x20 #define CSF_PAD_SIZE CONFIG_CSF_SIZE @@ -1883,7 +1889,7 @@ use_given_ptn: } /* flush cache after read */ flush_cache((ulong)load_addr, bootimg_sectors * 512); /* FIXME */ - + check_image_arm64 = image_arm64(load_addr + hdr->page_size); addr = load_addr; #ifdef CONFIG_FASTBOOT_LOCK int verifyresult = -1; @@ -1919,6 +1925,17 @@ use_given_ptn: #endif sector = pte->start + (hdr->page_size / 512); + if (check_image_arm64) { + if (mmc->block_dev.block_read(dev_desc, sector, + (hdr->kernel_size / 512) + 1, + (void *)hdr->kernel_addr) < 0) { + printf("boota: mmc failed to read kernel\n"); + goto fail; + } + flush_cache((ulong)hdr->kernel_addr, hdr->kernel_size); + android_image_get_kernel(hdr, 0, NULL, NULL); + addr = hdr->kernel_addr; + } sector += ALIGN(hdr->kernel_size, hdr->page_size) / 512; if (mmc->block_dev.block_read(dev_desc, sector, (hdr->ramdisk_size / 512) + 1, @@ -2038,15 +2055,24 @@ use_given_ptn: char boot_addr_start[12]; char ramdisk_addr[25]; char fdt_addr[12]; - - char *bootm_args[] = { "bootm", boot_addr_start, ramdisk_addr, fdt_addr}; + char *boot_args[] = { NULL, boot_addr_start, ramdisk_addr, fdt_addr}; + if (check_image_arm64) + boot_args[0] = "booti"; + else + boot_args[0] = "bootm"; sprintf(boot_addr_start, "0x%lx", addr); sprintf(ramdisk_addr, "0x%x:0x%x", hdr->ramdisk_addr, hdr->ramdisk_size); sprintf(fdt_addr, "0x%x", hdr->second_addr); - - do_bootm(NULL, 0, 4, bootm_args); - + if (check_image_arm64) { +#ifdef CONFIG_CMD_BOOTI + do_booti(NULL, 0, 4, boot_args); +#else + debug("please enable CONFIG_CMD_BOOTI when kernel are Image"); +#endif + } else { + do_bootm(NULL, 0, 4, boot_args); + } /* This only happens if image is somehow faulty so we start over */ do_reset(NULL, 0, 0, NULL); diff --git a/include/android_image.h b/include/android_image.h index 094d60a..1c70bf8 100644 --- a/include/android_image.h +++ b/include/android_image.h @@ -66,4 +66,16 @@ struct andr_img_hdr { * 6. if second_size != 0: jump to second_addr * else: jump to kernel_addr */ +struct header_image { + uint32_t code0; /* Executable code */ + uint32_t code1; /* Executable code */ + uint64_t text_offset; /* Image load offset, LE */ + uint64_t image_size; /* Effective Image size, LE */ + uint64_t res1; /* reserved */ + uint64_t res2; /* reserved */ + uint64_t res3; /* reserved */ + uint64_t res4; /* reserved */ + uint32_t magic; /* Magic number */ + uint32_t res5; +}; #endif diff --git a/include/image.h b/include/image.h index dd4c8e3..54a5d8e 100644 --- a/include/image.h +++ b/include/image.h @@ -1245,6 +1245,7 @@ int android_image_get_fdt(const struct andr_img_hdr *hdr, ulong android_image_get_end(const struct andr_img_hdr *hdr); ulong android_image_get_kload(const struct andr_img_hdr *hdr); void android_print_contents(const struct andr_img_hdr *hdr); +bool image_arm64(void *images); #endif /* CONFIG_ANDROID_BOOT_IMAGE */ |