[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
+
+