[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/app/mdebug/mdebug.c b/src/bsp/lk/app/mdebug/mdebug.c
new file mode 100644
index 0000000..f186f39
--- /dev/null
+++ b/src/bsp/lk/app/mdebug/mdebug.c
@@ -0,0 +1,160 @@
+/* mdebug.c
+ *
+ * Copyright 2015 Brian Swetland <swetland@frotz.net>
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <app.h>
+#include <debug.h>
+#include <string.h>
+#include <stdlib.h>
+#include <printf.h>
+#include <dev/udc.h>
+
+#include <platform.h>
+#include <arch/arm.h>
+#include <kernel/thread.h>
+#include <kernel/event.h>
+
+#include <platform/lpc43xx-gpio.h>
+
+#include "swd.h"
+
+#define TX_AHEAD 1
+
+static event_t txevt = EVENT_INITIAL_VALUE(txevt, TX_AHEAD, 0);
+static event_t rxevt = EVENT_INITIAL_VALUE(rxevt, 0, 0);
+
+static udc_request_t *txreq;
+static udc_request_t *rxreq;
+static udc_endpoint_t *txept;
+static udc_endpoint_t *rxept;
+
+static volatile int online;
+static volatile int txstatus;
+static volatile int rxstatus;
+static volatile int rxactual;
+
+static void mdebug_notify(udc_gadget_t *gadget, unsigned event) {
+	if (event == UDC_EVENT_ONLINE) {
+		online = 1;
+	} else {
+		online = 0;
+	}
+}
+
+static void rx_complete(udc_request_t *req, unsigned actual, int status) {
+	rxactual = actual;
+	rxstatus = status;
+	event_signal(&rxevt, 0);
+}
+
+static void tx_complete(udc_request_t *req, unsigned actual, int status) {
+	txstatus = status;
+	event_signal(&txevt, 0);
+}
+
+#if TX_AHEAD
+void usb_xmit(void *data, unsigned len) {
+	event_wait(&txevt);
+	event_unsignal(&txevt);
+	txreq->buffer = data;
+	txreq->length = len;
+	txstatus = 1;
+	if (udc_request_queue(txept, txreq)) {
+		printf("txqf\n");
+		event_signal(&txevt, 0);
+	}
+}
+#else
+void usb_xmit(void *data, unsigned len) {
+	event_unsignal(&txevt);
+	txreq->buffer = data;
+	txreq->length = len;
+	txstatus = 1;
+	if (udc_request_queue(txept, txreq) == 0) {
+		event_wait(&txevt);
+	}
+}
+#endif
+
+int usb_recv(void *data, unsigned len) {
+	event_unsignal(&rxevt);
+	rxreq->buffer = data;
+	rxreq->length = len;
+	rxstatus = 1;
+	if (udc_request_queue(rxept, rxreq)) {
+		printf("rxqf\n");
+		return -1;
+	}
+	event_wait(&rxevt);
+	return rxstatus ? rxstatus : rxactual;
+}
+
+static udc_device_t mdebug_device = {
+	.vendor_id = 0x1209,
+	.product_id = 0x5038,
+	.version_id = 0x0100,
+};
+
+static udc_endpoint_t *mdebug_endpoints[2];
+
+static udc_gadget_t mdebug_gadget = {
+	.notify = mdebug_notify,
+	.ifc_class = 0xFF,
+	.ifc_subclass = 0xFF,
+	.ifc_protocol = 0xFF,
+	.ifc_endpoints = 2,
+	.ept = mdebug_endpoints,
+};
+
+static void mdebug_init(const struct app_descriptor *app)
+{
+	swd_init();
+
+	udc_init(&mdebug_device);
+	mdebug_endpoints[0] = txept = udc_endpoint_alloc(UDC_BULK_IN, 512);
+	mdebug_endpoints[1] = rxept = udc_endpoint_alloc(UDC_BULK_OUT, 512);
+	txreq = udc_request_alloc();
+	rxreq = udc_request_alloc();
+	rxreq->complete = rx_complete;
+	txreq->complete = tx_complete;
+	udc_register_gadget(&mdebug_gadget);
+}
+
+void handle_rswd(void);
+void swo_init(udc_endpoint_t *ept);
+void swo_config(unsigned mhz);
+
+static void mdebug_entry(const struct app_descriptor *app, void *args)
+{
+	udc_start();
+	swo_init(txept);
+	swo_config(6000000);
+
+	for (;;) {
+		if (!online) {
+			thread_yield();
+			continue;
+		}
+		handle_rswd();
+	}
+}
+
+APP_START(usbtest)
+	.init = mdebug_init,
+	.entry = mdebug_entry,
+APP_END
+
+