m3dev

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Minclude/protocol/rswdp.h | 7+++++++
Mtools/debugger-core.c | 6++++++
Mtools/rswdp.c | 16++++++++++++++++
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 {