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>
This commit is contained in:
parent
80970811f4
commit
ff755a575e
|
@ -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 */
|
/* Send a message and receive the reply */
|
||||||
static int cmsis_dap_xfer(struct cmsis_dap *dap, int txlen)
|
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) {
|
if (resp[0] != current_cmd) {
|
||||||
LOG_ERROR("CMSIS-DAP command mismatch. Sent 0x%" PRIx8
|
LOG_ERROR("CMSIS-DAP command mismatch. Sent 0x%" PRIx8
|
||||||
" received 0x%" PRIx8, current_cmd, resp[0]);
|
" received 0x%" PRIx8, current_cmd, resp[0]);
|
||||||
|
|
||||||
|
cmsis_dap_flush_read(dap);
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -885,6 +902,8 @@ static int cmsis_dap_init(void)
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
|
cmsis_dap_flush_read(cmsis_dap_handle);
|
||||||
|
|
||||||
retval = cmsis_dap_get_caps_info();
|
retval = cmsis_dap_get_caps_info();
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
Loading…
Reference in New Issue