[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/lib/fastboot/ext_boot.c b/src/bsp/lk/lib/fastboot/ext_boot.c
new file mode 100644
index 0000000..b2b3e9e
--- /dev/null
+++ b/src/bsp/lk/lib/fastboot/ext_boot.c
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2016 MediaTek Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files
+ * (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Software,
+ * and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <dev/udc.h>
+#include <lib/bio.h>
+#include <lib/dl_commands.h>
+#include <lib/fastboot.h>
+#include <lib/fastboot_oem_cmd.h>
+#include <lib/mempool.h>
+#include <platform/mtk_serial_key.h>
+#include <platform/mtk_wdt.h>
+#include <reg.h>
+#include <stdio.h>
+#include <string.h>
+#include <target/cust_usb.h>
+
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+#ifndef SN_BUF_LEN
+#define SN_BUF_LEN 19 /* fastboot use 13 bytes as default, max is 19 */
+#endif
+#define DEFAULT_SERIAL_NUM "0123456789ABCDEF"
+char sn_buf[SN_BUF_LEN+1] = DEFAULT_SERIAL_NUM;
+
+static struct udc_device surf_udc_device = {
+ .vendor_id = USB_VENDORID,
+ .product_id = USB_PRODUCTID,
+ .version_id = USB_VERSIONID,
+ .manufacturer = USB_MANUFACTURER,
+ .product = USB_PRODUCT_NAME,
+};
+
+static void register_commands(void)
+{
+ fastboot_register("getvar:", cmd_getvar);
+ fastboot_register("download:", cmd_download);
+ fastboot_register("flash:", cmd_flash);
+ fastboot_register("erase:", cmd_erase);
+ fastboot_register("reboot", cmd_reboot);
+ fastboot_register("reboot-bootloader", cmd_reboot_bootloader);
+ fastboot_register("reboot-fastboot", cmd_reboot_fastbootd);
+ fastboot_register("oem reboot-recovery", cmd_reboot_recovery);
+ fastboot_register("oem continue", cmd_continue_boot);
+#ifdef AVB_ENABLE_DEVICE_STATE_CHANGE
+ fastboot_register("flashing", cmd_flashing);
+#endif
+}
+
+static void register_oem_fastboot_cmds(void)
+{
+ extern const struct fastboot_oem_cmd_descriptor __fb_oem_cmd_start[];
+ extern const struct fastboot_oem_cmd_descriptor __fb_oem_cmd_end[];
+
+ const struct fastboot_oem_cmd_descriptor *cmd;
+
+ for (cmd = __fb_oem_cmd_start; cmd != __fb_oem_cmd_end; cmd++) {
+ if (cmd->cmd_handler)
+ fastboot_register(cmd->cmd_str, cmd->cmd_handler);
+ }
+}
+
+static void publish_attributes(void)
+{
+ char buffer_size[11];
+ sprintf(buffer_size, "0x%x", SCRATCH_SIZE);
+ fastboot_publish("version", "0.5");
+ fastboot_publish("max-download-size", buffer_size);
+ fastboot_publish("is-userspace", "no");
+}
+
+static void storage_init(void)
+{
+ /* init storage that only use in fastboot, currently none */
+ bio_dump_devices();
+}
+
+static char udc_chr[32] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ456789"};
+static int get_serial(u64 hwkey, u32 chipid, char *ser)
+{
+ u16 hashkey[4];
+ u32 idx, ser_idx;
+
+ /* split to 4 key with 16-bit width each */
+ for (idx = 0; idx < ARRAY_SIZE(hashkey); idx++) {
+ hashkey[idx] = (u16)(hwkey & 0xffff);
+ hwkey >>= 16;
+ }
+
+ /* hash the key with chip id */
+ for (idx = 0; idx < ARRAY_SIZE(hashkey); idx++) {
+ u32 digit = (chipid % 10);
+ hashkey[idx] = (hashkey[idx] >> digit) | (hashkey[idx] << (16-digit));
+ chipid = (chipid / 10);
+ }
+
+ /* generate serail using hashkey */
+ ser_idx = 0;
+ for (idx = 0; idx < ARRAY_SIZE(hashkey); idx++) {
+ ser[ser_idx++] = (hashkey[idx] & 0x001f);
+ ser[ser_idx++] = (hashkey[idx] & 0x00f8) >> 3;
+ ser[ser_idx++] = (hashkey[idx] & 0x1f00) >> 8;
+ ser[ser_idx++] = (hashkey[idx] & 0xf800) >> 11;
+ }
+
+ for (idx = 0; idx < ser_idx; idx++)
+ ser[idx] = udc_chr[(int)ser[idx]];
+
+ ser[ser_idx] = 0x00;
+
+ return 0;
+}
+
+void ext_boot(void)
+{
+ void *scratch_buf;
+
+ u64 key = ((u64)readl(SERIAL_KEY_HI) << 32) | readl(SERIAL_KEY_LO);
+ if (key != 0)
+ get_serial(key, MACH_TYPE, sn_buf);
+
+ surf_udc_device.serialno = sn_buf;
+ udc_init(&surf_udc_device);
+
+ storage_init();
+ mtk_wdt_disable();
+ register_commands();
+ register_oem_fastboot_cmds();
+ publish_attributes();
+
+ scratch_buf = mempool_alloc(SCRATCH_SIZE, MEMPOOL_ANY);
+
+ if (!scratch_buf)
+ return;
+
+ fastboot_init(scratch_buf, (unsigned long long)SCRATCH_SIZE);
+ mempool_free(scratch_buf);
+}