aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jtag/drivers/cmsis_dap.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/jtag/drivers/cmsis_dap.c b/src/jtag/drivers/cmsis_dap.c
index b5ceb6c..6ab0875 100644
--- a/src/jtag/drivers/cmsis_dap.c
+++ b/src/jtag/drivers/cmsis_dap.c
@@ -281,6 +281,21 @@ static void cmsis_dap_close(struct cmsis_dap *dap)
}
}
+static void cmsis_dap_flush_read(struct cmsis_dap *dap)
+{
+ unsigned int i;
+ /* Some CMSIS-DAP adapters keep buffered packets over
+ * USB close/open so we need to flush up to 64 old packets
+ * to be sure all buffers are empty */
+ for (i = 0; i < 64; i++) {
+ int retval = dap->backend->read(dap, 10);
+ if (retval == ERROR_TIMEOUT_REACHED)
+ break;
+ }
+ if (i)
+ LOG_DEBUG("Flushed %u packets", i);
+}
+
/* Send a message and receive the reply */
static int cmsis_dap_xfer(struct cmsis_dap *dap, int txlen)
{
@@ -313,6 +328,8 @@ static int cmsis_dap_xfer(struct cmsis_dap *dap, int txlen)
if (resp[0] != current_cmd) {
LOG_ERROR("CMSIS-DAP command mismatch. Sent 0x%" PRIx8
" received 0x%" PRIx8, current_cmd, resp[0]);
+
+ cmsis_dap_flush_read(dap);
return ERROR_FAIL;
}
@@ -885,6 +902,8 @@ static int cmsis_dap_init(void)
if (retval != ERROR_OK)
return retval;
+ cmsis_dap_flush_read(cmsis_dap_handle);
+
retval = cmsis_dap_get_caps_info();
if (retval != ERROR_OK)
return retval;