diff options
author | Matthias Welwarsky <matthias@welwarsky.de> | 2015-12-28 22:33:51 +0100 |
---|---|---|
committer | Paul Fertser <fercerpav@gmail.com> | 2016-01-22 13:00:27 +0000 |
commit | 5373085b4d7ab600d0325634f3adc846f92169af (patch) | |
tree | 574b1b26523b99812b87969749bfad3621df0bf4 | |
parent | a185eaad9d2fd25e3e53398a235e08f07f360e74 (diff) |
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>
-rw-r--r-- | src/target/adi_v5_jtag.c | 6 | ||||
-rw-r--r-- | src/target/arm_adi_v5.h | 12 |
2 files changed, 18 insertions, 0 deletions
diff --git a/src/target/adi_v5_jtag.c b/src/target/adi_v5_jtag.c index ff1680b0..201ed90a 100644 --- a/src/target/adi_v5_jtag.c +++ b/src/target/adi_v5_jtag.c @@ -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, }; diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h index 44d3962c..f001d6a2 100644 --- a/src/target/arm_adi_v5.h +++ b/src/target/arm_adi_v5.h @@ -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) { |