/*
 * (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 },
	// Upstream code also aliases userdata -> data and dts -> dtb, but we
	// don't need these 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");
					sprintf(str_num, "get fail");
				}
			}
			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:data", cmd)) {
		strncat(response, "ext4", chars_left);
	} else if (!strcmp_l1("partition-type:userdata", cmd)) {
		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)
{
	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)
{
	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;

	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;
	}

	//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);
	}
}
