[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/app/usbtest/usbtest.c b/src/bsp/lk/app/usbtest/usbtest.c
new file mode 100644
index 0000000..db2b218
--- /dev/null
+++ b/src/bsp/lk/app/usbtest/usbtest.c
@@ -0,0 +1,129 @@
+#include <app.h>
+#include <debug.h>
+#include <err.h>
+#include <string.h>
+#include <stdlib.h>
+#include <dev/usb.h>
+#include <dev/usbc.h>
+#include <kernel/debug.h>
+#include <kernel/thread.h>
+#include <kernel/event.h>
+
+#define LOCAL_TRACE 1
+
+extern void usbtest_usb_setup(void);
+
+static status_t rx_callback(ep_t endpoint, struct usbc_transfer *transfer);
+static usbc_transfer_t rx;
+static uint8_t rxbuf[4096];
+static volatile bool rxqueued;
+
+static status_t tx_callback(ep_t endpoint, struct usbc_transfer *transfer);
+static usbc_transfer_t tx;
+static uint8_t txbuf[4095];
+static volatile bool txqueued;
+
+static event_t testevent;
+
+/* RX */
+static void queue_rx_transfer(void)
+{
+ rx.callback = rx_callback;
+ rx.result = 0;
+ rx.buf = rxbuf;
+ rx.buflen = sizeof(rxbuf);
+ rx.bufpos = 0;
+ rx.extra = NULL;
+
+ memset(rxbuf, 0x99, sizeof(rxbuf));
+
+ rxqueued = true;
+ usbc_queue_rx(1, &rx);
+}
+
+static status_t rx_callback(ep_t endpoint, struct usbc_transfer *transfer)
+{
+ LTRACEF("ep %u, transfer %p\n", endpoint, transfer);
+
+ rxqueued = false;
+ event_signal(&testevent, false);
+
+ return NO_ERROR;
+}
+
+/* TX */
+static void queue_tx_transfer(void)
+{
+ tx.callback = tx_callback;
+ tx.result = 0;
+ tx.buf = txbuf;
+ tx.buflen = sizeof(txbuf);
+ tx.bufpos = 0;
+ tx.extra = NULL;
+
+ for (uint i = 0; i < sizeof(txbuf); i++)
+ txbuf[i] = i * 3;
+
+ txqueued = true;
+ usbc_queue_tx(1, &tx);
+}
+
+static status_t tx_callback(ep_t endpoint, struct usbc_transfer *transfer)
+{
+ LTRACEF("ep %u, transfer %p\n", endpoint, transfer);
+
+ txqueued = false;
+ event_signal(&testevent, false);
+
+ return NO_ERROR;
+}
+
+static void usbtest_init(const struct app_descriptor *app)
+{
+ LTRACE_ENTRY;
+ event_init(&testevent, false, EVENT_FLAG_AUTOUNSIGNAL);
+ usbtest_usb_setup();
+ LTRACE_EXIT;
+}
+
+static void usbtest_entry(const struct app_descriptor *app, void *args)
+{
+ LTRACE_ENTRY;
+
+ TRACEF("starting usb stack\n");
+ usb_start();
+
+ // XXX get callback from stack
+ thread_sleep(2000);
+
+ TRACEF("queuing transfers\n");
+ queue_rx_transfer();
+ queue_tx_transfer();
+
+ while (event_wait(&testevent) == NO_ERROR) {
+ if (!rxqueued) {
+ /* dump the state of the transfer */
+ LTRACEF("rx transfer completed\n");
+ usbc_dump_transfer(&rx);
+ hexdump8(rx.buf, MIN(128, rx.bufpos));
+
+ queue_rx_transfer();
+ }
+ if (!txqueued) {
+ /* dump the state of the transfer */
+ LTRACEF("tx transfer completed\n");
+ usbc_dump_transfer(&tx);
+
+ queue_tx_transfer();
+ }
+ }
+
+ LTRACE_EXIT;
+}
+
+APP_START(usbtest)
+ .init = usbtest_init,
+ .entry = usbtest_entry,
+APP_END
+
+