[Feature]add MT2731_MP2_MR2_SVN388 baseline version
Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/bsp/lk/lib/debug/debug.c b/src/bsp/lk/lib/debug/debug.c
new file mode 100644
index 0000000..82ffdb8
--- /dev/null
+++ b/src/bsp/lk/lib/debug/debug.c
@@ -0,0 +1,278 @@
+/*
+ * Copyright (c) 2008-2015 Travis Geiselbrecht
+ *
+ * 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 <ctype.h>
+#include <debug.h>
+#include <stdlib.h>
+#include <printf.h>
+#include <stdio.h>
+#include <list.h>
+#include <string.h>
+#include <arch/ops.h>
+#include <platform.h>
+#include <platform/debug.h>
+#include <kernel/thread.h>
+
+#if !DISABLE_DEBUG_OUTPUT
+static int _dvprintf(const char *fmt, va_list ap);
+#else
+static inline int _dvprintf(const char *fmt, va_list ap) { return 0; }
+#endif
+
+#if WITH_LIB_SM
+#define PRINT_LOCK_FLAGS SPIN_LOCK_FLAG_IRQ_FIQ
+#else
+#define PRINT_LOCK_FLAGS SPIN_LOCK_FLAG_INTERRUPTS
+#endif
+
+static spin_lock_t print_spin_lock = 0;
+static struct list_node print_callbacks = LIST_INITIAL_VALUE(print_callbacks);
+
+/* print lock must be held when invoking out, outs, outc */
+static void out_count(const char *str, size_t len)
+{
+ print_callback_t *cb;
+ size_t i;
+
+ /* print to any registered loggers */
+ if (!list_is_empty(&print_callbacks)) {
+ spin_lock_saved_state_t state;
+ spin_lock_save(&print_spin_lock, &state, PRINT_LOCK_FLAGS);
+
+ list_for_every_entry(&print_callbacks, cb, print_callback_t, entry) {
+ if (cb->print)
+ cb->print(cb, str, len);
+ }
+
+ spin_unlock_restore(&print_spin_lock, state, PRINT_LOCK_FLAGS);
+ }
+
+ /* write out the serial port */
+ for (i = 0; i < len; i++) {
+ platform_dputc(str[i]);
+ }
+}
+
+void register_print_callback(print_callback_t *cb)
+{
+ spin_lock_saved_state_t state;
+ spin_lock_save(&print_spin_lock, &state, PRINT_LOCK_FLAGS);
+
+ list_add_head(&print_callbacks, &cb->entry);
+
+ spin_unlock_restore(&print_spin_lock, state, PRINT_LOCK_FLAGS);
+}
+
+void unregister_print_callback(print_callback_t *cb)
+{
+ spin_lock_saved_state_t state;
+ spin_lock_save(&print_spin_lock, &state, PRINT_LOCK_FLAGS);
+
+ list_delete(&cb->entry);
+
+ spin_unlock_restore(&print_spin_lock, state, PRINT_LOCK_FLAGS);
+}
+
+void spin(uint32_t usecs)
+{
+ lk_bigtime_t start = current_time_hires();
+
+ while ((current_time_hires() - start) < usecs)
+ ;
+}
+
+void _panic(void *caller, const char *fmt, ...)
+{
+ dprintf(ALWAYS, "panic (caller %p): ", caller);
+
+ va_list ap;
+ va_start(ap, fmt);
+ _dvprintf(fmt, ap);
+ va_end(ap);
+
+ platform_halt(HALT_ACTION_HALT, HALT_REASON_SW_PANIC);
+}
+
+static int __debug_stdio_fputc(void *ctx, int c)
+{
+ char x = c;
+ out_count(&x, 1);
+ return c;
+}
+
+static int __debug_stdio_fputs(void *ctx, const char *s)
+{
+ out_count(s, strlen(s));
+ return 0;
+}
+
+static int __debug_stdio_fgetc(void *ctx)
+{
+ char c;
+ int err;
+
+ err = platform_dgetc(&c, true);
+ if (err < 0)
+ return err;
+ return (unsigned char)c;
+}
+
+static int __panic_stdio_fgetc(void *ctx)
+{
+ char c;
+ int err;
+
+ err = platform_pgetc(&c, false);
+ if (err < 0)
+ return err;
+ return (unsigned char)c;
+}
+
+static int __debug_stdio_vfprintf(void *ctx, const char *fmt, va_list ap)
+{
+ return _dvprintf(fmt, ap);
+}
+
+#define DEFINE_STDIO_DESC(id) \
+ [(id)] = { \
+ .ctx = &__stdio_FILEs[(id)], \
+ .fputc = __debug_stdio_fputc, \
+ .fputs = __debug_stdio_fputs, \
+ .fgetc = __debug_stdio_fgetc, \
+ .vfprintf = __debug_stdio_vfprintf, \
+ }
+
+FILE __stdio_FILEs[3] = {
+ DEFINE_STDIO_DESC(0), /* stdin */
+ DEFINE_STDIO_DESC(1), /* stdout */
+ DEFINE_STDIO_DESC(2), /* stderr */
+};
+#undef DEFINE_STDIO_DESC
+
+FILE get_panic_fd(void)
+{
+ FILE panic_fd;
+ panic_fd.fgetc = __panic_stdio_fgetc;
+
+ panic_fd.fputc = __debug_stdio_fputc;
+ panic_fd.fputs = __debug_stdio_fputs;
+ panic_fd.vfprintf = __debug_stdio_vfprintf;
+ return panic_fd;
+}
+
+#if !DISABLE_DEBUG_OUTPUT
+
+static int _dprintf_output_func(const char *str, size_t len, void *state)
+{
+ out_count(str, len);
+ return len;
+}
+
+int _dvprintf(const char *fmt, va_list ap)
+{
+ return _printf_engine(&_dprintf_output_func, NULL, fmt, ap);
+}
+
+int _dprintf(const char *fmt, ...)
+{
+ int err;
+ va_list ap;
+
+ va_start(ap, fmt);
+ err = _printf_engine(&_dprintf_output_func, NULL, fmt, ap);
+ va_end(ap);
+
+ return err;
+}
+
+void hexdump(const void *ptr, size_t len)
+{
+ addr_t address = (addr_t)ptr;
+ size_t count;
+
+ for (count = 0 ; count < len; count += 16) {
+ union {
+ uint32_t buf[4];
+ uint8_t cbuf[16];
+ } u;
+ size_t s = ROUNDUP(MIN(len - count, 16), 4);
+ size_t i;
+
+ printf("0x%08lx: ", address);
+ for (i = 0; i < s / 4; i++) {
+ u.buf[i] = ((const uint32_t *)address)[i];
+ printf("%08x ", u.buf[i]);
+ }
+ for (; i < 4; i++) {
+ printf(" ");
+ }
+ printf("|");
+
+ for (i=0; i < 16; i++) {
+ char c = u.cbuf[i];
+ if (i < s && isprint(c)) {
+ printf("%c", c);
+ } else {
+ printf(".");
+ }
+ }
+ printf("|\n");
+ address += 16;
+ }
+}
+
+void hexdump8_ex(const void *ptr, size_t len, uint64_t disp_addr)
+{
+ addr_t address = (addr_t)ptr;
+ size_t count;
+ size_t i;
+ const char* addr_fmt = ((disp_addr + len) > 0xFFFFFFFF)
+ ? "0x%016llx: "
+ : "0x%08llx: ";
+
+ for (count = 0 ; count < len; count += 16) {
+ printf(addr_fmt, disp_addr + count);
+
+ for (i=0; i < MIN(len - count, 16); i++) {
+ printf("%02hhx ", *(const uint8_t *)(address + i));
+ }
+
+ for (; i < 16; i++) {
+ printf(" ");
+ }
+
+ printf("|");
+
+ for (i=0; i < MIN(len - count, 16); i++) {
+ char c = ((const char *)address)[i];
+ printf("%c", isprint(c) ? c : '.');
+ }
+
+ printf("\n");
+ address += 16;
+ }
+}
+
+#endif // !DISABLE_DEBUG_OUTPUT
+
+// vim: set noexpandtab:
diff --git a/src/bsp/lk/lib/debug/rules.mk b/src/bsp/lk/lib/debug/rules.mk
new file mode 100644
index 0000000..8f67f00
--- /dev/null
+++ b/src/bsp/lk/lib/debug/rules.mk
@@ -0,0 +1,8 @@
+LOCAL_DIR := $(GET_LOCAL_DIR)
+
+MODULE := $(LOCAL_DIR)
+
+MODULE_SRCS += \
+ $(LOCAL_DIR)/debug.c
+
+include make/module.mk