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