]> granicus.if.org Git - esp-idf/commitdiff
test tracing over JTAG
authorIvan Grokhotkov <igrokhotkov@gmail.com>
Sun, 15 Jan 2017 16:42:10 +0000 (00:42 +0800)
committerAlexey Gerenkov <alexey@espressif.com>
Mon, 17 Apr 2017 19:19:14 +0000 (22:19 +0300)
components/esp32/test/test_trace.c [new file with mode: 0644]

diff --git a/components/esp32/test/test_trace.c b/components/esp32/test/test_trace.c
new file mode 100644 (file)
index 0000000..e7f7997
--- /dev/null
@@ -0,0 +1,91 @@
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include "unity.h"
+#include "soc/soc.h"
+#include "soc/dport_reg.h"
+#include "eri.h"
+#include "trax.h"
+#include "freertos/FreeRTOS.h"
+#include "freertos/portmacro.h"
+#include "freertos/semphr.h"
+#include "freertos/task.h"
+
+/**
+ * Tests for sending trace over JTAG
+ *
+ * block 1 as trace memory, block 0 as normal memory
+ * CPU 0 and 1 write to BLK0 directly
+ * when watermark is triggered (figure out how):
+ *      disable trace for block 1
+ *      set internal pointer to use block 1
+ *      switch tracemem mux to block 0
+ *
+ */
+
+#define TRACEMEM_MUX_PROBLK0_APPBLK1    0
+#define TRACEMEM_MUX_BLK0_ONLY          1
+#define TRACEMEM_MUX_BLK1_ONLY          2
+#define TRACEMEM_MUX_PROBLK1_APPBLK0    3
+
+
+static uint8_t* s_tracemem_blocks[] = {
+    (uint8_t*) 0x3FFF8000,
+    (uint8_t*) 0x3FFCC000
+};
+
+static const size_t TRACEMEM_BLOCK_SIZE = 0x4000;
+
+//static void trace_enable()
+//{
+//    if (which == TRAX_ENA_PRO_APP || which == TRAX_ENA_PRO_APP_SWAP) {
+//        WRITE_PERI_REG(DPORT_TRACEMEM_MUX_MODE_REG, (which == TRAX_ENA_PRO_APP_SWAP)?TRACEMEM_MUX_PROBLK1_APPBLK0:TRACEMEM_MUX_PROBLK0_APPBLK1);
+//    } else {
+//        WRITE_PERI_REG(DPORT_TRACEMEM_MUX_MODE_REG, TRACEMEM_MUX_BLK0_ONLY);
+//    }
+//    WRITE_PERI_REG(DPORT_PRO_TRACEMEM_ENA_REG, (which == TRAX_ENA_PRO_APP || which == TRAX_ENA_PRO_APP_SWAP || which == TRAX_ENA_PRO));
+//    WRITE_PERI_REG(DPORT_APP_TRACEMEM_ENA_REG, (which == TRAX_ENA_PRO_APP || which == TRAX_ENA_PRO_APP_SWAP || which == TRAX_ENA_APP));
+//
+//}
+
+typedef struct {
+    int block;
+    SemaphoreHandle_t done;
+} fill_tracemem_arg_t;
+
+static void fill_tracemem(void* p)
+{
+    fill_tracemem_arg_t* arg = (fill_tracemem_arg_t*) p;
+    int coreId = xPortGetCoreID();
+    memset(s_tracemem_blocks[arg->block] + coreId * TRACEMEM_BLOCK_SIZE / 2,
+            (coreId) ? 0xba:0xab, TRACEMEM_BLOCK_SIZE / 2);
+    xSemaphoreGive(arg->done);
+    vTaskDelay(1);
+    vTaskDelete(NULL);
+}
+
+TEST_CASE("both CPUs can write to trace block 0", "[trace][ignore]")
+{
+    WRITE_PERI_REG(DPORT_TRACEMEM_MUX_MODE_REG, TRACEMEM_MUX_BLK1_ONLY);
+
+    fill_tracemem_arg_t arg1 = {
+        .block = 0,
+        .done = xSemaphoreCreateBinary()
+    };
+
+    fill_tracemem_arg_t arg2 = {
+        .block = 0,
+        .done = xSemaphoreCreateBinary()
+    };
+
+    xTaskCreatePinnedToCore(&fill_tracemem, "fill1", 2048, &arg1, 3, NULL, 0);
+    xTaskCreatePinnedToCore(&fill_tracemem, "fill2", 2048, &arg2, 3, NULL, 0);
+
+    xSemaphoreTake(arg1.done, 1);
+    xSemaphoreTake(arg2.done, 1);
+
+    WRITE_PERI_REG(DPORT_TRACEMEM_MUX_MODE_REG, TRACEMEM_MUX_BLK0_ONLY);
+}
+
+
+