xdebug

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

commit 2c19382b4b7c497a833edc5124a23e4433f1ce63
parent 8b32b4503eb319559015dd5f4e8345700061e627
Author: Brian Swetland <swetland@frotz.net>
Date:   Tue, 28 Feb 2023 01:33:51 -0800

transport: add dc->status, start abstracting logging

Diffstat:
Msrc/transport.c | 46+++++++++++++++++++++++++++++-----------------
1 file changed, 29 insertions(+), 17 deletions(-)

diff --git a/src/transport.c b/src/transport.c @@ -11,9 +11,18 @@ #include "cmsis-dap-protocol.h" #include "transport.h" +#define TRACE(fmt...) fprintf(stderr, fmt) +//#define TRACE(fmt...) do {} while (0) +#define ERROR(fmt...) fprintf(stderr, fmt) + +#define DC_ATTACHED 0 // attached and ready to do txns +#define DC_FAILURE 1 // last txn failed, need to re-attach +#define DC_DETACHED 2 // have not yet attached +#define DC_OFFLINE 3 // usb connection not available + struct debug_context { usb_handle* usb; - unsigned connected; + unsigned status; // dap protocol info uint32_t max_packet_count; @@ -59,33 +68,32 @@ int dap_get_info(DC* dc, unsigned di, void *out, unsigned minlen, unsigned maxle void dump(const char* str, const void* ptr, unsigned len) { const uint8_t* x = ptr; - fprintf(stderr, "%s", str); + TRACE("%s", str); while (len > 0) { - fprintf(stderr, " %02x", *x++); + TRACE(" %02x", *x++); len--; } - fprintf(stderr, "\n"); + TRACE("\n"); } int dap_cmd(DC* dc, const void* tx, unsigned txlen, void* rx, unsigned rxlen) { uint8_t cmd = ((const uint8_t*) tx)[0]; dump("TX>", tx, txlen); if (usb_write(dc->usb, tx, txlen) != txlen) { - fprintf(stderr, "dap_cmd(0x%02x): usb write error\n", cmd); + ERROR("dap_cmd(0x%02x): usb write error\n", cmd); return -1; } int sz = usb_read(dc->usb, rx, rxlen); if (sz < 1) { - fprintf(stderr, "dap_cmd(0x%02x): usb read error\n", cmd); + ERROR("dap_cmd(0x%02x): usb read error\n", cmd); return -1; } dump("RX>", rx, rxlen); if (((uint8_t*) rx)[0] != cmd) { - fprintf(stderr, "dap_cmd(0x%02x): unsupported (0x%02x)\n", + ERROR("dap_cmd(0x%02x): unsupported (0x%02x)\n", cmd, ((uint8_t*) rx)[0]); return -1; } - // fprintf(stderr, "dap_cmd(0x%02x): sz %u\n", cmd, sz); return sz; } @@ -95,7 +103,7 @@ int dap_cmd_std(DC* dc, const char* name, uint8_t* io, return -1; } if (io[1] != 0) { - fprintf(stderr, "%s status 0x%02x\n", name, io[1]); + ERROR("%s status 0x%02x\n", name, io[1]); return -1; } return 0; @@ -124,6 +132,7 @@ static void dc_q_clear(DC* dc) { dc->txavail = dc->max_packet_size - 3; dc->rxavail = dc->max_packet_size - 3; dc->qerror = 0; + // TODO: less conservative mode: don't always invalidate dc->dp_select_cache = 0xFFFFFFFFU; dc->txbuf[0] = DAP_Transfer; dc->txbuf[1] = 0; // Index 0 for SWD @@ -144,7 +153,7 @@ int dc_q_exec(DC* dc) { int sz = dc->txnext - dc->txbuf; dump("TX>", dc->txbuf, sz); if (usb_write(dc->usb, dc->txbuf, sz) != sz) { - fprintf(stderr, "dc_q_exec() usb write error\n"); + ERROR("dc_q_exec() usb write error\n"); return -1; } sz = 3 + (dc->rxnext - dc->rxptr) * 4; @@ -152,16 +161,16 @@ int dc_q_exec(DC* dc) { memset(rxbuf, 0xEE, 1024); // DEBUG int n = usb_read(dc->usb, rxbuf, sz); if (n < 0) { - fprintf(stderr, "dc_q_exec() usb read error\n"); + ERROR("dc_q_exec() usb read error\n"); return -1; } dump("RX>", rxbuf, sz); if ((n < 3) || (rxbuf[0] != DAP_Transfer)) { - fprintf(stderr, "dc_q_exec() bad response\n"); + ERROR("dc_q_exec() bad response\n"); return -1; } if (rxbuf[2] != RSP_ACK_OK) { - fprintf(stderr, "dc_q_exec() error response 0x%02x\n", rxbuf[2]); + ERROR("dc_q_exec() error response 0x%02x\n", rxbuf[2]); return -1; } @@ -199,7 +208,7 @@ static void dc_q_raw_rd(DC* dc, unsigned req, uint32_t* val) { } static void dc_q_raw_wr(DC* dc, unsigned req, uint32_t val) { - // fprintf(stderr, "Q RAW WR %08x %08x\n", req, val); + // TRACE("Q RAW WR %08x %08x\n", req, val); if (dc->txavail < 5) { if (dc_q_exec(dc) < 0) { dc->qerror = 1; @@ -215,7 +224,7 @@ static void dc_q_raw_wr(DC* dc, unsigned req, uint32_t val) { // adjust DP.SELECT for desired DP access, if necessary void dc_q_dp_sel(DC* dc, uint32_t dpaddr) { - // fprintf(stderr, "DP SEL %08x (select is %08x)\n", dpaddr, dc->dp_select_cache); + // TRACE("DP SEL %08x (select is %08x)\n", dpaddr, dc->dp_select_cache); // DP address is BANK:4 REG:4 if (dpaddr & 0xFFFFFF03U) { fprintf(stderr, "invalid DP addr 0x%08x\n", dpaddr); @@ -240,7 +249,7 @@ void dc_q_dp_sel(DC* dc, uint32_t dpaddr) { void dc_q_ap_sel(DC* dc, uint32_t apaddr) { // AP address is AP:8 BANK:4 REG:4 if (apaddr & 0xFFFF0003U) { - fprintf(stderr, "invalid DP addr 0x%08x\n", apaddr); + ERROR("invalid DP addr 0x%08x\n", apaddr); dc->qerror = 1; return; } @@ -311,7 +320,7 @@ int dc_attach(DC* dc) { return -1; } if (io[1] != 0) { - fprintf(stderr, "dc_attach() failure 0x%02x\n", io[1]); + ERROR("dc_attach() failure 0x%02x\n", io[1]); return -1; } return 0; @@ -398,6 +407,9 @@ int dc_create(DC** out) { return -1; } + // invalidate register cache + dc->dp_select_cache = 0xFFFFFFFFU; + // clip to our buffer size if (dc->max_packet_size > 1024) { dc->max_packet_size = 1024;