From 1341eb3b0aea74b939a5d7702f696b175d032647 Mon Sep 17 00:00:00 2001 From: drath Date: Sun, 30 Jul 2006 11:25:43 +0000 Subject: [PATCH] - added configurable delays after reset lines get deasserted. useful if reset circuitry keeps lines asserted for too long. - additional debug output when opening the parallel port - fixed counting of available arm7/9 watchpoint units - 'flash write' now displays elapsed time git-svn-id: svn://svn.berlios.de/openocd/trunk@79 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/flash/flash.c | 8 ++++- src/jtag/jtag.c | 62 +++++++++++++++++++++++++++++++++++++- src/jtag/jtag.h | 3 ++ src/jtag/parport.c | 8 ++++- src/openocd.c | 2 +- src/target/arm7_9_common.c | 12 ++++++-- 6 files changed, 89 insertions(+), 6 deletions(-) diff --git a/src/flash/flash.c b/src/flash/flash.c index 0a71309316..6f0523d0d6 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -476,7 +476,10 @@ int handle_flash_write_command(struct command_context_s *cmd_ctx, char *cmd, cha u32 buf_cnt; int retval; flash_bank_t *p; + struct timeval start, end, duration; + gettimeofday(&start, NULL); + if (argc < 3) { command_print(cmd_ctx, "usage: flash write "); @@ -553,7 +556,10 @@ int handle_flash_write_command(struct command_context_s *cmd_ctx, char *cmd, cha free(buffer); fclose(binary); - command_print(cmd_ctx, "wrote file %s to flash bank %i at offset 0x%8.8x", args[1], strtoul(args[0], NULL, 0), strtoul(args[2], NULL, 0)); + gettimeofday(&end, NULL); + timeval_subtract(&duration, &end, &start); + + command_print(cmd_ctx, "wrote file %s to flash bank %i at offset 0x%8.8x in %is %ius", args[1], strtoul(args[0], NULL, 0), strtoul(args[2], NULL, 0), duration.tv_sec, duration.tv_usec); return ERROR_OK; diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index d43fafb9db..b8846f17b8 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -111,6 +111,10 @@ enum tap_state cmd_queue_cur_state = TAP_TLR; int jtag_verify_capture_ir = 1; +/* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */ +int jtag_nsrst_delay = 0; /* default to no nSRST delay */ +int jtag_ntrst_delay = 0; /* default to no nTRST delay */ + /* callbacks to inform high-level handlers about JTAG state changes */ jtag_event_callback_t *jtag_event_callbacks; @@ -168,6 +172,8 @@ int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); @@ -805,7 +811,10 @@ int jtag_add_reset(int req_trst, int req_srst) } if (req_srst && !(jtag_reset_config & RESET_HAS_SRST)) + { + ERROR("requested nSRST assertion, but the current configuration doesn't support this"); return ERROR_JTAG_RESET_CANT_SRST; + } if (req_trst && !(jtag_reset_config & RESET_HAS_TRST)) { @@ -827,9 +836,15 @@ int jtag_add_reset(int req_trst, int req_srst) jtag_srst = req_srst; if (jtag_srst) + { jtag_call_event_callbacks(JTAG_SRST_ASSERTED); + } else + { jtag_call_event_callbacks(JTAG_SRST_RELEASED); + if (jtag_nsrst_delay) + jtag_add_sleep(jtag_nsrst_delay); + } if (trst_with_tms) { @@ -854,9 +869,20 @@ int jtag_add_reset(int req_trst, int req_srst) { if (jtag_trst) { + /* we just asserted nTRST, so we're now in Test-Logic-Reset, + * and inform possible listeners about this + */ cmd_queue_cur_state = TAP_TLR; jtag_call_event_callbacks(JTAG_TRST_ASSERTED); } + else + { + /* the nTRST line got deasserted, so we're still in Test-Logic-Reset, + * but we might want to add a delay to give the TAP time to settle + */ + if (jtag_ntrst_delay) + jtag_add_sleep(jtag_ntrst_delay); + } } return ERROR_OK; @@ -1121,7 +1147,11 @@ int jtag_register_commands(struct command_context_s *cmd_ctx) COMMAND_CONFIG, NULL); register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command, COMMAND_CONFIG, NULL); - + register_command(cmd_ctx, NULL, "nsrst_delay", handle_jtag_nsrst_delay_command, + COMMAND_CONFIG, NULL); + register_command(cmd_ctx, NULL, "ntrst_delay", handle_jtag_ntrst_delay_command, + COMMAND_CONFIG, NULL); + register_command(cmd_ctx, NULL, "scan_chain", handle_scan_chain_command, COMMAND_EXEC, "print current scan chain configuration"); @@ -1341,6 +1371,36 @@ int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, ch return ERROR_OK; } +int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + if (argc < 1) + { + ERROR("nsrst_delay command takes one required argument"); + exit(-1); + } + else + { + jtag_nsrst_delay = strtoul(args[0], NULL, 0); + } + + return ERROR_OK; +} + +int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + if (argc < 1) + { + ERROR("ntrst_delay command takes one required argument"); + exit(-1); + } + else + { + jtag_ntrst_delay = strtoul(args[0], NULL, 0); + } + + return ERROR_OK; +} + int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { if (argc == 0) diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 124150ce7f..f7630a5e91 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -199,6 +199,9 @@ enum jtag_event JTAG_TRST_RELEASED, }; +extern int jtag_trst; +extern int jtag_srst; + typedef struct jtag_event_callback_s { int (*callback)(enum jtag_event event, void *priv); diff --git a/src/jtag/parport.c b/src/jtag/parport.c index e78215e2d8..21aa5131f1 100644 --- a/src/jtag/parport.c +++ b/src/jtag/parport.c @@ -310,6 +310,8 @@ int parport_init(void) return ERROR_JTAG_INIT_FAILED; } + DEBUG("opening /dev/parport%d...", parport_port); + snprintf(buffer, 256, "/dev/parport%d", parport_port); device_handle = open(buffer, O_WRONLY); @@ -319,6 +321,8 @@ int parport_init(void) return ERROR_JTAG_INIT_FAILED; } + DEBUG("...open"); + i=ioctl(device_handle, PPCLAIM); if (i<0) { @@ -350,7 +354,8 @@ int parport_init(void) dataport = parport_port; statusport = parport_port + 1; - + + DEBUG("requesting privileges for parallel port 0x%x...", dataport); #if PARPORT_USE_GIVEIO == 1 if (parport_get_giveio_access() != 0) #else /* PARPORT_USE_GIVEIO */ @@ -360,6 +365,7 @@ int parport_init(void) ERROR("missing privileges for direct i/o"); return ERROR_JTAG_INIT_FAILED; } + DEBUG("...privileges granted"); #endif /* PARPORT_USE_PPDEV */ parport_reset(0, 0); diff --git a/src/openocd.c b/src/openocd.c index e52afd34f6..53ff45485a 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -18,7 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#define OPENOCD_VERSION "Open On-Chip Debugger (2006-07-15 12:00 CEST)" +#define OPENOCD_VERSION "Open On-Chip Debugger (2006-07-30 13:30 CEST)" #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/src/target/arm7_9_common.c b/src/target/arm7_9_common.c index 62fc3b5b96..6bb801254f 100644 --- a/src/target/arm7_9_common.c +++ b/src/target/arm7_9_common.c @@ -304,7 +304,8 @@ int arm7_9_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint) arm7_9_unset_breakpoint(target, breakpoint); } - arm7_9->wp_available++; + if (breakpoint->type == BKPT_HARD) + arm7_9->wp_available++; return ERROR_OK; } @@ -456,11 +457,12 @@ int arm7_9_enable_sw_bkpts(struct target_s *target) if (arm7_9->sw_bkpts_enabled) return ERROR_OK; - if (arm7_9->wp_available-- < 1) + if (arm7_9->wp_available < 1) { WARNING("can't enable sw breakpoints with no watchpoint unit available"); return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; } + arm7_9->wp_available--; if (!arm7_9->wp0_used) { @@ -784,6 +786,12 @@ int arm7_9_halt(target_t *target) { WARNING("target was in unknown state when halt was requested"); } + + if ((target->state == TARGET_RESET) && (jtag_reset_config & RESET_SRST_PULLS_TRST) && (jtag_srst)) + { + ERROR("can't request a halt while in reset if nSRST pulls nTRST"); + return ERROR_TARGET_FAILURE; + } if (arm7_9->use_dbgrq) { -- 2.30.2