[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/lib/libc/scanf.c b/src/bsp/lk/lib/libc/scanf.c
new file mode 100644
index 0000000..b3d4cd7
--- /dev/null
+++ b/src/bsp/lk/lib/libc/scanf.c
@@ -0,0 +1,243 @@
+/*
+ * Copyright (c) 2020 MediaTek Inc.
+ *
+ * Use of this source code is governed by a MIT-style
+ * license that can be found in the LICENSE file or at
+ * https://opensource.org/licenses/MIT
+ */
+
+#include <assert.h>
+#include <ctype.h>
+#include <debug.h>
+#include <limits.h>
+#include <platform/debug.h>
+#include <printf.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <trace.h>
+
+#define LOCAL_TRACE 0
+
+#define FLAG_SHORT      (0x1 << 2)
+#define FLAG_INT        (0x1 << 3)
+
+static int xchar_to_int(char c)
+{
+    if (isdigit(c))
+        return c - '0';
+    else if (c >= 'a' && c <= 'f')
+        return 10 + c - 'a';
+    else if (c >= 'A' && c <= 'F')
+        return 10 + c - 'A';
+    else
+        return 0;   // not xdigit: return 0!
+}
+
+static int get_int(const char **buf, int *val)
+{
+    const char *p = *buf;
+    int i = 0;
+    int err = -1;
+    int sign = 0;
+
+    // ignore blank
+    while (isspace(*p)) {
+        ++p;
+    }
+
+    if (*p == '+')
+        ++p;
+    else if (*p == '-') {
+        sign = 1;
+        ++p;
+    }
+
+    while (1) {
+        char c = *p;
+
+        if (isdigit(c)) {
+            i = i * 10 + (c - '0');
+            err = 0;        // find at least one digit
+
+            LTRACEF("buf:%s, i:%d, c:%c\n", p, i, c);
+
+            ++p;
+            continue;
+        } else {
+            if (err == -1)
+                return -1;
+
+            *buf = p;
+
+            *val = sign ? -i : i;
+            break;
+        }
+    }
+
+    return 0;
+}
+
+static int get_hex_int(const char **buf)
+{
+    const char *p = *buf;
+    int i = 0;
+    int err = -1;
+    int found_hex_prefix = 0, ignore_hex_prefix = 0;
+
+    // ignore blank
+    while (isspace(*p)) {
+        ++p;
+    }
+
+    while (1) {
+        char c = *p;
+
+        if (isspace(c)) {
+            *buf = p;
+            break;
+        }
+
+        // hex prefix
+        if (!ignore_hex_prefix && !found_hex_prefix && c == '0') {
+            c = *++p;
+            if (c == 'x' || c == 'X') {
+                found_hex_prefix = 1;
+                ignore_hex_prefix = 1;
+                ++p;
+                continue;
+            } else if (isxdigit(c)) {
+                i = i * 16 + (xchar_to_int(c));
+                ignore_hex_prefix = 1;
+                ++p;
+            } else
+                goto error;
+        }
+
+        if (isxdigit(c)) {
+            i = i * 16 + xchar_to_int(c);
+            ignore_hex_prefix = 1;
+            err = 0;        // find at least one digit
+
+            LTRACEF("buf:%s, i:0x%x, c:%c\n", p, i, c);
+
+            ++p;
+            continue;
+        } else if (err == 0)
+            break;
+        else
+            goto error;
+    }
+
+    if (err == 0)
+        *buf = p;
+    return i;
+
+error:
+    return -1;
+}
+
+/* support interger scanf  */
+static int vsscanf(const char *buf, const char *fmt, va_list ap)
+{
+    int err = 0;
+    char c;
+    size_t item;
+    int n;
+    int *p;
+    char *pch;
+    short *psh;
+    int flag;
+
+    item = 0;
+    flag = FLAG_INT;
+
+    for (;;) {
+        while ((c = *fmt++) != 0) {
+            if (isspace(c))
+                continue;
+
+            if (c == '%')
+                break;
+            else {
+                while (isspace(*buf)) {
+                    ++buf;
+                }
+                if (c != *buf)
+                    return 0;
+
+                ++buf;
+            }
+        }
+
+        /* make sure we haven't just hit the end of the string */
+        if (c == 0)
+            break;
+
+        c = *fmt++;
+        if (c == 0)
+            break;
+
+format_continue:
+        switch (c) {
+            case 'h':   /* short interger: %hd */
+                flag = FLAG_SHORT;
+                c = *fmt++;
+                goto format_continue;
+            case 'd':   /* interger: %d */
+                if (flag == FLAG_SHORT)
+                    psh = va_arg(ap, short *);
+                else
+                    p = va_arg(ap, int *);
+
+                err = get_int(&buf, &n);
+
+                if (err < 0)
+                    goto exit;
+
+                if (flag == FLAG_SHORT)
+                    *psh = n;
+                else
+                    *p = n;
+                item++;
+                break;
+
+            case 'x':  /* hex interger */
+            case 'X':
+                p = va_arg(ap, int *);
+
+                n = get_hex_int(&buf);
+
+                if (n < 0)
+                    goto exit;
+
+                *p = n;
+                item++;
+                break;
+
+            default:
+                err = -1;
+                break;
+        }
+
+        continue;
+    }
+
+exit:
+    return (err < 0) ? 0 : (int)item;
+}
+
+// a simple sscanf: %d, %x
+int sscanf(const char *buf, const char *fmt, ...)
+{
+    va_list ap;
+    int err;
+
+    va_start(ap, fmt);
+    err = vsscanf(buf, fmt, ap);
+    va_end(ap);
+
+    return err;
+}
+