diff options
author | Tomas Vanek <vanekt@fbl.cz> | 2021-04-06 18:55:22 +0200 |
---|---|---|
committer | Tomas Vanek <vanekt@fbl.cz> | 2021-04-18 21:21:44 +0100 |
commit | ff755a575ebf0218c2eb8745eff8050f8f02a53d (patch) | |
tree | a2f6e5d80242905fabaf829435c7695f3899596e | |
parent | 80970811f4558b610792b01d37740be8af4258f6 (diff) | |
download | riscv-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>
-rw-r--r-- | src/jtag/drivers/cmsis_dap.c | 19 |
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; |