aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/flash/nor/psoc4.c6
-rw-r--r--src/helper/command.c6
-rw-r--r--src/jtag/core.c19
-rw-r--r--src/jtag/jtag.h13
-rw-r--r--src/target/target.c12
5 files changed, 41 insertions, 15 deletions
diff --git a/src/flash/nor/psoc4.c b/src/flash/nor/psoc4.c
index 4b5aa55..1bdd64a 100644
--- a/src/flash/nor/psoc4.c
+++ b/src/flash/nor/psoc4.c
@@ -651,8 +651,8 @@ static int psoc4_write(struct flash_bank *bank, const uint8_t *buffer,
if (row_offset)
memset(row_buffer, bank->default_padded_value, row_offset);
- bool save_poll = jtag_poll_get_enabled();
- jtag_poll_set_enabled(false);
+ /* Mask automatic polling triggered by execution of halted events */
+ bool save_poll_mask = jtag_poll_mask();
while (count) {
uint32_t chunk_size = psoc4_info->row_size - row_offset;
@@ -693,7 +693,7 @@ static int psoc4_write(struct flash_bank *bank, const uint8_t *buffer,
}
cleanup:
- jtag_poll_set_enabled(save_poll);
+ jtag_poll_unmask(save_poll_mask);
free(sysrq_buffer);
return retval;
diff --git a/src/helper/command.c b/src/helper/command.c
index 43fe033..52f9eb6 100644
--- a/src/helper/command.c
+++ b/src/helper/command.c
@@ -702,14 +702,12 @@ static int jim_capture(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
* This is necessary in order to avoid accidentally getting a non-empty
* string for tcl fn's.
*/
- bool save_poll = jtag_poll_get_enabled();
-
- jtag_poll_set_enabled(false);
+ bool save_poll_mask = jtag_poll_mask();
const char *str = Jim_GetString(argv[1], NULL);
int retcode = Jim_Eval_Named(interp, str, __THIS__FILE__, __LINE__);
- jtag_poll_set_enabled(save_poll);
+ jtag_poll_unmask(save_poll_mask);
command_log_capture_finish(state);
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 27c7b3d..806ee89 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -136,14 +136,19 @@ int jtag_error_clear(void)
/************/
-static bool jtag_poll = 1;
+static bool jtag_poll = true;
+static bool jtag_poll_en = true;
bool is_jtag_poll_safe(void)
{
/* Polling can be disabled explicitly with set_enabled(false).
+ * It can also be masked with mask().
* It is also implicitly disabled while TRST is active and
* while SRST is gating the JTAG clock.
*/
+ if (!jtag_poll_en)
+ return false;
+
if (!transport_is_jtag())
return jtag_poll;
@@ -162,6 +167,18 @@ void jtag_poll_set_enabled(bool value)
jtag_poll = value;
}
+bool jtag_poll_mask(void)
+{
+ bool retval = jtag_poll_en;
+ jtag_poll_en = false;
+ return retval;
+}
+
+void jtag_poll_unmask(bool saved)
+{
+ jtag_poll_en = saved;
+}
+
/************/
struct jtag_tap *jtag_all_taps(void)
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index 18e09ce..4f94e99 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -587,6 +587,19 @@ bool jtag_poll_get_enabled(void);
*/
void jtag_poll_set_enabled(bool value);
+/**
+ * Mask (disable) polling and return the current mask status that should be
+ * feed to jtag_poll_unmask() to restore it.
+ * Multiple nested calls to jtag_poll_mask() are allowed, each balanced with
+ * its call to jtag_poll_unmask().
+ */
+bool jtag_poll_mask(void);
+
+/**
+ * Restore saved mask for polling.
+ */
+void jtag_poll_unmask(bool saved);
+
#include <jtag/minidriver.h>
int jim_jtag_newtap(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
diff --git a/src/target/target.c b/src/target/target.c
index 553400d..10a25ef 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -654,10 +654,10 @@ int target_resume(struct target *target, int current, target_addr_t address,
* Disable polling during resume() to guarantee the execution of handlers
* in the correct order.
*/
- bool save_poll = jtag_poll_get_enabled();
- jtag_poll_set_enabled(false);
+ bool save_poll_mask = jtag_poll_mask();
retval = target->type->resume(target, current, address, handle_breakpoints, debug_execution);
- jtag_poll_set_enabled(save_poll);
+ jtag_poll_unmask(save_poll_mask);
+
if (retval != ERROR_OK)
return retval;
@@ -685,14 +685,12 @@ static int target_process_reset(struct command_invocation *cmd, enum target_rese
* more predictable, i.e. dr/irscan & pathmove in events will
* not have JTAG operations injected into the middle of a sequence.
*/
- bool save_poll = jtag_poll_get_enabled();
-
- jtag_poll_set_enabled(false);
+ bool save_poll_mask = jtag_poll_mask();
sprintf(buf, "ocd_process_reset %s", n->name);
retval = Jim_Eval(cmd->ctx->interp, buf);
- jtag_poll_set_enabled(save_poll);
+ jtag_poll_unmask(save_poll_mask);
if (retval != JIM_OK) {
Jim_MakeErrorMessage(cmd->ctx->interp);