diff options
author | sanshan zhang <sanshan.zhang@nxp.com> | 2017-06-08 10:41:38 +0800 |
---|---|---|
committer | Chen Guoyin <guoyin.chen@nxp.com> | 2017-07-10 15:07:56 +0800 |
commit | 893ec7807779aa34ce49866f03e49c592fff9543 (patch) | |
tree | fa657c380ae0d34b1b186dbc38ef1d4cf84ba819 /drivers/usb/gadget | |
parent | e095bd4e264aa171bb7e91196ac82a989e7b9649 (diff) | |
download | u-boot-imx-893ec7807779aa34ce49866f03e49c592fff9543.zip u-boot-imx-893ec7807779aa34ce49866f03e49c592fff9543.tar.gz u-boot-imx-893ec7807779aa34ce49866f03e49c592fff9543.tar.bz2 |
MA-9702-2 [Android] Enable booti for android arm64.
boot_addr_start for booti should be the addr of Image rather than
boot.img, so need read Image into hdr->kernel_addr.
change the offset for bootloader.
booti do not call android_image_get_kernel to init android env.
booti can't load boot.img, so it can't init android env.
init android env through android_image_get_kernel.
Change-Id: Ifb990ee9c5710ce7bd5fa9a0d4221dcb0e52d341
Signed-off-by: sanshan zhang <sanshan.zhang@nxp.com>
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r-- | drivers/usb/gadget/f_fastboot.c | 38 |
1 files changed, 32 insertions, 6 deletions
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); |