summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
Diffstat (limited to 'shared')
-rw-r--r--shared/trace.c54
-rw-r--r--shared/trace.h30
-rw-r--r--shared/trace_stdio.c34
3 files changed, 118 insertions, 0 deletions
diff --git a/shared/trace.c b/shared/trace.c
new file mode 100644
index 0000000..9e05d9a
--- /dev/null
+++ b/shared/trace.c
@@ -0,0 +1,54 @@
+#include <stdint.h>
+#include <libopencm3/cm3/common.h>
+#include <libopencm3/cm3/memorymap.h>
+#include <libopencm3/cm3/itm.h>
+#include "trace.h"
+
+void trace_send_blocking8(int stimulus_port, char c) {
+ if (!(ITM_TER[0] & (1<<stimulus_port))) {
+ return;
+ }
+ while (!(ITM_STIM8(stimulus_port) & ITM_STIM_FIFOREADY))
+ ;
+ ITM_STIM8(stimulus_port) = c;
+}
+
+void trace_send8(int stimulus_port, char val) {
+ if (!(ITM_TER[0] & (1<<stimulus_port))) {
+ return;
+ }
+ ITM_STIM8(stimulus_port) = val;
+}
+
+void trace_send_blocking16(int stimulus_port, uint16_t val) {
+ if (!(ITM_TER[0] & (1<<stimulus_port))) {
+ return;
+ }
+ while (!(ITM_STIM16(stimulus_port) & ITM_STIM_FIFOREADY))
+ ;
+ ITM_STIM16(stimulus_port) = val;
+}
+
+void trace_send16(int stimulus_port, uint16_t val) {
+ if (!(ITM_TER[0] & (1<<stimulus_port))) {
+ return;
+ }
+ ITM_STIM16(stimulus_port) = val;
+}
+
+
+void trace_send_blocking32(int stimulus_port, uint32_t val) {
+ if (!(ITM_TER[0] & (1<<stimulus_port))) {
+ return;
+ }
+ while (!(ITM_STIM32(stimulus_port) & ITM_STIM_FIFOREADY))
+ ;
+ ITM_STIM32(stimulus_port) = val;
+}
+
+void trace_send32(int stimulus_port, uint32_t val) {
+ if (!(ITM_TER[0] & (1<<stimulus_port))) {
+ return;
+ }
+ ITM_STIM32(stimulus_port) = val;
+}
diff --git a/shared/trace.h b/shared/trace.h
new file mode 100644
index 0000000..b18cc11
--- /dev/null
+++ b/shared/trace.h
@@ -0,0 +1,30 @@
+/*
+ * trace support
+ * Karl Palsson <karlp@tweak.net.au>
+ */
+
+#ifndef TRACE_H
+#define TRACE_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void trace_send_blocking8(int stimulus_port, char c);
+void trace_send8(int stimulus_port, char c);
+
+void trace_send_blocking16(int stimulus_port, uint16_t val);
+void trace_send16(int stimulus_port, uint16_t val);
+
+void trace_send_blocking32(int stimulus_port, uint32_t val);
+void trace_send32(int stimulus_port, uint32_t val);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TRACE_H */
+
diff --git a/shared/trace_stdio.c b/shared/trace_stdio.c
new file mode 100644
index 0000000..2710942
--- /dev/null
+++ b/shared/trace_stdio.c
@@ -0,0 +1,34 @@
+/*
+ * support for stdio output to a trace port
+ * Karl Palsson, 2014 <karlp@remake.is>
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "trace.h"
+
+#ifndef STIMULUS_STDIO
+#define STIMULUS_STDIO 0
+#endif
+
+int _write(int file, char *ptr, int len);
+int _write(int file, char *ptr, int len)
+{
+ int i;
+
+ if (file == STDOUT_FILENO || file == STDERR_FILENO) {
+ for (i = 0; i < len; i++) {
+ if (ptr[i] == '\n') {
+ trace_send_blocking8(STIMULUS_STDIO, '\r');
+ }
+ trace_send_blocking8(STIMULUS_STDIO, ptr[i]);
+ }
+ return i;
+ }
+ errno = EIO;
+ return -1;
+}
+
+