#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
                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("");
+}
 
 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
 ===================
 
        }
 }
 
+#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);
        {
                .cmd = "flash",
                .cb = cb_flash,
+       }, {
+               .cmd = "erase",
+               .cb = cb_erase,
        },
 #endif
        {