summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m68k/ods68302/startup/debugport.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/m68k/ods68302/startup/debugport.c')
-rw-r--r--c/src/lib/libbsp/m68k/ods68302/startup/debugport.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/m68k/ods68302/startup/debugport.c b/c/src/lib/libbsp/m68k/ods68302/startup/debugport.c
new file mode 100644
index 0000000000..b4616152a3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/ods68302/startup/debugport.c
@@ -0,0 +1,163 @@
+/*****************************************************************************/
+/*
+ High Level Debug Port Functions
+
+ $Id$
+
+ */
+/*****************************************************************************/
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "debugport.h"
+#include "m68302scc.h"
+#include "bsp.h"
+
+static int initialised;
+
+void debug_port_initialise(void)
+{
+ scc_initialise(CONSOLE_PORT, CONSOLE_BAUD, FALSE);
+#if defined(DEBUG_PORT)
+ scc_initialise(DEBUG_PORT, DEBUG_BAUD, FALSE);
+#endif
+}
+
+unsigned char debug_port_status(const unsigned char status)
+{
+ if (!initialised)
+ {
+ initialised = 1;
+ debug_port_initialise();
+ }
+
+ return scc_status(CONSOLE_PORT, status);
+}
+
+unsigned char debug_port_in(void)
+{
+ if (!initialised)
+ {
+ initialised = 1;
+ debug_port_initialise();
+ }
+
+ return scc_in(CONSOLE_PORT);
+}
+
+void debug_port_out(const unsigned char character)
+{
+ if (!initialised)
+ {
+ initialised = 1;
+ debug_port_initialise();
+ }
+
+ scc_out(CONSOLE_PORT, character);
+}
+
+void debug_port_write(const char *buffer)
+{
+ while (*buffer != '\0')
+ {
+ debug_port_out(*buffer++);
+ }
+}
+
+void debug_port_write_buffer(const char *buffer, unsigned int size)
+{
+ unsigned int count;
+ for (count = 0; count < size; count++)
+ {
+ debug_port_out(buffer[count]);
+ }
+}
+
+void debug_port_write_hex_uint(const unsigned int value)
+{
+ unsigned int bits = sizeof(value) * 8;
+ unsigned char c;
+
+ do
+ {
+ bits -= 4;
+ c = (unsigned char) ((value >> bits) & 0x0F);
+ if (c < 10)
+ {
+ c += '0';
+ }
+ else
+ {
+ c += 'a' - 10;
+ }
+ debug_port_out((char) c);
+ }
+ while (bits);
+}
+
+void debug_port_write_hex_ulong(const unsigned long value)
+{
+ unsigned int bits = sizeof(value) * 8;
+ unsigned char c;
+
+ do
+ {
+ bits -= 4;
+ c = (unsigned char) ((value >> bits) & 0x0F);
+ if (c < 10)
+ {
+ c += '0';
+ }
+ else
+ {
+ c += 'a' - 10;
+ }
+ debug_port_out((char) c);
+ }
+ while (bits);
+}
+
+#define BUFFER_SIZE (256)
+static char buffer[BUFFER_SIZE];
+
+void debug_port_printf(const char *format, ...)
+{
+ va_list args;
+ int written;
+
+ /* gain access to the argument list */
+ va_start(args, format);
+
+ /* set the trap */
+ buffer[BUFFER_SIZE - 2] = '\xAA';
+ buffer[BUFFER_SIZE - 1] = '\x55';
+
+ /* format the string and send to stdout */
+ written = vsprintf(buffer, format, args);
+
+ /* try an trap format buffer overflows */
+ if ((buffer[BUFFER_SIZE - 2] != '\xAA') ||
+ (buffer[BUFFER_SIZE - 1] != '\x55'))
+ {
+ debug_port_write("debug port buffer overflow, halting...");
+ DISABLE_WATCHDOG();
+ while (1 == 1);
+ }
+
+ /* see if an error occurred, if not flush the output buffer */
+ if (written != -1)
+ {
+ debug_port_write_buffer(buffer, written);
+ }
+}
+
+void debug_port_banner(void)
+{
+#define CARD_LABEL "ods68302-" #VARIANT
+
+ debug_port_write("\n\n\r");
+ debug_port_write(_Copyright_Notice);
+ debug_port_write("\n\r " CARD_ID "\n\r");
+}
+