From 803351ec59cb57c63129c77d95b5edf2fc65c302 Mon Sep 17 00:00:00 2001 From: Øyvind Harboe Date: Sat, 31 Jul 2010 21:45:56 +0200 Subject: jtag: add jtag_flush_queue_sleep debug command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it can be useful to throttle performance: test differences in behavior, test performance effect of long roundtrips. Signed-off-by: Øyvind Harboe --- src/jtag/core.c | 17 +++++++++++++++++ src/jtag/jtag.h | 4 ++++ src/jtag/tcl.c | 24 ++++++++++++++++++++++++ 3 files changed, 45 insertions(+) (limited to 'src') 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, -- cgit v1.2.3