summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Ji <ji.luo@nxp.com>2017-12-07 17:04:59 +0800
committerLuo Ji <ji.luo@nxp.com>2017-12-13 10:57:21 +0800
commit4b0b0f7cb6e66df82968fb92b9660d4d2f2c7c1e (patch)
treea655bee84f7781e370e4373e768f7e219f4b1e78
parentcd2fd672eb88f282f09a2af5c48eac457b64f3b2 (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.c121
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);
}
}