From 4b0b0f7cb6e66df82968fb92b9660d4d2f2c7c1e Mon Sep 17 00:00:00 2001 From: Luo Ji Date: Thu, 7 Dec 2017 17:04:59 +0800 Subject: 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 --- drivers/usb/gadget/f_fastboot.c | 121 +++++++++++++++++++++++----------------- 1 file 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); } } -- cgit v1.2.3