[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/lib/minip/lk_console.c b/src/bsp/lk/lib/minip/lk_console.c
new file mode 100644
index 0000000..76ac156
--- /dev/null
+++ b/src/bsp/lk/lib/minip/lk_console.c
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2014 Chris Anderson
+ *
+ * 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 "minip-internal.h"
+
+#include <lib/console.h>
+#include <kernel/thread.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <platform.h>
+#include <kernel/timer.h>
+#include <err.h>
+
+#if WITH_LIB_CONSOLE
+
+uint32_t str_ip_to_int(const char *s, size_t len)
+{
+    uint8_t ip[4] = { 0, 0, 0, 0 };
+    uint8_t pos = 0, i = 0;
+
+    while (pos < len) {
+        char c = s[pos];
+        if (c == '.') {
+            i++;
+        } else {
+            ip[i] *= 10;
+            ip[i] += c - '0';
+        }
+        pos++;
+    }
+
+    return IPV4_PACK(ip);
+}
+
+void arp_usage(void) {
+    printf("arp list                        print arp table\n");
+    printf("arp query <ipv4 address>        query arp address\n");
+}
+
+static int cmd_arp(int argc, const cmd_args *argv)
+{
+    const char *cmd;
+
+    if (argc == 1) {
+        arp_usage();
+        return -1;
+    }
+
+    cmd = argv[1].str;
+    if (argc == 2 && strncmp(cmd, "list", sizeof("list")) == 0) {
+        arp_cache_dump();
+    } else if (argc == 3 && strncmp(cmd, "query", sizeof("query")) == 0) {
+        const char *addr_s = argv[2].str;
+        uint32_t addr = str_ip_to_int(addr_s, strlen(addr_s));
+
+        arp_send_request(addr);
+    } else {
+        arp_usage();
+    }
+
+    return 0;
+}
+
+static int cmd_minip(int argc, const cmd_args *argv)
+{
+    if (argc == 1) {
+minip_usage:
+        printf("minip commands\n");
+        printf("mi [a]rp                        dump arp table\n");
+        printf("mi [s]tatus                     print ip status\n");
+        printf("mi [t]est [dest] [port] [cnt]   send <cnt> test packets to the dest:port\n");
+    } else {
+        switch(argv[1].str[0]) {
+
+            case 'a':
+                arp_cache_dump();
+                break;
+
+            case 's': {
+                uint32_t ipaddr = minip_get_ipaddr();
+
+                printf("hostname: %s\n", minip_get_hostname());
+                printf("ip: %u.%u.%u.%u\n", IPV4_SPLIT(ipaddr));
+            }
+            break;
+            case 't': {
+                uint32_t count = 1;
+                uint32_t host = 0x0100000A; // 10.0.0.1
+                uint32_t port = 1025;
+                udp_socket_t *handle;
+
+                switch (argc) {
+                    case 5:
+                        count = argv[4].u;
+                    case 4:
+                        port = argv[3].u;
+                    case 3:
+                        host = str_ip_to_int(argv[2].str, strlen(argv[2].str));
+                        break;
+                }
+
+                if (udp_open(host, port, port, &handle) != NO_ERROR) {
+                    printf("udp_open to %u.%u.%u.%u:%u failed\n", IPV4_SPLIT(host), port);
+                    return -1;
+                }
+
+#define BUFSIZE 1470
+                uint8_t *buf;
+
+                buf = malloc(BUFSIZE);
+                if (!buf) {
+                    udp_close(handle);
+                    return -1;
+                }
+
+                memset(buf, 0x00, BUFSIZE);
+                printf("sending %u packet(s) to %u.%u.%u.%u:%u\n", count, IPV4_SPLIT(host), port);
+
+                lk_time_t t = current_time();
+                uint32_t failures = 0;
+                for (uint32_t i = 0; i < count; i++) {
+                    if (udp_send(buf, BUFSIZE, handle) != 0) {
+                        failures++;
+                    }
+                    buf[128]++;
+                }
+                t = current_time() - t;
+                printf("%d pkts failed\n", failures);
+                uint64_t total_count = (uint64_t)count * BUFSIZE;
+                printf("wrote %llu bytes in %u msecs (%llu bytes/sec)\n",
+                    total_count, (uint32_t)t, total_count * 1000 / t);
+
+                free(buf);
+                udp_close(handle);
+#undef BUFSIZE
+            }
+            break;
+        default:
+            goto minip_usage;
+        }
+    }
+
+    return 0;
+}
+
+STATIC_COMMAND_START
+STATIC_COMMAND("arp", "arp commands", &cmd_arp)
+STATIC_COMMAND("mi", "minip commands", &cmd_minip)
+STATIC_COMMAND_END(minip);
+#endif
+
+// vim: set ts=4 sw=4 expandtab: