Hi Dileep,

> Adds the fastboot erase functionality, to erase a partition
> specified by name. The erase is performed based on erase group size,
> to avoid erasing other partitions. The start address and the size
> is aligned to the erase group size for this.
> 
> Currently only supports erasing from eMMC.
> 
> Signed-off-by: Dileep Katta <dileep.ka...@linaro.org>
> ---
> Changes in v2:
>       - Removed unnecessary newline for error() messages
>       - Made the command conditional on CONFIG_FASTBOOT_FLASH
>       - Updated doc/README.android-fastboot to reflect the support
>  common/fb_mmc.c                 | 56
> +++++++++++++++++++++++++++++++++++++++++
> doc/README.android-fastboot     |  5 ++--
> drivers/usb/gadget/f_fastboot.c | 25 ++++++++++++++++++
> include/fb_mmc.h                |  1 + 4 files changed, 84
> insertions(+), 3 deletions(-)
> 
> diff --git a/common/fb_mmc.c b/common/fb_mmc.c
> index 6ea3938..513b7ab 100644
> --- a/common/fb_mmc.c
> +++ b/common/fb_mmc.c
> @@ -10,6 +10,7 @@
>  #include <part.h>
>  #include <aboot.h>
>  #include <sparse_format.h>
> +#include <mmc.h>
>  
>  #ifndef CONFIG_FASTBOOT_GPT_NAME
>  #define CONFIG_FASTBOOT_GPT_NAME GPT_ENTRY_NAME
> @@ -110,3 +111,58 @@ void fb_mmc_flash_write(const char *cmd, void
> *download_buffer, write_raw_image(dev_desc, &info, cmd,
> download_buffer, download_bytes);
>  }
> +
> +void fb_mmc_erase(const char *cmd, char *response)
> +{
> +     int ret;
> +     block_dev_desc_t *dev_desc;
> +     disk_partition_t info;
> +     lbaint_t blks, blks_start, blks_size, grp_size;
> +     struct mmc *mmc =
> find_mmc_device(CONFIG_FASTBOOT_FLASH_MMC_DEV); +
> +     if (mmc == NULL) {
> +             error("invalid mmc device");
> +             fastboot_fail("invalid mmc device");
> +             return;
> +     }
> +
> +     /* initialize the response buffer */
> +     response_str = response;
> +
> +     dev_desc = get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
> +     if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) {
> +             error("invalid mmc device");
> +             fastboot_fail("invalid mmc device");
> +             return;
> +     }
> +
> +     ret = get_partition_info_efi_by_name(dev_desc, cmd, &info);
> +     if (ret) {
> +             error("cannot find partition: '%s'", cmd);
> +             fastboot_fail("cannot find partition");
> +             return;
> +     }
> +
> +     /* Align blocks to erase group size to avoid erasing other
> partitions */
> +     grp_size = mmc->erase_grp_size;
> +     blks_start = (info.start + grp_size - 1) & ~(grp_size - 1);
> +     if (info.size >= grp_size)
> +             blks_size = (info.size - (blks_start - info.start)) &
> +                             (~(grp_size - 1));
> +     else
> +             blks_size = 0;
> +
> +     printf("Erasing blocks " LBAFU " to " LBAFU " due to
> alignment\n",
> +            blks_start, blks_start + blks_size);
> +
> +     blks = dev_desc->block_erase(dev_desc->dev, blks_start,
> blks_size);
> +     if (blks != blks_size) {
> +             error("failed erasing from device %d",
> dev_desc->dev);
> +             fastboot_fail("failed erasing from device");
> +             return;
> +     }
> +
> +     printf("........ erased " LBAFU " bytes from '%s'\n",
> +            blks_size * info.blksz, cmd);
> +     fastboot_okay("");
> +}
> diff --git a/doc/README.android-fastboot b/doc/README.android-fastboot
> index 1677609..5526a43 100644
> --- a/doc/README.android-fastboot
> +++ b/doc/README.android-fastboot
> @@ -6,9 +6,8 @@ Overview
>  The protocol that is used over USB is described in
>  README.android-fastboot-protocol in same directory.
>  
> -The current implementation does not yet support the erase command or
> the -"oem format" command, and there is minimal support for the flash
> command; -it only supports eMMC devices.
> +The current implementation is a minimal support of the erase
> command,the +"oem format" command and flash command;it only supports
> eMMC devices. 
>  Client installation
>  ===================
> diff --git a/drivers/usb/gadget/f_fastboot.c
> b/drivers/usb/gadget/f_fastboot.c index f7d84bf..6138906 100644
> --- a/drivers/usb/gadget/f_fastboot.c
> +++ b/drivers/usb/gadget/f_fastboot.c
> @@ -535,6 +535,28 @@ static void cb_oem(struct usb_ep *ep, struct
> usb_request *req) }
>  }
>  
> +#ifdef CONFIG_FASTBOOT_FLASH
> +static void cb_erase(struct usb_ep *ep, struct usb_request *req)
> +{
> +     char *cmd = req->buf;
> +     char response[RESPONSE_LEN];
> +
> +     strsep(&cmd, ":");
> +     if (!cmd) {
> +             error("missing partition name");
> +             fastboot_tx_write_str("FAILmissing partition name");
> +             return;
> +     }
> +
> +     strcpy(response, "FAILno flash device defined");
> +
> +#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
> +     fb_mmc_erase(cmd, response);
> +#endif
> +     fastboot_tx_write_str(response);
> +}
> +#endif
> +
>  struct cmd_dispatch_info {
>       char *cmd;
>       void (*cb)(struct usb_ep *ep, struct usb_request *req);
> @@ -561,6 +583,9 @@ static const struct cmd_dispatch_info
> cmd_dispatch_info[] = { {
>               .cmd = "flash",
>               .cb = cb_flash,
> +     }, {
> +             .cmd = "erase",
> +             .cb = cb_erase,
>       },
>  #endif
>       {
> diff --git a/include/fb_mmc.h b/include/fb_mmc.h
> index 1ad1d13..402ba9b 100644
> --- a/include/fb_mmc.h
> +++ b/include/fb_mmc.h
> @@ -6,3 +6,4 @@
>  
>  void fb_mmc_flash_write(const char *cmd, void *download_buffer,
>                       unsigned int download_bytes, char *response);
> +void fb_mmc_erase(const char *cmd, char *response);

Reviewed-by: Lukasz Majewski <l.majew...@samsung.com>

I'm going to apply this patch to -dfu tree.

Thanks Dileep!

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to