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 {