summaryrefslogtreecommitdiff
path: root/FreeRTOS-Labs/Source/FreeRTOS-Plus-Trace/streamports/ARM_ITM/trcStreamingPort.c
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS-Labs/Source/FreeRTOS-Plus-Trace/streamports/ARM_ITM/trcStreamingPort.c')
-rw-r--r--FreeRTOS-Labs/Source/FreeRTOS-Plus-Trace/streamports/ARM_ITM/trcStreamingPort.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/FreeRTOS-Labs/Source/FreeRTOS-Plus-Trace/streamports/ARM_ITM/trcStreamingPort.c b/FreeRTOS-Labs/Source/FreeRTOS-Plus-Trace/streamports/ARM_ITM/trcStreamingPort.c
new file mode 100644
index 000000000..0d36b4ab3
--- /dev/null
+++ b/FreeRTOS-Labs/Source/FreeRTOS-Plus-Trace/streamports/ARM_ITM/trcStreamingPort.c
@@ -0,0 +1,71 @@
+
+#include "trcRecorder.h"
+
+#if (TRC_USE_TRACEALYZER_RECORDER == 1)
+#if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING)
+
+static void itm_write_32(uint32_t data);
+
+volatile int32_t tz_host_command_bytes_to_read = 0; // This is set by the Tracealyzer host application (to the number of bytes written), after having written to tz_host_commands. Set to zero by the read function after the message in tz_host_commands has been read.
+volatile char tz_host_command_data[32];
+
+/* This reads "command" data from a RAM buffer, written by a host macro in the debugger */
+int32_t read_from_host(void* ptrData, uint32_t size, int32_t* ptrBytesRead)
+{
+ if ( tz_host_command_bytes_to_read > 0)
+ {
+ int i;
+ uint8_t * bytesBuffer = (uint8_t*) ptrData;
+
+ if (ptrBytesRead != NULL)
+ *ptrBytesRead = (int32_t)tz_host_command_bytes_to_read;
+
+ if (tz_host_command_bytes_to_read != size)
+ {
+ return -1;
+ }
+
+ for (i=0; i < tz_host_command_bytes_to_read; i++)
+ {
+ bytesBuffer[i] = tz_host_command_data[i];
+ }
+
+ tz_host_command_bytes_to_read = 0;
+ }
+
+ return 0;
+}
+
+static void itm_write_32(uint32_t data)
+{
+ if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && // Trace enabled
+ (ITM->TCR & ITM_TCR_ITMENA_Msk) && // ITM enabled
+ (ITM->TER & (1UL << TRC_CFG_ITM_PORT))) // ITM port enabled
+ {
+ while (ITM->PORT[TRC_CFG_ITM_PORT].u32 == 0); // Block until room in ITM FIFO - This stream port is always in "blocking mode", since intended for high-speed ITM!
+ ITM->PORT[TRC_CFG_ITM_PORT].u32 = data; // Write the data
+ }
+}
+
+/* This is assumed to execute from within the recorder, with interrupts disabled */
+int32_t itm_write(void* ptrData, uint32_t size, int32_t* ptrBytesWritten)
+{
+ uint32_t bytesWritten = 0;
+ uint32_t* ptr32 = (uint32_t*)ptrData;
+
+ if (size % 4 != 0) return -2;
+
+ while(bytesWritten < size)
+ {
+ itm_write_32(*ptr32);
+ ptr32++;
+ bytesWritten += 4;
+ }
+
+ *ptrBytesWritten = bytesWritten;
+
+ return 0;
+}
+
+#endif
+#endif