Prepare for release
[SCSI2SD-V6.git] / src / firmware / 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 <stm32f2xx.h>
19 #include <stdint.h>
20 #include "trace.h"
21
22 // configure desired baud rate on the SWV pin.
23 // up to the lower of CPU_clk/2 or 33MHz
24 #define BAUD_RATE 921600
25
26 // Cortex-M3 Trace Port Interface Unit (TPIU)
27 #define TPIU_BASE       0xe0040000
28 #define MMIO32(addr) *((volatile uint32_t*)(addr))
29 #define TPIU_SSPSR      MMIO32(TPIU_BASE + 0x000)
30 #define TPIU_CSPSR      MMIO32(TPIU_BASE + 0x004)
31 #define TPIU_ACPR       MMIO32(TPIU_BASE + 0x010)
32 #define TPIU_SPPR       MMIO32(TPIU_BASE + 0x0F0)
33 #define TPIU_FFSR       MMIO32(TPIU_BASE + 0x300)
34 #define TPIU_FFCR       MMIO32(TPIU_BASE + 0x304)
35
36 #define TPIU_CSPSR_BYTE (1 << 0)
37 #define TPIU_CSPSR_HALFWORD     (1 << 1)
38 #define TPIU_CSPSR_WORD (1 << 3)
39
40 #define TPIU_SPPR_SYNC  (0x0)
41 #define TPIU_SPPR_ASYNC_MANCHESTER      (0x1)
42 #define TPIU_SPPR_ASYNC_NRZ     (0x2)
43
44 #define TPIU_FFCR_ENFCONT       (1 << 1)
45
46 uint8_t LastTrace;
47
48 #ifndef TRACE
49
50 void traceInit(void) { }
51 #else
52
53 void traceInit(void) {
54         // enable the trace module clocks
55         CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
56         
57         // set SWV clock = CPU clock / 2, and enable
58         CY_SET_REG8(CYDEV_MFGCFG_MLOGIC_DEBUG, 0xc); // swv_clk_sel = CPU_clk / 2, swv_clk enable
59         
60         // unlock the ETM/TPIU registers
61         *((volatile uint32_t*)0xE0000FB0) = 0xC5ACCE55;
62         
63         // NRZ is "UART mode"
64         TPIU_SPPR = TPIU_SPPR_ASYNC_NRZ;
65         // prescaler, 0 = divide by 1
66         TPIU_ACPR = (BCLK__BUS_CLK__HZ/2/BAUD_RATE) - 1;
67         // can write 1, 2 or 4 byte ports
68         TPIU_CSPSR = TPIU_CSPSR_BYTE;
69
70         // bypass formatter (puts sync & stuff in otherwise)
71         TPIU_FFCR &= ~TPIU_FFCR_ENFCONT;
72         // enable ITM, enable the first 2 stimulus ports
73         ITM->TCR = ITM_TCR_ITMENA_Msk;
74         ITM->TER = 0x3;
75         
76         trace(trace_begin);
77 }
78 #endif