Add missing SWV trace functions.
[SCSI2SD.git] / software / SCSI2SD / src / trace.c
1 //      Copyright (C) 2015 James Laird-Wah <james@laird-wah.net>
2 //
3 //      This file is part of SCSI2SD.
4 //
5 //      SCSI2SD is free software: you can redistribute it and/or modify
6 //      it under the terms of the GNU General Public License as published by
7 //      the Free Software Foundation, either version 3 of the License, or
8 //      (at your option) any later version.
9 //
10 //      SCSI2SD is distributed in the hope that it will be useful,
11 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //      GNU General Public License for more details.
14 //
15 //      You should have received a copy of the GNU General Public License
16 //      along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.
17
18 #include <core_cm3_psoc5.h>
19 #include <stdint.h>
20 #include <cyfitter.h>
21 #include <cytypes.h>
22 #include <device.h>
23 #include "trace.h"
24
25 // configure desired baud rate on the SWV pin.
26 // up to the lower of CPU_clk/2 or 33MHz
27 #define BAUD_RATE 921600
28
29 // Cortex-M3 Trace Port Interface Unit (TPIU)
30 #define TPIU_BASE       0xe0040000
31 #define MMIO32(addr) *((volatile uint32_t*)(addr))
32 #define TPIU_SSPSR      MMIO32(TPIU_BASE + 0x000)
33 #define TPIU_CSPSR      MMIO32(TPIU_BASE + 0x004)
34 #define TPIU_ACPR       MMIO32(TPIU_BASE + 0x010)
35 #define TPIU_SPPR       MMIO32(TPIU_BASE + 0x0F0)
36 #define TPIU_FFSR       MMIO32(TPIU_BASE + 0x300)
37 #define TPIU_FFCR       MMIO32(TPIU_BASE + 0x304)
38
39 #define TPIU_CSPSR_BYTE (1 << 0)
40 #define TPIU_CSPSR_HALFWORD     (1 << 1)
41 #define TPIU_CSPSR_WORD (1 << 3)
42
43 #define TPIU_SPPR_SYNC  (0x0)
44 #define TPIU_SPPR_ASYNC_MANCHESTER      (0x1)
45 #define TPIU_SPPR_ASYNC_NRZ     (0x2)
46
47 #define TPIU_FFCR_ENFCONT       (1 << 1)
48
49 void traceInit(void) {
50         // enable the trace module clocks
51         CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
52         
53         // set SWV clock = CPU clock / 2, and enable
54         CY_SET_REG8(CYDEV_MFGCFG_MLOGIC_DEBUG, 0xc); // swv_clk_sel = CPU_clk / 2, swv_clk enable
55         
56         // unlock the ETM/TPIU registers
57         *((volatile uint32_t*)0xE0000FB0) = 0xC5ACCE55;
58         
59         // NRZ is "UART mode"
60         TPIU_SPPR = TPIU_SPPR_ASYNC_NRZ;
61         // prescaler, 0 = divide by 1
62         TPIU_ACPR = (BCLK__BUS_CLK__HZ/2/BAUD_RATE) - 1;
63         // can write 1, 2 or 4 byte ports
64         TPIU_CSPSR = TPIU_CSPSR_BYTE;
65
66         // bypass formatter (puts sync & stuff in otherwise)
67         TPIU_FFCR &= ~TPIU_FFCR_ENFCONT;
68         // enable ITM, enable the first 2 stimulus ports
69         ITM->TCR = ITM_TCR_ITMENA_Msk;
70         ITM->TER = 0x3;
71         
72         trace(trace_begin);
73 }