commit afa0284b6572f19cd09c1884ba81b6c3629eaecd
parent ed5e5852ba600ac752382852716ce5599dd6d79b
Author: Brian Swetland <swetland@frotz.net>
Date:   Wed,  5 Aug 2015 18:40:04 -0700
debugger: better swd error reporting
Diffstat:
3 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/include/protocol/rswdp.h b/include/protocol/rswdp.h
@@ -73,6 +73,13 @@
 #define CMD_RX_MAXDATA	0x33 /* arg=bytes, declares senders rx buffer size */
 #define CMD_CLOCK_KHZ	0x34 /* arg=khz, reports active clock rate */
 
+/* CMD_STATUS error codes */
+#define ERR_NONE	0
+#define ERR_INTERNAL	1
+#define ERR_TIMEOUT	2
+#define ERR_IO		3
+#define ERR_PARITY	4
+
 #define RSWD_VERSION	0x0100
 
 /* CMD_SWD_OP operations - combine for direct AP/DP io */
diff --git a/tools/debugger-core.c b/tools/debugger-core.c
@@ -51,6 +51,8 @@
 #define DFSR_EXTERNAL		(1 << 4)
 #define DFSR_MASK		0x1F
 
+extern int swd_verbose;
+
 static void m_event(const char *evt) {
 	xprintf(XCORE, "DEBUG EVENT: %s\n", evt);
 }
@@ -82,12 +84,16 @@ void debugger_lock() {
 #endif
 		swdp_reset();
 	}
+	swd_verbose = 1;
 }
 
 void debugger_unlock() {
+#if 0
 	if (swdp_error()) {
 		xprintf(XCORE, "SWD ERROR\n");
 	}
+#endif
+	swd_verbose = 0;
 	pthread_mutex_unlock(&_dbg_lock);
 }
 
diff --git a/tools/rswdp.c b/tools/rswdp.c
@@ -31,6 +31,8 @@
 
 #include <debugger.h>
 
+int swd_verbose = 0;
+
 static volatile int ATTN;
 
 void swdp_interrupt(void) {
@@ -170,6 +172,17 @@ done:
 	swd_maxwords = maxdata / 4;
 }
 
+const char *swd_err_str(unsigned op) {
+	switch (op) {
+	case ERR_NONE: return "NONE";
+	case ERR_INTERNAL: return "INTERNAL";
+	case ERR_TIMEOUT: return "TIMEOUT";
+	case ERR_IO: return "IO";
+	case ERR_PARITY: return "PARITY";
+	default: return "UNKNOWN";
+	}
+}
+
 static int process_reply(struct txn *t, u32 *data, int count) {
 	unsigned msg, op, n, rxp, rxc;
 
@@ -198,6 +211,9 @@ static int process_reply(struct txn *t, u32 *data, int count) {
 			continue;
 		case CMD_STATUS:
 			if (op) {
+				if (swd_verbose) {
+					xprintf(XSWD, "SWD ERROR: %s\n", swd_err_str(op));
+				}
 				swd_error = -op;
 				return -op;
 			} else {