/*
 * (C) Copyright 2008 - 2009
 * Windriver, <www.windriver.com>
 * Tom Rix <Tom.Rix@windriver.com>
 *
 * Copyright 2011 Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 *
 * Copyright 2014 Linaro, Ltd.
 * Rob Herring <robh@kernel.org>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */
#include <config.h>
#include <common.h>
#include <errno.h>
#include <malloc.h>
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
#include <linux/usb/composite.h>
#include <linux/compiler.h>
#include <version.h>
#include <g_dnl.h>
#include <asm/arch/cpu.h>
#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
#include <fb_mmc.h>
#include <fb_storage.h>
#include <fb_fastboot.h>
#include <emmc_partitions.h>
#endif
#ifdef CONFIG_FASTBOOT_FLASH_NAND_DEV
#include <fb_nand.h>
#endif
#include <partition_table.h>
#include <android_image.h>
#include <image.h>
#ifdef CONFIG_AML_ANTIROLLBACK
#include <anti-rollback.h>
#endif
#include <zircon.h>
#include <zircon/hw/gpt.h>
#include <zircon_boot/zircon_boot.h>

#include <efi_loader.h>

DECLARE_GLOBAL_DATA_PTR;

#define FASTBOOT_VERSION		"0.4"

#define FASTBOOT_INTERFACE_CLASS	0xff
#define FASTBOOT_INTERFACE_SUB_CLASS	0x42
#define FASTBOOT_INTERFACE_PROTOCOL	0x03

#define ENDPOINT_MAXIMUM_PACKET_SIZE_2_0  (0x0200)

#ifdef CONFIG_DEVICE_PRODUCT
#define DEVICE_PRODUCT	CONFIG_DEVICE_PRODUCT
#endif

#define FB_ERR(fmt ...) printf("[ERR]%sL%d:", __func__, __LINE__),printf(fmt)
#define FB_MSG(fmt ...) printf("[MSG]"fmt)
#define FB_WRN(fmt ...) printf("[WRN]"fmt)
#define FB_DBG(...)
#define FB_HERE()    printf("f(%s)L%d\n", __func__, __LINE__)

extern void f_dwc_otg_pullup(int is_on);

#ifdef CONFIG_BOOTLOADER_CONTROL_BLOCK
extern int is_partition_logical(const char *parition_name);
#endif

/* The 64 defined bytes plus \0 */

#define EP_BUFFER_SIZE	4096

struct f_fastboot {
	struct usb_function usb_function;

	/* IN/OUT EP's and corresponding requests */
	struct usb_ep *in_ep, *out_ep;
	struct usb_request *in_req, *out_req;
};

static inline struct f_fastboot *func_to_fastboot(struct usb_function *f)
{
	return container_of(f, struct f_fastboot, usb_function);
}

static struct f_fastboot *fastboot_func;
static unsigned int download_size;
static unsigned int download_bytes;


static struct usb_endpoint_descriptor ep_in = {
	.bLength            = USB_DT_ENDPOINT_SIZE,
	.bDescriptorType    = USB_DT_ENDPOINT,
	.bEndpointAddress   = USB_DIR_IN,
	.bmAttributes       = USB_ENDPOINT_XFER_BULK,
	.wMaxPacketSize     = ENDPOINT_MAXIMUM_PACKET_SIZE_2_0,
	.bInterval          = 0x00,
};

static struct usb_endpoint_descriptor ep_out = {
	.bLength		= USB_DT_ENDPOINT_SIZE,
	.bDescriptorType	= USB_DT_ENDPOINT,
	.bEndpointAddress	= USB_DIR_OUT,
	.bmAttributes		= USB_ENDPOINT_XFER_BULK,
	.wMaxPacketSize		= ENDPOINT_MAXIMUM_PACKET_SIZE_2_0,
	.bInterval		= 0x00,
};

static struct usb_interface_descriptor interface_desc = {
	.bLength		= USB_DT_INTERFACE_SIZE,
	.bDescriptorType	= USB_DT_INTERFACE,
	.bInterfaceNumber	= 0x00,
	.bAlternateSetting	= 0x00,
	.bNumEndpoints		= 0x02,
	.bInterfaceClass	= FASTBOOT_INTERFACE_CLASS,
	.bInterfaceSubClass	= FASTBOOT_INTERFACE_SUB_CLASS,
	.bInterfaceProtocol	= FASTBOOT_INTERFACE_PROTOCOL,
};

static struct usb_descriptor_header *fb_runtime_descs[] = {
	(struct usb_descriptor_header *)&interface_desc,
	(struct usb_descriptor_header *)&ep_in,
	(struct usb_descriptor_header *)&ep_out,
	NULL,
};

/*
 * static strings, in UTF-8
 */
static const char fastboot_name[] = "Android Fastboot";

static struct usb_string fastboot_string_defs[] = {
	[0].s = fastboot_name,
	{  }			/* end of list */
};

static struct usb_gadget_strings stringtab_fastboot = {
	.language	= 0x0409,	/* en-us */
	.strings	= fastboot_string_defs,
};

static struct usb_gadget_strings *fastboot_strings[] = {
	&stringtab_fastboot,
	NULL,
};

#define DRAM_UBOOT_RESERVE		0x01000000
unsigned int ddr_size_usable(unsigned int addr_start)
{
	unsigned int ddr_size=0;
	unsigned int free_size = 0;
	int i;

	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
		ddr_size += gd->bd->bi_dram[i].size;

	free_size = (ddr_size - DRAM_UBOOT_RESERVE - addr_start - CONFIG_SYS_MALLOC_LEN - CONFIG_SYS_MEM_TOP_HIDE);
#if defined CONFIG_FASTBOOT_MAX_DOWN_SIZE
	if (free_size > CONFIG_FASTBOOT_MAX_DOWN_SIZE)
		free_size = CONFIG_FASTBOOT_MAX_DOWN_SIZE;
#endif
	return free_size;
}

static void rx_handler_command(struct usb_ep *ep, struct usb_request *req);

static char response_str[RESPONSE_LEN + 1];

void fastboot_fail(const char *s)
{
	strncpy(response_str, "FAIL", 5);
	if (s)strncat(response_str, s, RESPONSE_LEN - 4 - 1) ;
}

void fastboot_okay(const char *s)
{
	strncpy(response_str, "OKAY", 5);
	if (s)strncat(response_str, s, RESPONSE_LEN - 4 - 1) ;
}

void fastboot_busy(const char* s)
{
	strncpy(response_str, "INFO", 4 + 1);//add terminated 0
	if (s)strncat(response_str, s, RESPONSE_LEN - 4 - 1) ;
}
int fastboot_is_busy(void)
{
	return !strncmp("INFO", response_str, strlen("INFO"));
}

//cb for bulk in_req->complete
static void fastboot_complete(struct usb_ep *ep, struct usb_request *req)
{
	int status = req->status;

	if ( fastboot_is_busy() && fastboot_func) {
		struct usb_ep* out_ep = fastboot_func->out_ep;
		struct usb_request* out_req = fastboot_func->out_req;
		rx_handler_command(out_ep, out_req);
		return;
	}
	if (!status)
		return;
	printf("status: %d ep '%s' trans: %d\n", status, ep->name, req->actual);
}

static int fastboot_bind(struct usb_configuration *c, struct usb_function *f)
{
	int id;
	struct usb_gadget *gadget = c->cdev->gadget;
	struct f_fastboot *f_fb = func_to_fastboot(f);

	/* DYNAMIC interface numbers assignments */
	id = usb_interface_id(c, f);
	if (id < 0)
		return id;
	interface_desc.bInterfaceNumber = id;

	id = usb_string_id(c->cdev);
	if (id < 0)
		return id;
	fastboot_string_defs[0].id = id;
	interface_desc.iInterface = id;

	f_fb->in_ep = usb_ep_autoconfig(gadget, &ep_in);
	if (!f_fb->in_ep)
		return -ENODEV;
	f_fb->in_ep->driver_data = c->cdev;

	f_fb->out_ep = usb_ep_autoconfig(gadget, &ep_out);
	if (!f_fb->out_ep)
		return -ENODEV;
	f_fb->out_ep->driver_data = c->cdev;

	return 0;
}

static void fastboot_unbind(struct usb_configuration *c, struct usb_function *f)
{
	memset(fastboot_func, 0, sizeof(*fastboot_func));
}

static void fastboot_disable(struct usb_function *f)
{
	struct f_fastboot *f_fb = func_to_fastboot(f);

	usb_ep_disable(f_fb->out_ep);
	usb_ep_disable(f_fb->in_ep);

	if (f_fb->out_req) {
		free(f_fb->out_req->buf);
		usb_ep_free_request(f_fb->out_ep, f_fb->out_req);
		f_fb->out_req = NULL;
	}
	if (f_fb->in_req) {
		free(f_fb->in_req->buf);
		usb_ep_free_request(f_fb->in_ep, f_fb->in_req);
		f_fb->in_req = NULL;
	}
}

static struct usb_request *fastboot_start_ep(struct usb_ep *ep)
{
	struct usb_request *req;

	req = usb_ep_alloc_request(ep, 0);
	if (!req)
		return NULL;

	req->length = EP_BUFFER_SIZE;
	req->buf = memalign(CONFIG_SYS_CACHELINE_SIZE, EP_BUFFER_SIZE);
	if (!req->buf) {
		usb_ep_free_request(ep, req);
		return NULL;
	}

	memset(req->buf, 0, req->length);
	return req;
}

static int fastboot_set_alt(struct usb_function *f,
			    unsigned interface, unsigned alt)
{
	int ret;
	struct f_fastboot *f_fb = func_to_fastboot(f);

	debug("%s: func: %s intf: %d alt: %d\n",
	      __func__, f->name, interface, alt);

	/* make sure we don't enable the ep twice */
	ret = usb_ep_enable(f_fb->out_ep, &ep_out);
	if (ret) {
		puts("failed to enable out ep\n");
		return ret;
	}

	f_fb->out_req = fastboot_start_ep(f_fb->out_ep);
	if (!f_fb->out_req) {
		puts("failed to alloc out req\n");
		ret = -EINVAL;
		goto err;
	}
	f_fb->out_req->complete = rx_handler_command;

	ret = usb_ep_enable(f_fb->in_ep, &ep_in);
	if (ret) {
		puts("failed to enable in ep\n");
		goto err;
	}

	f_fb->in_req = fastboot_start_ep(f_fb->in_ep);
	if (!f_fb->in_req) {
		puts("failed alloc req in\n");
		ret = -EINVAL;
		goto err;
	}
	f_fb->in_req->complete = fastboot_complete;

	ret = usb_ep_queue(f_fb->out_ep, f_fb->out_req, 0);
	if (ret)
		goto err;

	return 0;
err:
	fastboot_disable(f);
	return ret;
}

static int  fastboot_setup(struct usb_function *f,
	const struct usb_ctrlrequest *ctrl)
{
	int value = -EOPNOTSUPP;
	struct f_fastboot *f_fb = func_to_fastboot(f);

	/* composite driver infrastructure handles everything; interface
	 * activation uses set_alt().
	 */
	if (((ctrl->bRequestType & USB_RECIP_MASK) == USB_RECIP_ENDPOINT)
		&& (ctrl->bRequest == USB_REQ_CLEAR_FEATURE)
		&& (ctrl->wValue== USB_ENDPOINT_HALT)) {
		switch (ctrl->wIndex & 0xfe) {
		case USB_DIR_OUT:
			value = ctrl->wLength;
			usb_ep_clear_halt(f_fb->out_ep);
			break;

		case USB_DIR_IN:
			value = ctrl->wLength;
			usb_ep_clear_halt(f_fb->in_ep);
			break;
		default:
			printf("unknown usb_ctrlrequest\n");
			break;
		}
	}

	return value;
}

static int fastboot_add(struct usb_configuration *c)
{
	struct f_fastboot *f_fb;
	int status;

	if (fastboot_func == NULL) {
		f_fb = memalign(CONFIG_SYS_CACHELINE_SIZE, sizeof(*f_fb));
		if (!f_fb)
			return -ENOMEM;

		fastboot_func = f_fb;
		memset(f_fb, 0, sizeof(*f_fb));
	} else {
		f_fb = fastboot_func;
	}

	f_fb->usb_function.name = "f_fastboot";
	f_fb->usb_function.hs_descriptors = fb_runtime_descs;
	f_fb->usb_function.bind = fastboot_bind;
	f_fb->usb_function.unbind = fastboot_unbind;
	f_fb->usb_function.set_alt = fastboot_set_alt;
	f_fb->usb_function.disable = fastboot_disable;
	f_fb->usb_function.strings = fastboot_strings;
	f_fb->usb_function.setup = fastboot_setup;

	status = usb_add_function(c, &f_fb->usb_function);
	if (status) {
		free(f_fb);
		fastboot_func = NULL;
	}

	return status;
}
DECLARE_GADGET_BIND_CALLBACK(usb_dnl_fastboot, fastboot_add);

static int fastboot_tx_write(const char *buffer, unsigned int buffer_size)
{
	struct usb_request *in_req = fastboot_func->in_req;
	int ret;

	memcpy(in_req->buf, buffer, buffer_size);
	in_req->length = buffer_size;
	ret = usb_ep_queue(fastboot_func->in_ep, in_req, 0);
	if (ret)
		printf("Error %d on queue\n", ret);
	return 0;
}

static int fastboot_tx_write_str(const char *buffer)
{
	return fastboot_tx_write(buffer, strlen(buffer));
}

static void compl_do_reboot(struct usb_ep *ep, struct usb_request *req)
{
	run_command("reboot", 0);
}

static void compl_do_reboot_bootloader(struct usb_ep *ep, struct usb_request *req)
{
	if (dynamic_partition)
		run_command("reboot bootloader", 0);
	else
		run_command("reboot fastboot", 0);
}

static void compl_do_reboot_recovery(struct usb_ep *ep,
				       struct usb_request *req)
{
	run_command("reboot recovery", 0);
}

static int strcmp_l1(const char *s1, const char *s2)
{
	if (!s1 || !s2) {
		return -1;
	}
	return strncmp(s1, s2, strlen(s1));
}

enum fastboot_locked_access {
	NONE = 0,
	WRITE = 1 << 0,
	ERASE = 1 << 1,
};

struct partition_info_t {
	const char *name;
	const char *alias; // Partition alias or NULL for none.
	uint8_t access; // Fastboot access level when locked.
};

static const struct partition_info_t partition_info[] = {
	// clang-format off
	{ GUID_BOOTLOADER_NAME,		NULL,		WRITE | ERASE },
	{ GPT_ZIRCON_A_NAME,		"boot_a",	WRITE | ERASE },
	{ GPT_ZIRCON_B_NAME,		"boot_b",	WRITE | ERASE },
	{ GPT_ZIRCON_R_NAME,		"boot_r",	WRITE | ERASE },
	{ GPT_VBMETA_A_NAME,		NULL,		WRITE | ERASE },
	{ GPT_VBMETA_B_NAME,		NULL,		WRITE | ERASE },
	{ GPT_VBMETA_R_NAME,		NULL,		WRITE | ERASE },
	// For Fuchsia the super partition doesn't use Android super format
	// but is just the FVM.
	{ GPT_FVM_NAME,			"super",	WRITE | ERASE },
	{ GPT_DURABLE_BOOT_NAME,	"misc",		ERASE },
	// `fastboot -w` flag triggers `erase userdata`; functionally this doesn't
	// apply for Fuchsia since userdata is stored in the FVM and we can't wipe
	// it separately, so for now we accept `erase userdata` but it's just a
	// no-op.
	{ "userdata",			NULL,		ERASE },
	// Upstream also aliases dts -> dtb, but we don't need this at the moment.
	// clang-format on
};

static uint8_t get_fastboot_lock_access(const char *part)
{
	for (size_t i = 0; i < ARRAY_SIZE(partition_info); i++) {
		if (strcmp(part, partition_info[i].name) == 0) {
			return partition_info[i].access;
		}
	}
	return NONE;
}

// Returns the real partition name for the given alias.
//
// We sometimes want to support flashing tools that have different expectations
// around partition names. This maps all supported partition names and aliases
// into the actual partition name.
//
// Returns NULL if the partition does not exist either in the GPT or the
// known partition list.
static const char *get_real_part_name(char *part)
{
	// If the partition exists in the GPT, it's the real name.
	if (find_mmc_partition_by_name(part)) {
		return part;
	}

	// Otherwise, try to find it in the known partition list.
	//
	// If a partition exists in the list we always allow it without checking
	// the GPT. This is to support virtual partitions e.g. "bootloader"
	// which aren't actually in the GPT, but it's still up to the caller to
	// handle the resulting partition properly.
	for (size_t i = 0; i < ARRAY_SIZE(partition_info); i++) {
		const struct partition_info_t *info = &partition_info[i];

		if (strcmp(info->name, part) == 0) {
			return part;
		}

		if (info->alias && strcmp(part, info->alias) == 0) {
			printf("Partition alias: %s -> %s\n", part, info->name);
			return info->name;
		}
	}

	return NULL;
}

// Returns true if `c` is a valid slot character (a, b, r).
static bool is_slot_char(char c)
{
	return c == 'a' || c == 'b' || c == 'r';
}

// Parses a partition name out of a fastboot command.
//
// On input `cmd` should be the command and partition name, e.g. "flash:foo".
// This string will be modified in-place, but the returned string may or may
// not point to this buffer.
//
// The returned string:
// * skips the leading command and colon
// * removes any partition double-slotting
// * calls `get_real_part_name()` to resolve aliases
//
// Double-slotted partitions (e.g. `zircon_a_a`) will drop the latter slot. This
// can happen when Fuchsia tooling explicitly provides a slot to fastboot via
// `fastboot flash <part>_a`, because fastboot itself will then query whether
// the partition is slotted and append another slot suffix if so.
//
// We may at some point want to fix fastboot to not append a suffix if the
// partition is already slotted, but working around it here is easier for now.
//
// On failure, this updates the fastboot TX buffer with a failure message and
// returns NULL.
static const char *parse_fb_cmd_partition(char *cmd)
{
	strsep(&cmd, ":");
	if (cmd == NULL) {
		fastboot_tx_write_str("FAILmissing partition name");
		return NULL;
	}

	// Check for a double-slotted partition. In this case we want to drop
	// the fastboot-appended suffix in favor of the suffix explicitly given
	// by the user.
	int part_len = strlen(cmd);
	if (part_len > 4) {
		char *suffix = &cmd[part_len - 4];
		if (suffix[0] == '_' && is_slot_char(suffix[1]) &&
		    suffix[2] == '_' && is_slot_char(suffix[3])) {
			printf("Partition slot fix: %s -> ", cmd);
			suffix[2] = '\0';
			printf("%s\n", cmd);
		}
	}

	const char *part = get_real_part_name(cmd);
	if (part == NULL) {
		fastboot_tx_write_str("FAILunknown partition");
		return NULL;
	}

	return part;
}

static void cb_reboot(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	if (!strcmp("reboot", cmd)) {
		fastboot_func->in_req->complete = compl_do_reboot;
		fastboot_tx_write_str("OKAY");
	} else if (!strcmp("reboot-bootloader", cmd)) {
		fastboot_func->in_req->complete = compl_do_reboot_bootloader;
		fastboot_tx_write_str("OKAY");
	} else if (!strcmp("reboot-recovery", cmd)) {
		fastboot_func->in_req->complete = compl_do_reboot_recovery;
		fastboot_tx_write_str("OKAY");
	} else if (!strcmp("reboot-fastboot", cmd)) {
		// TODO(b/285184591) support userspace flashing for "super"?
		fastboot_tx_write_str("FAILuserspace fastboot unsupported");
	} else {
		fastboot_tx_write_str("FAILunknown reboot command");
	}
}

void dump_lock_info(LockData_t* info)
{
	printf("info->version_major = %d\n", info->version_major);
	printf("info->version_minor = %d\n", info->version_minor);
	printf("info->lock_state = %d\n", info->lock_state);
	printf("info->lock_critical_state = %d\n", info->lock_critical_state);
	printf("info->lock_bootloader = %d\n", info->lock_bootloader);
}


static int check_lock(void)
{
	char *lock_s;
	LockData_t* info;

	lock_s = getenv("lock");
	if (!lock_s) {
		printf("lock state is NULL \n");
		lock_s = "10000000";
		setenv("lock", "10000000");
		run_command("defenv_reserv; saveenv;", 0);
	}
	FB_DBG("lock state: %s\n", lock_s);

	info = malloc(sizeof(struct LockData));
	if (info) {
		memset(info,0,LOCK_DATA_SIZE);
		info->version_major = (int)(lock_s[0] - '0');
		info->version_minor = (int)(lock_s[1] - '0');
		info->lock_state = (int)(lock_s[4] - '0');
		info->lock_critical_state = (int)(lock_s[5] - '0');
		info->lock_bootloader = (int)(lock_s[6] - '0');

		dump_lock_info(info);
	} else
		return 0;

	if ((info->lock_state == 1 ) || ( info->lock_critical_state == 1 )) {
		free (info);
		return 1;
	}
	else {
		free (info);
		return 0;
	}
}

static const char* getvar_list[] = {
	"version-baseband", "version-bootloader", "version", "hw-revision", "max-download-size",
	"serialno", "product", "off-mode-charge", "variant", "battery-soc-ok",
	"battery-voltage", "partition-type:boot", "partition-size:boot",
	"partition-type:system", "partition-size:system", "partition-type:vendor", "partition-size:vendor",
	"partition-type:odm", "partition-size:odm", "partition-type:data", "partition-size:data",
	"erase-block-size", "logical-block-size", "secure", "unlocked",
};

static const char* getvar_list_dynamic[] = {
	"hw-revision", "battery-voltage", "is-userspace", "is-logical:data",
	"is-logical:metadata", "is-logical:misc", "is-logical:super", "is-logical:boot",
	"is-logical:system", "is-logical:vendor", "is-logical:product", "is-logical:odm",
	"slot-count", "max-download-size", "serialno", "product", "unlocked", "has-slot:data",
	"has-slot:metadata", "has-slot:misc", "has-slot:super", "has-slot:boot",
	"has-slot:system", "has-slot:vendor", "has-slot:product", "has-slot:odm",
	"secure", "super-partition-name", "version-baseband", "version-bootloader",
	"partition-size:boot", "partition-size:metadata", "partition-size:misc",
	"partition-size:super", "partition-size:data", "version",
};

static const char *getvar_list_ab[] = {
	"current-slot",
	"has-slot:" GPT_DURABLE_BOOT_NAME,
	"has-slot:" GPT_FVM_NAME,
	// `has-slot` queries the generic base name without any slot suffix.
	"has-slot:vbmeta",
	"has-slot:zircon",
	"hw-revision",
	"is-userspace",
	"max-download-size",
	"partition-size:" GPT_DURABLE_BOOT_NAME,
	"partition-size:" GPT_FVM_NAME,
	"partition-size:" GPT_VBMETA_A_NAME,
	"partition-size:" GPT_VBMETA_B_NAME,
	"partition-size:" GPT_VBMETA_R_NAME,
	"partition-size:" GPT_ZIRCON_A_NAME,
	"partition-size:" GPT_ZIRCON_B_NAME,
	"partition-size:" GPT_ZIRCON_R_NAME,
	"product",
	"serialno",
	"slot-count",
	"slot-last-set-active",
	"slot-retry-count:a",
	"slot-retry-count:b",
	"slot-successful:a",
	"slot-successful:b",
	"slot-suffixes",
	"slot-unbootable:a",
	"slot-unbootable:b",
	"version",
	"version-bootloader",
	"vx-locked",
	"vx-unlockable",
};

extern ZirconBootOps zb_ops;

// Returns slot info for the given slot string "a" or "b", or NULL on failure.
// The returned struct is only valid until the next call to this function.
static AbrSlotInfo* get_slot_info(const char *suffix)
{
	AbrSlotIndex slot_index;
	if (strcmp(suffix, "a") == 0) {
		slot_index = kAbrSlotIndexA;
	} else if (strcmp(suffix, "b") == 0) {
		slot_index = kAbrSlotIndexB;
	} else {
		return NULL;
	}

	static AbrSlotInfo slot_info;
	AbrOps ops = GetAbrOpsFromZirconBootOps(&zb_ops);
	if (AbrGetSlotInfo(&ops, slot_index, &slot_info) != kAbrResultOk) {
		return NULL;
	}

	return &slot_info;
}

static void cb_getvar(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	char cmdBuf[RESPONSE_LEN];
	char* response = response_str;
	char *s1;
	size_t chars_left;

	strcpy(response, "OKAY");
	chars_left = sizeof(response_str) - strlen(response) - 1;

	memcpy(cmdBuf, cmd, strnlen(cmd, RESPONSE_LEN-1)+1);
	cmd = cmdBuf;
	strsep(&cmd, ":");
	FB_DBG("cb_getvar: %s\n", cmd);
	if (!cmd) {
		error("missing variable\n");
		fastboot_tx_write_str("FAILmissing var");
		return;
	}
	if (!strncmp(cmd, "all", 3)) {
		static int cmdIndex = 0;
		int getvar_num = 0;
		if (has_boot_slot == 1 && strlen(getvar_list_ab[cmdIndex]) < 64) {
			strcpy(cmd, getvar_list_ab[cmdIndex]);
			getvar_num = (sizeof(getvar_list_ab) / sizeof(getvar_list_ab[0]));
		} else if (dynamic_partition && strlen(getvar_list_dynamic[cmdIndex]) < 64) {
			strcpy(cmd, getvar_list_dynamic[cmdIndex]);//only support no-arg cmd
			getvar_num = (sizeof(getvar_list_dynamic) / sizeof(getvar_list_dynamic[0]));
		} else if (strlen(getvar_list[cmdIndex]) < 64) {
			strcpy(cmd, getvar_list[cmdIndex]);//only support no-arg cmd
			getvar_num = (sizeof(getvar_list) / sizeof(getvar_list[0]));
		}
		FB_DBG("getvar_num: %d\n", getvar_num);
		if (++cmdIndex > getvar_num) {
			// Reset the index for the next `getvar all` and return
			// the final empty OKAY response to end the transaction.
			cmdIndex = 0;
			fastboot_tx_write_str(response);
			return;
		}
		fastboot_busy(NULL);
		FB_DBG("all cmd:%s\n", cmd);
		strncat(response, cmd, chars_left);
		strncat(response, ": ", 2);
		chars_left -= strlen(cmd) + 1;
	}

	if (!strcmp_l1("version-baseband", cmd)) {
		strncat(response, "N/A", chars_left);
	} else if (!strcmp_l1("version-bootloader", cmd) ||
		   !strcmp_l1("bootloader-version", cmd)) {
		strncat(response, U_BOOT_VERSION, chars_left);
	} else if (!strcmp_l1("hw-revision", cmd)) {
		strncat(response, "vim3", chars_left);
	} else if (!strcmp_l1("version", cmd)) {
		strncat(response, FASTBOOT_VERSION, chars_left);
	} else if (!strcmp_l1("off-mode-charge", cmd)) {
		strncat(response, "0", chars_left);
	} else if (!strcmp_l1("variant", cmd)) {
		strncat(response, "US", chars_left);
	} else if (!strcmp_l1("battery-soc-ok", cmd)) {
		strncat(response, "yes", chars_left);
	} else if (!strcmp_l1("battery-voltage", cmd)) {
		strncat(response, "4", chars_left);
	} else if (!strcmp_l1("is-userspace", cmd)) {
		strncat(response, "no", chars_left);
	} else if (!strcmp_l1("is-logical", cmd)) {
		strsep(&cmd, ":");
		printf("partition is %s\n", cmd);
		if (!dynamic_partition) {
			strncat(response, "no", chars_left);
		} else {
#ifdef CONFIG_BOOTLOADER_CONTROL_BLOCK
			if (is_partition_logical(cmd) == 0) {
				error("%s is logic partition\n", cmd);
				strncat(response, "yes", chars_left);
			} else {
				strncat(response, "no", chars_left);
			}
#else
			strncat(response, "no", chars_left);
#endif
		}
	} else if (!strcmp_l1("super-partition-name", cmd)) {
		char *slot_name;
		slot_name = getenv("slot-suffixes");
		if (has_boot_slot == 0) {
			strncat(response, "super", chars_left);
		} else {
			printf("slot-suffixes: %s\n", slot_name);
			if (strcmp(slot_name, "0") == 0) {
				printf("active_slot is %s\n", "a");
				strncat(response, "super_a", chars_left);
			} else if (strcmp(slot_name, "1") == 0) {
				printf("active_slot is %s\n", "b");
				strncat(response, "super_b", chars_left);
			}
		}
	} else if (!strcmp_l1("downloadsize", cmd) ||
		!strcmp_l1("max-download-size", cmd)) {
		char str_num[12];

		sprintf(str_num, "0x%08x", ddr_size_usable(CONFIG_USB_FASTBOOT_BUF_ADDR));
		strncat(response, str_num, chars_left);
	} else if (!strcmp_l1("serialno", cmd)) {
		// The reported serialno must be the same as what was registered
		// in the USB descriptor iSerial field, since that's how
		// fastboot discovers devices.
		strncat(response, g_dnl_get_serialnumber(), chars_left);
	} else if (!strcmp_l1("product", cmd)) {
#ifdef DEVICE_PRODUCT
		s1 = DEVICE_PRODUCT;
		FB_DBG("DEVICE_PRODUCT: %s\n", s1);
#else
		s1 = getenv("device_product");
		FB_DBG("device_product: %s\n", s1);
#endif
		strncat(response, s1, chars_left);
	} else if (!strcmp_l1("slot-count", cmd)) {
		strncat(response, "2", chars_left);
	} else if (!strcmp_l1("slot-suffixes", cmd)) {
		strncat(response, "a,b", chars_left);
	} else if (!strcmp_l1("current-slot", cmd)) {
		AbrOps ops = GetAbrOpsFromZirconBootOps(&zb_ops);
		const char *slot =
			AbrGetSlotSuffix(AbrGetBootSlot(&ops, false, NULL));
		if (slot) {
			strncat(response, slot + 1, chars_left);
			FB_DBG("current-slot: %s\n", slot);
		}
	} else if (!strcmp_l1("slot-last-set-active", cmd)) {
		AbrOps ops = GetAbrOpsFromZirconBootOps(&zb_ops);
		AbrSlotIndex slot_index;
		if (AbrGetSlotLastMarkedActive(&ops, &slot_index) !=
		    kAbrResultOk) {
			fastboot_fail("Failed to fetch last active slot");
		} else {
			const char *slot = AbrGetSlotSuffix(slot_index);
			strncat(response, slot + 1, chars_left);
		}
	} else if (!strcmp_l1("has-slot:", cmd)) {
		// Can't use `parse_fb_cmd_partition()` here because the
		// given name is unslotted which might not exist, e.g
		// "zircon" as opposed to "zircon_a".
		strsep(&cmd, ":");
		if (!cmd) {
			fastboot_tx_write_str("FAILmissing partition name");
			return;
		}

		char slotted_part[36];
		snprintf(slotted_part, sizeof(slotted_part), "%s_a", cmd);
		if (get_real_part_name(slotted_part)) {
			// If <part>_a exists then <part> supports slots.
			strncat(response, "yes", chars_left);
		} else if (get_real_part_name(cmd)) {
			// If only <part> exists it does not support slots.
			strncat(response, "no", chars_left);
		} else {
			// If neither exists it's an unknown partition.
			fastboot_tx_write_str("FAILunknown partition");
			return;
		}
	} else if (!strncmp("partition-size", cmd, strlen("partition-size"))) {
		char str_num[20];
		struct partitions *pPartition;
		uint64_t sz;

		const char *part = parse_fb_cmd_partition(cmd);
		if (!part) {
			return;
		}

		if (!strncmp("mbr", part, strlen("mbr"))) {
			strcpy(response, "FAILVariable not implemented");
		} else {
			if (!strcmp("bootloader", part)) {
				// boot0 and boot1 have the same size.
				mmc_boot_size("boot0", &sz);
				FB_DBG("size:%016llx\n", sz);
				sprintf(str_num, "%016llx", sz);
			} else {
				pPartition = find_mmc_partition_by_name(part);
				if (pPartition) {
					FB_DBG("size:%016llx\n", pPartition->size);
					if (strcmp(part, "data") == 0) {
						FB_DBG("reserve 0x4000 for fde data\n");
						sz = pPartition->size - 0x4000;
						FB_DBG("data size :%016llx\n", sz);
						sprintf(str_num, "%016llx", sz);
					} else {
						sprintf(str_num, "%016llx", pPartition->size);
					}
				} else {
					FB_DBG("find_mmc_partition_by_name fail\n");
					fastboot_tx_write_str(
						"FAILpartition does not exist");
					return;
				}
			}
			strncat(response, str_num, chars_left);
		}
	} else if (!strcmp_l1("partition-type:cache", cmd)) {
		if (has_boot_slot == 0) {
			strncat(response, "ext4", chars_left);
		}
	} else if (!strcmp_l1("partition-type:system", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:vendor", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:odm", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:tee", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:param", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:product", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:metadata", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strncmp("partition-type", cmd, strlen("partition-type"))) {
		strncat(response, "raw", chars_left);
	} else if (!strcmp_l1("erase-block-size", cmd) ||
		   !strcmp_l1("logical-block-size", cmd)) {
		strncat(response, "2000", chars_left);
	} else if (!strcmp_l1("secure", cmd)) {
		if (check_lock()) {
			strncat(response, "yes", chars_left);
		} else {
			strncat(response, "no", chars_left);
		}
	} else if (!strcmp_l1("unlocked", cmd)) {
		if (check_lock()) {
			strncat(response, "no", chars_left);
		} else {
			strncat(response, "yes", chars_left);
		}
	} else if (!strcmp_l1("slot-successful", cmd)) {
		strsep(&cmd, ":");
		FB_DBG("cmd is %s\n", cmd);

		AbrSlotInfo *slot_info = get_slot_info(cmd);
		if (slot_info == NULL) {
			fastboot_fail("Invalid slot suffix");
		} else {
			strncat(response,
				slot_info->is_marked_successful ? "yes" : "no",
				chars_left);
		}
	} else if (!strcmp_l1("slot-unbootable", cmd)) {
		strsep(&cmd, ":");
		FB_DBG("cmd is %s\n", cmd);

		AbrSlotInfo *slot_info = get_slot_info(cmd);
		if (slot_info == NULL) {
			fastboot_fail("Invalid slot suffix");
		} else {
			strncat(response, slot_info->is_bootable ? "no" : "yes",
				chars_left);
		}
	} else if (!strcmp_l1("slot-retry-count", cmd)) {
		strsep(&cmd, ":");
		FB_DBG("cmd is %s\n", cmd);

		AbrSlotInfo *slot_info = get_slot_info(cmd);
		if (slot_info == NULL) {
			fastboot_fail("Invalid slot suffix");
		} else {
			char buf[4];
			sprintf(buf, "%d", slot_info->num_tries_remaining);
			strncat(response, buf, chars_left);
		}
	} else if (!strcmp_l1("vx-locked", cmd)) {
		// VIM3 is dev only. We don't consider any lock/unlock feature for now.
		strncat(response, "yes", chars_left);
	} else if (!strcmp_l1("bootloader-variant", cmd)) {
		strncat(response, "dev", chars_left);
	} else if (!strcmp_l1("vx-unlockable", cmd)) {
		strncat(response, "no", chars_left);
	} else {
		error("unknown variable: %s\n", cmd);
		strcpy(response, "FAILVariable not implemented");
	}

	fastboot_tx_write_str(response);
}

static unsigned int rx_bytes_expected(void)
{
	int rx_remain = download_size - download_bytes;
	if (rx_remain < 0)
		return 0;
	if (rx_remain > EP_BUFFER_SIZE)
		return EP_BUFFER_SIZE;
	return rx_remain;
}

#define BYTES_PER_DOT	0x20000
static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)
{
	char response[RESPONSE_LEN];
	unsigned int transfer_size = download_size - download_bytes;
	const unsigned char *buffer = req->buf;
	unsigned int buffer_size = req->actual;
	unsigned int pre_dot_num, now_dot_num;

	if (req->status != 0) {
		printf("Bad status: %d\n", req->status);
		return;
	}

	if (buffer_size < transfer_size)
		transfer_size = buffer_size;

	memcpy((void *)CONFIG_USB_FASTBOOT_BUF_ADDR + download_bytes,
	       buffer, transfer_size);

	pre_dot_num = download_bytes / BYTES_PER_DOT;
	download_bytes += transfer_size;
	now_dot_num = download_bytes / BYTES_PER_DOT;

	if (pre_dot_num != now_dot_num) {
		putc('.');
		if (!(now_dot_num % 74))
			putc('\n');
	}

	/* Check if transfer is done */
	if (download_bytes >= download_size) {
		/*
		 * Reset global transfer variable, keep download_bytes because
		 * it will be used in the next possible flashing command
		 */
		download_size = 0;
		req->complete = rx_handler_command;
		req->length = EP_BUFFER_SIZE;

		sprintf(response, "OKAY");
		fastboot_tx_write_str(response);

		printf("\ndownloading of %u bytes finished\n", download_bytes);
	} else {
		req->length = rx_bytes_expected();
		if (req->length < ep->maxpacket)
			req->length = ep->maxpacket;
	}

	req->actual = 0;
	usb_ep_queue(ep, req, 0);
}

static void cb_download(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	char response[RESPONSE_LEN];

	printf("cmd cb_download is %s\n", cmd);

	strsep(&cmd, ":");
	download_size = simple_strtoul(cmd, NULL, 16);
	download_bytes = 0;

	printf("Starting download of %u bytes\n", download_size);

	if (0 == download_size) {
		sprintf(response, "FAILdata invalid size");
	} else if (download_size > ddr_size_usable(CONFIG_USB_FASTBOOT_BUF_ADDR)) {
		download_size = 0;
		sprintf(response, "FAILdata too large");
	} else {
		sprintf(response, "DATA%08x", download_size);
		req->complete = rx_handler_dl_image;
		req->length = rx_bytes_expected();
		if (req->length < ep->maxpacket)
			req->length = ep->maxpacket;
	}
	fastboot_tx_write_str(response);
}

typedef struct andr_img_hdr boot_img_hdr;

static void do_bootm_on_complete(struct usb_ep *ep, struct usb_request *req)
{
	// Performs a full USB reset to remove the fastboot interface descriptor
	run_command("usb reset", 0);

	zircon_ram_boot();

	/* This only happens if image is somehow faulty so we start over */
	printf("Failed to boot RAM image; rebooting\n");
	do_reset(NULL, 0, 0, NULL);
}

static void cb_boot(struct usb_ep *ep, struct usb_request *req)
{
	if (zircon_ram_load((const void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
			    download_bytes) != 0) {
		fastboot_tx_write_str("FAILFailed to verify boot image");
		return;
	}

	fastboot_func->in_req->complete = do_bootm_on_complete;
	fastboot_tx_write_str("OKAY");
}

static void do_exit_on_complete(struct usb_ep *ep, struct usb_request *req)
{
	// Performs a full USB reset to remove the fastboot interface descriptor
	run_command("usb reset", 0);

	puts("Booting kernel..\n");
	run_command("run storeboot", 0);

	/* This only happens if image is somehow faulty so we start over */
	do_reset(NULL, 0, 0, NULL);
}


static void cb_continue(struct usb_ep *ep, struct usb_request *req)
{
	fastboot_func->in_req->complete = do_exit_on_complete;
	fastboot_tx_write_str("OKAY");
}

static void cb_flashing(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd;
	char* response = response_str;
	char* lock_s;
	LockData_t* info;
	size_t chars_left;
	char lock_d[LOCK_DATA_SIZE];

	lock_s = getenv("lock");
	if (!lock_s) {
		printf("lock state is NULL \n");
		strcpy(lock_d, "10000000");
		lock_s = "10000000";
		setenv("lock", "10000000");
		run_command("defenv_reserv; saveenv;", 0);
	} else {
		printf("lock state: %s\n", lock_s);
		if (strlen(lock_s) > 15)
			strncpy(lock_d, lock_s, 15);
		else
			strncpy(lock_d, lock_s, strlen(lock_s));
	}

	info = malloc(sizeof(struct LockData));
	if (!info) {
		error("malloc error\n");
		fastboot_tx_write_str("FAILmalloc error");
		return;
	}
	memset(info,0,LOCK_DATA_SIZE);
	info->version_major = (int)(lock_d[0] - '0');
	info->version_minor = (int)(lock_d[1] - '0');
	info->lock_state = (int)(lock_d[4] - '0');
	info->lock_critical_state = (int)(lock_d[5] - '0');
	info->lock_bootloader = (int)(lock_d[6] - '0');
	dump_lock_info(info);

	strcpy(response, "OKAY");
	chars_left = sizeof(response_str) - strlen(response) - 1;
	cmd = req->buf;
	strsep(&cmd, " ");
	printf("cb_flashing: %s\n", cmd);
	if (!cmd) {
		error("missing variable\n");
		fastboot_tx_write_str("FAILmissing var");
		free(info);
		return;
	}

	if (!strcmp_l1("unlock_critical", cmd)) {
		info->lock_critical_state = 0;
	} else if (!strcmp_l1("lock_critical", cmd)) {
		info->lock_critical_state = 1;
	} else if (!strcmp_l1("get_unlock_ability", cmd)) {
		char str_num[8];
		sprintf(str_num, "%d", info->lock_state);
		strncat(response, str_num, chars_left);
	} else if (!strcmp_l1("get_unlock_bootloader_nonce", cmd)) {
		char str_num[8];
		sprintf(str_num, "%d", info->lock_critical_state);
		strncat(response, str_num, chars_left);
	} else if (!strcmp_l1("unlock_bootloader", cmd)) {
		strncat(response, "please run flashing unlock & flashing unlock_critical before write", chars_left);
	} else if (!strcmp_l1("lock_bootloader", cmd)) {
		info->lock_bootloader = 1;
	} else if (!strcmp_l1("unlock", cmd)) {
		if (info->lock_state == 1 ) {
			char *avb_s;
			avb_s = getenv("avb2");
			if (avb_s == NULL) {
				run_command("get_avb_mode;", 0);
				avb_s = getenv("avb2");
			}
			printf("avb2: %s\n", avb_s);
			if (strcmp(avb_s, "1") == 0) {
#ifdef CONFIG_AML_ANTIROLLBACK
				if (avb_unlock()) {
					printf("unlocking device.  Erasing userdata partition!\n");
					run_command("store erase partition data", 0);
				} else {
					printf("unlock failed!\n");
				}
#else
				printf("unlocking device.  Erasing userdata partition!\n");
				run_command("store erase partition data", 0);
#endif
			}
		}
		info->lock_state = 0;
	} else if (!strcmp_l1("lock", cmd)) {
		if (info->lock_state == 0 ) {
			char *avb_s;
			avb_s = getenv("avb2");
			if (avb_s == NULL) {
				run_command("get_avb_mode;", 0);
				avb_s = getenv("avb2");
			}
			printf("avb2: %s\n", avb_s);
			if (strcmp(avb_s, "1") == 0) {
#ifdef CONFIG_AML_ANTIROLLBACK
				if (avb_lock()) {
					printf("lock failed!\n");
				} else {
					printf("locking device.  Erasing userdata partition!\n");
					run_command("store erase partition data", 0);
				}
#else
				printf("locking device.  Erasing userdata partition!\n");
				run_command("store erase partition data", 0);
#endif
			}
		}
		info->lock_state = 1;
	} else {
		error("unknown variable: %s\n", cmd);
		strcpy(response, "FAILVariable not implemented");
	}

	dump_lock_info(info);
	sprintf(lock_d, "%d%d00%d%d%d0", info->version_major, info->version_minor, info->lock_state, info->lock_critical_state, info->lock_bootloader);
	FB_DBG("lock_d state: %s\n", lock_d);
	setenv("lock", lock_d);
	run_command("defenv_reserv; saveenv;", 0);
	FB_DBG("response: %s\n", response);
	free(info);
	fastboot_tx_write_str(response);
}

#ifdef CONFIG_FASTBOOT_FLASH
static void cb_flash(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	char* response = response_str;

	printf("cmd cb_flash is %s\n", cmd);
	const char *part = parse_fb_cmd_partition(cmd);
	if (!part) {
		return;
	}

	if (check_lock() && (get_fastboot_lock_access(part) & WRITE) == 0) {
		error("Cannot flash %s while locked\n", part);
		fastboot_tx_write_str("FAILlocked partition");
		return;
	}

#ifdef CONFIG_BOOTLOADER_CONTROL_BLOCK
	if (dynamic_partition) {
		if (is_partition_logical(part) == 0) {
			error("%s is logic partition, can not write here.......\n",
			      part);
			fastboot_tx_write_str("FAILlogic partition");
			return;
		}
	}
#endif

	//strcpy(response, "FAILno flash device defined");
	if (is_mainstorage_emmc()) {
#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
		fb_mmc_flash_write(part, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
				   download_bytes);
#endif
	} else if (is_mainstorage_nand()) {
#ifdef CONFIG_FASTBOOT_FLASH_NAND_DEV
		fb_nand_flash_write(part, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
				    download_bytes);
#else
		fastboot_fail("not support nftl\n");
#endif
	} else {
		printf("error: no valid fastboot device\n");
		fastboot_fail("no vaild device\n");
	}
	fastboot_tx_write_str(response);
}
#endif

static void cb_set_active(struct usb_ep *ep, struct usb_request *req)
{
	char *cmd = req->buf;
	int ret = 0;

	printf("cmd cb_set_active is %s\n", cmd);
	strsep(&cmd, ":");
	if (!cmd) {
		error("missing slot name\n");
		fastboot_tx_write_str("FAILmissing slot name");
		return;
	}

	AbrOps ops = GetAbrOpsFromZirconBootOps(&zb_ops);
	AbrSlotIndex slot;
	if (strcmp(cmd, "a") == 0) {
		slot = kAbrSlotIndexA;
	} else if (strcmp(cmd, "b") == 0) {
		slot = kAbrSlotIndexB;
	} else {
		printf("Cannot set slot %s active.\n", cmd);
		fastboot_tx_write_str("FAILunsupported slot");
		return;
	}

	AbrResult abr_res = AbrMarkSlotActive(&ops, slot);
	printf("abr_res = %d\n", ret);
	if (abr_res == kAbrResultOk)
		fastboot_tx_write_str("OKAY");
	else
		fastboot_tx_write_str("FAILset slot error");
}

static void cb_flashall(struct usb_ep *ep, struct usb_request *req)
{
	char* response = response_str;
	char *cmd = req->buf;

	printf("cmd cb_flashall is %s\n", cmd);

	if (check_lock()) {
		error("device is locked, can not run this cmd.Please flashing unlock & flashing unlock_critical\n");
		fastboot_tx_write_str("FAILlocked device");
		return;
	}

	//strcpy(response, "FAILno flash device defined");
	if (is_mainstorage_emmc()) {
#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
		fb_mmc_flash_write(cmd, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
				   download_bytes);
#endif
	} else if (is_mainstorage_nand()) {
#ifdef CONFIG_FASTBOOT_FLASH_NAND_DEV
		fb_nand_flash_write(cmd, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
					download_bytes);
#else
		fastboot_fail("not support nftl\n");
#endif
	} else {
		printf("error: no valid fastboot device\n");
		fastboot_fail("no vaild device\n");
	}
	fastboot_tx_write_str(response);
}

static void cb_erase(struct usb_ep *ep, struct usb_request *req)
{
	char* response = response_str;
	char *cmd = req->buf;

	// Set `send_okay` when we've previously sent an INFO response and just want
	// to finish the command with OKAY.
	//
	// Do this first, since in this case we've already parsed the command string
	// and would fail to find the partition name if we try to do it again here.
	static int send_okay = 0;
	if (send_okay) {
		send_okay = 0;
		fastboot_okay(NULL);
		fastboot_tx_write_str(response_str);
		return;
	}

	printf("cmd cb_erase is %s\n", cmd);
	const char *part = parse_fb_cmd_partition(cmd);
	if (!part) {
		return;
	}

	if (check_lock() && (get_fastboot_lock_access(part) & ERASE) == 0) {
		error("Cannot erase %s while locked\n", part);
		fastboot_tx_write_str("FAILlocked partition");
		return;
	}

	// Special case for "userdata" partition, we just ignore requests to erase
	// so that `fastboot -w` doesn't error out (b/322897225). In our case
	// flashing FVM/super automatically wipes userdata.
	if (strcmp(part, "userdata") == 0) {
		// This is a bit non-standard so send an INFO message first to alert
		// users that we're not actually erasing userdata here.
		fastboot_busy(
			"erase userdata is a no-op; flash super to wipe userdata");
		fastboot_tx_write_str(response_str);
		send_okay = 1;
		return;
	}

	//strcpy(response, "FAILno erase device defined");
	if (is_mainstorage_emmc()) {
#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
		fb_mmc_erase_write(part, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR);
#endif
	} else if (is_mainstorage_nand()) {
#ifdef CONFIG_FASTBOOT_FLASH_NAND_DEV
		fb_nand_erase(part, (void *)CONFIG_USB_FASTBOOT_BUF_ADDR);
#else
		fastboot_fail("not support nftl\n");
#endif
	} else {
		printf("error: no valid fastboot device\n");
		fastboot_fail("no vaild device\n");
	}
	fastboot_tx_write_str(response);
}

static void cb_devices(struct usb_ep *ep, struct usb_request *req)
{
	char response[RESPONSE_LEN];
	char *cmd = req->buf;

	printf("cmd is %s\n", cmd);

	strcpy(response, "AMLOGIC");

	fastboot_tx_write_str(response);
}

static void cb_oem_cmd(struct usb_ep *ep, struct usb_request *req)
{
	char response[RESPONSE_LEN/2 + 1];
	char* cmd = req->buf;
	printf("oem cmd[%s]\n", cmd);

	memcpy(response, cmd, strnlen(cmd, RESPONSE_LEN/2)+1);//+1 to terminate str
	cmd = response;
	strsep(&cmd, " ");
	FB_MSG("To run cmd[%s]\n", cmd);
	run_command(cmd, 0);

	fastboot_okay(response);
	fastboot_tx_write_str(response_str);
	return ;
}

static void cb_staged_bootloader_file(struct usb_ep *ep,
				      struct usb_request *req)
{
	char *name = req->buf;

	// skip past "oem add-staged-bootloader-file"
	if (!(strsep(&name, " ") && strsep(&name, " ") && name)) {
		fastboot_fail("No file name given");
		fastboot_tx_write_str(response_str);
		return;
	}

	if (download_bytes == 0) {
		fastboot_fail("Nothing staged");
		fastboot_tx_write_str(response_str);
		return;
	}

	if (AddBootloaderFiles(name, (const void *)CONFIG_USB_FASTBOOT_BUF_ADDR,
			       download_bytes) != ZBI_RESULT_OK) {
		fastboot_fail("Failed to add ZBI file item");
		fastboot_tx_write_str(response_str);
		return;
	}

	fastboot_okay("");
	fastboot_tx_write_str(response_str);
}

static void cb_run_staged_efi(struct usb_ep *ep, struct usb_request *req)
{
	// TODO(313510811): Figure out security verification for the binary, i.e.
	// using EFI secure boot.
	if (efi_check_pe((void *)CONFIG_USB_FASTBOOT_BUF_ADDR, download_bytes,
			 NULL) != EFI_SUCCESS) {
		fastboot_tx_write_str("FAILNo valid EFI image staged");
		return;
	}

	char cmd[128];
	snprintf(cmd, sizeof(cmd), "bootefi 0x%x:0x%x ${dtb_mem_addr}",
		 CONFIG_USB_FASTBOOT_BUF_ADDR, download_bytes);
	if (run_command(cmd, 0)) {
		fastboot_tx_write_str("FAILFailed to run EFI binary");
	} else {
		fastboot_tx_write_str("OKAY");
	}
}

struct cmd_dispatch_info {
	char *cmd;
	void (*cb)(struct usb_ep *ep, struct usb_request *req);
};

static const struct cmd_dispatch_info cmd_dispatch_info[] = {
	{
		// Due to command prefix matching, this catches all the
		// reboot* commands.
		.cmd = "reboot",
		.cb = cb_reboot,
	},
	{
		.cmd = "getvar:",
		.cb = cb_getvar,
	},
	{
		.cmd = "download:",
		.cb = cb_download,
	},
	{
		.cmd = "boot",
		.cb = cb_boot,
	},
	{
		.cmd = "continue",
		.cb = cb_continue,
	},
	{
		.cmd = "flashing",
		.cb = cb_flashing,
	},
#ifdef CONFIG_FASTBOOT_FLASH
	{
		.cmd = "flash",
		.cb = cb_flash,
	},
#endif
	{
		.cmd = "update",
		.cb = cb_download,
	},
	{
		.cmd = "flashall",
		.cb = cb_flashall,
	},
	{
		.cmd = "erase",
		.cb = cb_erase,
	},
	{
		.cmd = "devices",
		.cb = cb_devices,
	},
	{
		.cmd = "set_active",
		.cb = cb_set_active,
	},
	{
		.cmd = "oem add-staged-bootloader-file",
		.cb = cb_staged_bootloader_file,
	},
	{
		.cmd = "oem run-staged-efi",
		.cb = cb_run_staged_efi,
	},
	{
		.cmd = "oem",
		.cb = cb_oem_cmd,
	}
};

//cb for out_req->complete
static void rx_handler_command(struct usb_ep *ep, struct usb_request *req)
{
	char *cmdbuf = req->buf;
	void (*func_cb)(struct usb_ep *ep, struct usb_request *req) = NULL;
	int i;

	for (i = 0; i < ARRAY_SIZE(cmd_dispatch_info); i++) {
		if (!strcmp_l1(cmd_dispatch_info[i].cmd, cmdbuf)) {
			func_cb = cmd_dispatch_info[i].cb;
			break;
		}
	}

	if (!func_cb) {
		error("unknown command: %s\n", cmdbuf);
		fastboot_tx_write_str("FAILunknown command");
	} else {
		if (req->actual < req->length) {
			u8 *buf = (u8 *)req->buf;
			buf[req->actual] = 0;
			func_cb(ep, req);
		} else {
			error("buffer overflow\n");
			fastboot_tx_write_str("FAILbuffer overflow");
		}
	}

	if (req->status == 0 && !fastboot_is_busy()) {
		*cmdbuf = '\0';
		req->actual = 0;
		usb_ep_queue(ep, req, 0);
	}
}
