diff options
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 |
commit | 803351ec59cb57c63129c77d95b5edf2fc65c302 (patch) | |
tree | 35ea721d89a115af2e6e17ec3ad5a621ba3b1669 | |
parent | 630fc86ee339aa400f58fe80cbc5a1926eb3ef39 (diff) | |
download | openocd_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.c | 17 | ||||
-rw-r--r-- | src/jtag/jtag.h | 4 | ||||
-rw-r--r-- | src/jtag/tcl.c | 24 |
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, |