Add missing SWV trace functions.
[SCSI2SD.git] / software / SCSI2SD / src / trace.h
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 // Trace event IDs to be output. 1 and 9 are generated as headers on ports 0
19 // and 1 respectively, and should not be used.
20 enum trace_event {
21         trace_begin = 0,
22
23         // function entries - SCSI
24         trace_scsiRxCompleteISR = 0x50,
25         trace_scsiTxCompleteISR,
26         trace_scsiResetISR,
27         trace_doRxSingleDMA,
28         trace_doTxSingleDMA,
29         trace_scsiPhyReset,
30
31         // spin loops - SCSI
32         trace_spinTxComplete = 0x20,
33         trace_spinReadDMAPoll,
34         trace_spinWriteDMAPoll,
35         trace_spinPhyTxFifo,
36         trace_spinPhyRxFifo,
37         trace_spinDMAReset,
38
39         // SD
40         trace_spinSpiByte = 0x30,
41         trace_spinSDRxFIFO,
42         trace_spinSDBusy,
43         trace_spinSDDMA,
44         trace_spinSDCompleteWrite,
45         trace_spinSDCompleteRead,
46
47         // completion
48         trace_sdSpiByte = 0x40,
49 };
50
51 void traceInit(void);
52
53 #ifdef TRACE
54 // normally the code spins waiting for the trace FIFO to be ready for each event
55 // if you are debugging a timing-sensitive problem, define TRACE_IMPATIENT and
56 // expect some dropped packets
57 #ifdef TRACE_IMPATIENT
58     #define wait_fifo(port)  ;
59 #else
60     #define wait_fifo(port)  while (!(ITM->PORT[port].u32));
61 #endif
62
63         #include <core_cm3_psoc5.h>
64         static inline void trace(enum trace_event ch) {
65                 wait_fifo(0);
66                 ITM->PORT[0].u8 = ch;
67         }
68         // use a different stimulus port for ISRs to avoid a race
69         static inline void traceIrq(enum trace_event ch) {
70                 wait_fifo(1);
71                 ITM->PORT[1].u8 = ch;
72         }
73 #else
74         #define trace(ev)
75         #define traceIrq(ev)
76 #endif