adiv5: introduce optional dap_sync() function

dap_sync() executes all commands in the JTAG queue and then checks
if a WAIT condition happened inside the last batch. If yes, a recovery
is invoked. If not, processing continues without checking for
errors. This function should be called in long AP read or writes, e.g.
while uploading a new application binary, at intermediate points within
the transfer where the cost of flushing the JTAG queue and checking the
journal doesn't affect performance too much.

Change-Id: I99eeaf47cdf951e15e589a04e74b90b5ce911386
Signed-off-by: Matthias Welwarsky <matthias@welwarsky.de>
Reviewed-on: http://openocd.zylin.com/3181
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
__archive__
Matthias Welwarsky 2015-12-28 22:33:51 +01:00 committed by Paul Fertser
parent a185eaad9d
commit 5373085b4d
2 changed files with 18 additions and 0 deletions

View File

@ -679,6 +679,11 @@ static int jtag_dp_run(struct adiv5_dap *dap)
return (retval2 != ERROR_OK) ? retval2 : retval;
}
static int jtag_dp_sync(struct adiv5_dap *dap)
{
return jtagdp_overrun_check(dap);
}
/* FIXME don't export ... just initialize as
* part of DAP setup
*/
@ -689,6 +694,7 @@ const struct dap_ops jtag_dp_ops = {
.queue_ap_write = jtag_ap_q_write,
.queue_ap_abort = jtag_ap_q_abort,
.run = jtag_dp_run,
.sync = jtag_dp_sync,
};

View File

@ -274,6 +274,10 @@ struct dap_ops {
/** Executes all queued DAP operations. */
int (*run)(struct adiv5_dap *dap);
/** Executes all queued DAP operations but doesn't check
* sticky error conditions */
int (*sync)(struct adiv5_dap *dap);
};
/*
@ -397,6 +401,14 @@ static inline int dap_run(struct adiv5_dap *dap)
return dap->ops->run(dap);
}
static inline int dap_sync(struct adiv5_dap *dap)
{
assert(dap->ops != NULL);
if (dap->ops->sync)
return dap->ops->sync(dap);
return ERROR_OK;
}
static inline int dap_dp_read_atomic(struct adiv5_dap *dap, unsigned reg,
uint32_t *value)
{