aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2021-04-06 18:55:22 +0200
committerTomas Vanek <vanekt@fbl.cz>2021-04-18 21:21:44 +0100
commitff755a575ebf0218c2eb8745eff8050f8f02a53d (patch)
treea2f6e5d80242905fabaf829435c7695f3899596e /src
parent80970811f4558b610792b01d37740be8af4258f6 (diff)
downloadriscv-openocd-ff755a575ebf0218c2eb8745eff8050f8f02a53d.zip
riscv-openocd-ff755a575ebf0218c2eb8745eff8050f8f02a53d.tar.gz
riscv-openocd-ff755a575ebf0218c2eb8745eff8050f8f02a53d.tar.bz2
drivers/cmsis-dap: flush read
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. Flush just after cmsis_dap_open() and in the case of command mismatch. Change-Id: If21a118639e64d90635b4ecf81013d29a7b9f78d Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/6135 Tested-by: jenkins Reviewed-by: Adrian M Negreanu <adrian.negreanu@nxp.com>
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;