MMC storage supports 4 hardware partitions: * User partition * 2 boot partitions * RPMB partition
Flashing to the User partition is already supported, and this commit adds support for flashing to the 2 boot partitions. User can run the following commands to flash to the boot partitions: fastboot flash mmcboot0 myfile fastboot flash mmcboot1 myfile "mmcboot" is the default name of the partition and can be changed via a Kconfig option. Signed-off-by: Fabien Parent <fpar...@baylibre.com> --- drivers/fastboot/Kconfig | 17 +++++++++++++++++ drivers/fastboot/fb_mmc.c | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig index d63ecdd27e..f481d7596c 100644 --- a/drivers/fastboot/Kconfig +++ b/drivers/fastboot/Kconfig @@ -126,6 +126,23 @@ config FASTBOOT_MBR_NAME specified on the "fastboot flash" command line matches the value defined here. The default target name for updating MBR is "mbr". +config FASTBOOT_MMC_BOOT_PART_NAME + string "Target name for updating MMC's boot partitions" + depends on FASTBOOT_FLASH_MMC + default "mmcboot" + help + The fastboot "flash" command supports writing the downloaded + image to the MMC's boot partitions. + This occurs when the specified "partition name" on the + "fastboot flash" command line is starts with the value defined here, + and ends with '0' or '1' to specify which boot partition is being + targeted. + The default name for updating the boot partitions is "mmcboot". + For example the two partitions can be flashed using the following + commands if the default name is used: + - "fastboot flash mmcboot0 myfile", + - "fastboot flash mmcboot1 myfile". + config FASTBOOT_CMD_OEM_FORMAT bool "Enable the 'oem format' command" depends on FASTBOOT_FLASH_MMC && CMD_GPT diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c index 90ca81da9b..c2451200f7 100644 --- a/drivers/fastboot/fb_mmc.c +++ b/drivers/fastboot/fb_mmc.c @@ -46,6 +46,28 @@ static int part_get_info_by_name_or_alias(struct blk_desc *dev_desc, return ret; } +static int part_get_mmc_boot_info(int hwpart, disk_partition_t *info) +{ + struct mmc *mmc; + int ret; + + mmc = find_mmc_device(CONFIG_FASTBOOT_FLASH_MMC_DEV); + if (!mmc) + return -EINVAL; + + ret = blk_select_hwpart_devnum(IF_TYPE_MMC, + CONFIG_FASTBOOT_FLASH_MMC_DEV, hwpart); + if (ret < 0) + return ret; + + memset(info, 0, sizeof(*info)); + info->start = 0; + info->size = mmc->capacity_boot; + info->blksz = mmc->write_bl_len; + + return 0; +} + /** * fb_mmc_blk_write() - Write/erase MMC in chunks of FASTBOOT_MAX_BLK_WRITE * @@ -394,7 +416,19 @@ void fastboot_mmc_flash_write(const char *cmd, void *download_buffer, } #endif - if (part_get_info_by_name_or_alias(dev_desc, cmd, &info) < 0) { + if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT_PART_NAME "0") == 0) { + if (part_get_mmc_boot_info(1, &info) < 0) { + pr_err("cannot find partition: '%s'\n", cmd); + fastboot_fail("cannot find partition", response); + return; + } + } else if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT_PART_NAME "1") == 0) { + if (part_get_mmc_boot_info(2, &info) < 0) { + pr_err("cannot find partition: '%s'\n", cmd); + fastboot_fail("cannot find partition", response); + return; + } + } else if (part_get_info_by_name_or_alias(dev_desc, cmd, &info) < 0) { pr_err("cannot find partition: '%s'\n", cmd); fastboot_fail("cannot find partition", response); return; -- 2.20.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot