aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/target/adi_v5_swd.c11
-rw-r--r--src/target/arm_adi_v5.h3
-rw-r--r--src/target/arm_dap.c5
3 files changed, 19 insertions, 0 deletions
diff --git a/src/target/adi_v5_swd.c b/src/target/adi_v5_swd.c
index 0de272dd..b520223b 100644
--- a/src/target/adi_v5_swd.c
+++ b/src/target/adi_v5_swd.c
@@ -276,6 +276,16 @@ static int swd_run(struct adiv5_dap *dap)
return swd_run_inner(dap);
}
+/** Put the SWJ-DP back to JTAG mode */
+static void swd_quit(struct adiv5_dap *dap)
+{
+ const struct swd_driver *swd = adiv5_dap_swd_driver(dap);
+
+ swd->switch_seq(SWD_TO_JTAG);
+ /* flush the queue before exit */
+ swd->run();
+}
+
const struct dap_ops swd_dap_ops = {
.connect = swd_connect,
.queue_dp_read = swd_queue_dp_read,
@@ -284,6 +294,7 @@ const struct dap_ops swd_dap_ops = {
.queue_ap_write = swd_queue_ap_write,
.queue_ap_abort = swd_queue_ap_abort,
.run = swd_run,
+ .quit = swd_quit,
};
/*
diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h
index 22c31663..883ac8b5 100644
--- a/src/target/arm_adi_v5.h
+++ b/src/target/arm_adi_v5.h
@@ -286,6 +286,9 @@ struct dap_ops {
/** Executes all queued DAP operations but doesn't check
* sticky error conditions */
int (*sync)(struct adiv5_dap *dap);
+
+ /** Optional; called at OpenOCD exit */
+ void (*quit)(struct adiv5_dap *dap);
};
/*
diff --git a/src/target/arm_dap.c b/src/target/arm_dap.c
index 8c081800..3be4d719 100644
--- a/src/target/arm_dap.c
+++ b/src/target/arm_dap.c
@@ -132,8 +132,13 @@ static int dap_init_all(void)
int dap_cleanup_all(void)
{
struct arm_dap_object *obj, *tmp;
+ struct adiv5_dap *dap;
list_for_each_entry_safe(obj, tmp, &all_dap, lh) {
+ dap = &obj->dap;
+ if (dap->ops && dap->ops->quit)
+ dap->ops->quit(dap);
+
free(obj->name);
free(obj);
}