summaryrefslogtreecommitdiff
path: root/src/jtag
diff options
context:
space:
mode:
authordrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2006-07-30 11:25:43 +0000
committerdrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2006-07-30 11:25:43 +0000
commit1341eb3b0aea74b939a5d7702f696b175d032647 (patch)
tree66aec1f947ef1b464b2f1e9028e8e4846499ad31 /src/jtag
parent82d2633b5f550115e9e7c7d0520babb6680aa38f (diff)
downloadopenocd+libswd-1341eb3b0aea74b939a5d7702f696b175d032647.tar.gz
openocd+libswd-1341eb3b0aea74b939a5d7702f696b175d032647.tar.bz2
openocd+libswd-1341eb3b0aea74b939a5d7702f696b175d032647.tar.xz
openocd+libswd-1341eb3b0aea74b939a5d7702f696b175d032647.zip
- 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
Diffstat (limited to 'src/jtag')
-rw-r--r--src/jtag/jtag.c62
-rw-r--r--src/jtag/jtag.h3
-rw-r--r--src/jtag/parport.c8
3 files changed, 71 insertions, 2 deletions
diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c
index d43fafb9..b8846f17 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 <ms> 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 <ms> 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 124150ce..f7630a5e 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 e78215e2..21aa5131 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);