diff options
author | Luo Ji <ji.luo@nxp.com> | 2017-12-07 17:04:59 +0800 |
---|---|---|
committer | Luo Ji <ji.luo@nxp.com> | 2017-12-13 10:57:21 +0800 |
commit | 4b0b0f7cb6e66df82968fb92b9660d4d2f2c7c1e (patch) | |
tree | a655bee84f7781e370e4373e768f7e219f4b1e78 | |
parent | cd2fd672eb88f282f09a2af5c48eac457b64f3b2 (diff) |
MA-10872 Write vaild size of gpt image for i.MX8
The offset of u-boot for i.MX8 boards is 33k bytes, writing whole gpt
image (34k) will break u-boot when the board is booted with SD card.
This patch only write vaild part (first 17k bytes) of gpt into SD card
and will keep backup gpt at the last LBA.
Change-Id: Iac5d337fb11a3e3ad2a9686efbfbacf9523dae58
Signed-off-by: Luo Ji <ji.luo@nxp.com>
-rw-r--r-- | drivers/usb/gadget/f_fastboot.c | 121 |
1 files changed, 69 insertions, 52 deletions
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index 752bf387f3..2c93ccbceb 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -615,6 +615,30 @@ bool bootloader_gpt_overlay(void) ANDROID_BOOTLOADER_OFFSET < ANDROID_GPT_END); } +int write_backup_gpt(void) +{ + int mmc_no = 0; + struct mmc *mmc; + struct blk_desc *dev_desc; + + mmc_no = fastboot_devinfo.dev_id; + mmc = find_mmc_device(mmc_no); + if (mmc == NULL) { + printf("invalid mmc device\n"); + return -1; + } + dev_desc = blk_get_dev("mmc", mmc_no); + + /* write backup get partition */ + if (write_backup_gpt_partitions(dev_desc, interface.transfer_buffer)) { + printf("writing GPT image fail\n"); + return -1; + } + + printf("flash backup gpt image successfully\n"); + return 0; +} + static void process_flash_mmc(const char *cmdbuf) { if (download_bytes) { @@ -632,31 +656,6 @@ static void process_flash_mmc(const char *cmdbuf) } #endif - if (strncmp(cmdbuf, "gpt", 3) == 0 && bootloader_gpt_overlay()) { - int mmc_no = 0; - struct mmc *mmc; - struct blk_desc *dev_desc; - mmc_no = fastboot_devinfo.dev_id; - mmc = find_mmc_device(mmc_no); - if (mmc == NULL) { - printf("invalid mmc device\n"); - fastboot_tx_write_str("FAILinvalid mmc device"); - } - dev_desc = blk_get_dev("mmc", mmc_no); - if (is_valid_gpt_buf(dev_desc, interface.transfer_buffer)) { - printf("invalid GPT image\n"); - fastboot_tx_write_str("FAILinvalid GPT partition image"); - return; - } - if (write_backup_gpt_partitions(dev_desc, interface.transfer_buffer)) { - printf("writing GPT image fail\n"); - fastboot_tx_write_str("FAILwriting GPT image fail"); - return; - } - printf("flash gpt image successfully\n"); - fastboot_okay(""); - return; - } /* Next is the partition name */ ptn = fastboot_flash_find_ptn(cmdbuf); if (ptn == NULL) { @@ -739,36 +738,54 @@ static void process_flash_mmc(const char *cmdbuf) download_bytes); } else { - /* block count */ - temp = (download_bytes + - MMC_SATA_BLOCK_SIZE - 1) / - MMC_SATA_BLOCK_SIZE; - - sprintf(mmc_write, "mmc write 0x%x 0x%x 0x%x", - (unsigned int)(uintptr_t)interface.transfer_buffer, /*source*/ - ptn->start, /*dest*/ - temp /*length*/); - - printf("Initializing '%s'\n", ptn->name); - - mmcret = run_command(mmc_dev, 0); - if (mmcret) - fastboot_fail("Init of MMC card failed"); - else - fastboot_okay(""); - - printf("Writing '%s'\n", ptn->name); - if (run_command(mmc_write, 0)) { - printf("Writing '%s' FAILED!\n", ptn->name); - fastboot_fail("Write partition failed"); - } else { - printf("Writing '%s' DONE!\n", ptn->name); - fastboot_okay(""); + /* Will flash images in below case: + * 1. Is not gpt partition. + * 2. Is gpt partition but no overlay detected. + * */ + if (strncmp(ptn->name, "gpt", 3) || !bootloader_gpt_overlay()) { + /* block count */ + if (strncmp(ptn->name, "gpt", 3) == 0) { + temp = (ANDROID_GPT_END + + MMC_SATA_BLOCK_SIZE - 1) / + MMC_SATA_BLOCK_SIZE; + } else { + temp = (download_bytes + + MMC_SATA_BLOCK_SIZE - 1) / + MMC_SATA_BLOCK_SIZE; + } + + sprintf(mmc_write, "mmc write 0x%x 0x%x 0x%x", + (unsigned int)(uintptr_t)interface.transfer_buffer, /*source*/ + ptn->start, /*dest*/ + temp /*length*/); + + printf("Initializing '%s'\n", ptn->name); + + mmcret = run_command(mmc_dev, 0); + if (mmcret) + fastboot_fail("Init of MMC card failed"); + else + fastboot_okay(""); + + printf("Writing '%s'\n", ptn->name); + if (run_command(mmc_write, 0)) { + printf("Writing '%s' FAILED!\n", ptn->name); + fastboot_fail("Write partition failed"); + } else { + printf("Writing '%s' DONE!\n", ptn->name); + fastboot_okay(""); + } } + /* Write backup gpt image */ if (strncmp(ptn->name, "gpt", 3) == 0) { + if (write_backup_gpt()) + fastboot_fail("write backup GPT image fail"); + else + fastboot_okay(""); + /* will force scan the device, - so dev_desc can be re-inited - with the latest data */ + * so dev_desc can be re-inited + * with the latest data */ run_command(mmc_dev, 0); } } |