[U-Boot] [PATCH v2 1/1] usb: gadget: fastboot: Add fastboot erase

Dileep Katta
2015-02-24T11:13:27Z

Thanks Lukasz.

Regards,
Dileep

On 24 February 2015 at 14:44, Lukasz Majewski <l.majewski@samsung.com>
wrote:

> 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.katta@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.majewski@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
>