summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-07-31 21:45:56 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-08-02 09:54:06 +0200
commit803351ec59cb57c63129c77d95b5edf2fc65c302 (patch)
tree35ea721d89a115af2e6e17ec3ad5a621ba3b1669
parent630fc86ee339aa400f58fe80cbc5a1926eb3ef39 (diff)
downloadopenocd+libswd-803351ec59cb57c63129c77d95b5edf2fc65c302.tar.gz
openocd+libswd-803351ec59cb57c63129c77d95b5edf2fc65c302.tar.bz2
openocd+libswd-803351ec59cb57c63129c77d95b5edf2fc65c302.tar.xz
openocd+libswd-803351ec59cb57c63129c77d95b5edf2fc65c302.zip
jtag: add jtag_flush_queue_sleep debug command
it can be useful to throttle performance: test differences in behavior, test performance effect of long roundtrips. Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
-rw-r--r--src/jtag/core.c17
-rw-r--r--src/jtag/jtag.h4
-rw-r--r--src/jtag/tcl.c24
3 files changed, 45 insertions, 0 deletions
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 352985ff..10686819 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -46,6 +46,9 @@
/// The number of JTAG queue flushes (for profiling and debugging purposes).
static int jtag_flush_queue_count;
+// Sleep this # of ms after flushing the queue
+static int jtag_flush_queue_sleep = 0;
+
static void jtag_add_scan_check(struct jtag_tap *active,
void (*jtag_add_scan)(struct jtag_tap *active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state),
int in_num_fields, struct scan_field *in_fields, tap_state_t state);
@@ -129,6 +132,11 @@ static struct jtag_interface *jtag = NULL;
/* configuration */
struct jtag_interface *jtag_interface = NULL;
+void jtag_set_flush_queue_sleep(int ms)
+{
+ jtag_flush_queue_sleep = ms;
+}
+
void jtag_set_error(int error)
{
if ((error == ERROR_OK) || (jtag_error != ERROR_OK))
@@ -826,6 +834,15 @@ void jtag_execute_queue_noclear(void)
{
jtag_flush_queue_count++;
jtag_set_error(interface_jtag_execute_queue());
+
+ if (jtag_flush_queue_sleep > 0)
+ {
+ /* For debug purposes it can be useful to test performance
+ * or behavior when delaying after flushing the queue,
+ * e.g. to simulate long roundtrip times.
+ */
+ usleep(jtag_flush_queue_sleep * 1000);
+ }
}
int jtag_get_flush_queue_count(void)
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index 3b0a145b..d6e49e0a 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -311,6 +311,10 @@ int adapter_init(struct command_context* cmd_ctx);
/// Shutdown the debug adapter upon program exit.
int adapter_quit(void);
+/// Set ms to sleep after jtag_execute_queue() flushes queue. Debug
+/// purposes.
+void jtag_set_flush_queue_sleep(int ms);
+
/**
* Initialize JTAG chain using only a RESET reset. If init fails,
* try reset + init.
diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c
index ea6d07e3..69045c60 100644
--- a/src/jtag/tcl.c
+++ b/src/jtag/tcl.c
@@ -1248,7 +1248,31 @@ COMMAND_HANDLER(handle_tms_sequence_command)
return ERROR_OK;
}
+COMMAND_HANDLER(handle_jtag_flush_queue_sleep)
+{
+ if (CMD_ARGC != 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+
+ int sleep_ms;
+ COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], sleep_ms);
+
+ jtag_set_flush_queue_sleep(sleep_ms);
+
+ return ERROR_OK;
+}
+
+
+
static const struct command_registration jtag_command_handlers[] = {
+
+ {
+ .name = "jtag_flush_queue_sleep",
+ .handler = handle_jtag_flush_queue_sleep,
+ .mode = COMMAND_ANY,
+ .help = "For debug purposes(simulate long delays of interface) "
+ "to test performance or change in behavior. Default 0ms.",
+ .usage = "[sleep in ms]",
+ },
{
.name = "jtag_rclk",
.handler = handle_jtag_rclk_command,