This patch (it includes Øyvind's previous patch) fixes my problems with
reset. By default it will do nothing so it should not affect anybody.
I added [optional] reset before running jtag_init_inner().
Is there a chance to commit this to svn tree?
--Michal
On Thu, 2009-09-24 at 00:28 +0200, Michael Schwingen wrote:
> David Brownell wrote:
> >> A board may stretch SRST, so you *have* to be able to wait a
> >> (user-defined) amount of time after SRESET assertion/deassertion before
> >> talking to anything in the chain. This is also true if the SRESET
> >> assertion is not caused by OpenOCD directly.
> >>
> >
> > Understood. This is part of why some JTAG adapters provide
> > inputs for SRST, not just outputs. It'd be nice if the
> > FT2232 ones provided a "USB interrupt" to give hosts an
> > asynch (more or less) notification that it was asserted.
> >
> This won't help if the FTDI library asserts SRST when calling the init
> function. At that point, the interrupts are probably not yet set up
> correctly.
>
> If the library does assert SRST during init without being told to do
> that, then OpenOCD needs to know about that and at least apply the
> configured delays so that the chain is in working order.
>
> cu
> Michael
>
> _______________________________________________
> Openocd-development mailing list
> [email protected]
> https://lists.berlios.de/mailman/listinfo/openocd-development
Index: src/jtag/zy1000/zy1000.c
===================================================================
--- src/jtag/zy1000/zy1000.c (revision 2726)
+++ src/jtag/zy1000/zy1000.c (working copy)
@@ -657,9 +657,6 @@
-extern int jtag_nsrst_delay;
-extern int jtag_ntrst_delay;
-
int interface_jtag_add_reset(int req_trst, int req_srst)
{
zy1000_reset(req_trst, req_srst);
Index: src/jtag/core.c
===================================================================
--- src/jtag/core.c (revision 2726)
+++ src/jtag/core.c (working copy)
@@ -93,6 +93,9 @@
/* how long the OpenOCD should wait before attempting JTAG communication after
reset lines deasserted (in ms) */
static int jtag_nsrst_delay = 0; /* default to no nSRST delay */
static int jtag_ntrst_delay = 0; /* default to no nTRST delay */
+static int jtag_nsrst_assert_width = 0; /* width of assertion */
+static int jtag_ntrst_assert_width = 0; /* width of assertion */
+static bool jtag_reset_on_init = false; /* reset JTAG on init */
typedef struct jtag_event_callback_s
{
@@ -662,7 +665,11 @@
if (jtag_srst != new_srst) {
jtag_srst = new_srst;
if (jtag_srst)
+ {
LOG_DEBUG("SRST line asserted");
+ if (jtag_nsrst_assert_width)
+ jtag_add_sleep(jtag_nsrst_assert_width * 1000);
+ }
else {
LOG_DEBUG("SRST line released");
if (jtag_nsrst_delay)
@@ -694,6 +701,8 @@
LOG_DEBUG("TRST line asserted");
tap_set_state(TAP_RESET);
jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
+ if (jtag_ntrst_assert_width)
+ jtag_add_sleep(jtag_ntrst_assert_width * 1000);
} else {
LOG_DEBUG("TRST line released");
if (jtag_ntrst_delay)
@@ -1296,6 +1305,10 @@
int retval;
if ((retval = jtag_interface_init(cmd_ctx)) != ERROR_OK)
return retval;
+
+ if (jtag_reset_on_init)
+ return jtag_init_reset(cmd_ctx);
+
if (jtag_init_inner(cmd_ctx) == ERROR_OK)
{
return ERROR_OK;
@@ -1462,3 +1475,30 @@
{
return jtag_ntrst_delay;
}
+
+
+void jtag_set_nsrst_assert_width(unsigned delay)
+{
+ jtag_nsrst_assert_width = delay;
+}
+unsigned jtag_get_nsrst_assert_width(void)
+{
+ return jtag_nsrst_assert_width;
+}
+void jtag_set_ntrst_assert_width(unsigned delay)
+{
+ jtag_ntrst_assert_width = delay;
+}
+unsigned jtag_get_ntrst_assert_width(void)
+{
+ return jtag_ntrst_assert_width;
+}
+
+void jtag_set_reset_on_init(bool state)
+{
+ jtag_reset_on_init = state;
+}
+bool jtag_get_reset_on_init(void)
+{
+ return jtag_reset_on_init;
+}
Index: src/jtag/jtag.h
===================================================================
--- src/jtag/jtag.h (revision 2726)
+++ src/jtag/jtag.h (working copy)
@@ -289,6 +289,15 @@
void jtag_set_ntrst_delay(unsigned delay);
unsigned jtag_get_ntrst_delay(void);
+void jtag_set_nsrst_assert_width(unsigned delay);
+unsigned jtag_get_nsrst_assert_width(void);
+
+void jtag_set_ntrst_assert_width(unsigned delay);
+unsigned jtag_get_ntrst_assert_width(void);
+
+void jtag_set_reset_on_init(bool state);
+bool jtag_get_reset_on_init(void);
+
/// @returns The current state of TRST.
int jtag_get_trst(void);
/// @returns The current state of SRST.
Index: src/jtag/tcl.c
===================================================================
--- src/jtag/tcl.c (revision 2726)
+++ src/jtag/tcl.c (working copy)
@@ -61,6 +61,9 @@
static int handle_reset_config_command(struct command_context_s *cmd_ctx, char
*cmd, char **args, int argc);
static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx,
char *cmd, char **args, int argc);
static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx,
char *cmd, char **args, int argc);
+static int handle_jtag_nsrst_assert_width_command(struct command_context_s
*cmd_ctx, char *cmd, char **args, int argc);
+static int handle_jtag_ntrst_assert_width_command(struct command_context_s
*cmd_ctx, char *cmd, char **args, int argc);
+static int handle_jtag_reset_on_init_command(struct command_context_s
*cmd_ctx, char *cmd, char **args, int argc);
static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char
*cmd, char **args, int argc);
@@ -618,7 +621,12 @@
COMMAND_ANY, "jtag_nsrst_delay <ms> - delay after deasserting
srst in ms");
register_command(cmd_ctx, NULL, "jtag_ntrst_delay",
handle_jtag_ntrst_delay_command,
COMMAND_ANY, "jtag_ntrst_delay <ms> - delay after deasserting
trst in ms");
-
+ register_command(cmd_ctx, NULL, "jtag_nsrst_assert_width",
handle_jtag_nsrst_assert_width_command,
+ COMMAND_ANY, "jtag_nsrst_assert_width <ms> - delay after
deasserting srst in ms");
+ register_command(cmd_ctx, NULL, "jtag_ntrst_assert_width",
handle_jtag_ntrst_assert_width_command,
+ COMMAND_ANY, "jtag_ntrst_assert_width <ms> - delay after
deasserting trst in ms");
+ register_command(cmd_ctx, NULL, "jtag_reset_on_init",
handle_jtag_reset_on_init_command,
+ COMMAND_ANY, "jtag_reset_on_init true/false - reset
JTAG chain before initializing.");
register_command(cmd_ctx, NULL, "scan_chain", handle_scan_chain_command,
COMMAND_EXEC, "print current scan chain configuration");
@@ -978,6 +986,61 @@
return ERROR_OK;
}
+static int handle_jtag_nsrst_assert_width_command(struct command_context_s
*cmd_ctx,
+ char *cmd, char **args, int argc)
+{
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ if (argc == 1)
+ {
+ unsigned delay;
+ int retval = parse_uint(args[0], &delay);
+ if (ERROR_OK != retval)
+ return retval;
+ jtag_set_nsrst_assert_width(delay);
+ }
+ command_print(cmd_ctx, "jtag_nsrst_assert_width: %u",
jtag_get_nsrst_assert_width());
+ return ERROR_OK;
+}
+
+static int handle_jtag_ntrst_assert_width_command(struct command_context_s
*cmd_ctx,
+ char *cmd, char **args, int argc)
+{
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ if (argc == 1)
+ {
+ unsigned delay;
+ int retval = parse_uint(args[0], &delay);
+ if (ERROR_OK != retval)
+ return retval;
+ jtag_set_ntrst_assert_width(delay);
+ }
+ command_print(cmd_ctx, "jtag_ntrst_assert_width: %u",
jtag_get_ntrst_assert_width());
+ return ERROR_OK;
+}
+
+static int handle_jtag_reset_on_init_command(struct command_context_s *cmd_ctx,
+ char *cmd, char **args, int argc)
+{
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ if (argc == 1)
+ {
+ bool state;
+ if (strcmp(args[0], "true") == 0)
+ state = true;
+ else if (strcmp(args[0], "false") == 0)
+ state = false;
+ else
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ jtag_set_reset_on_init(state);
+ }
+ command_print(cmd_ctx, "reset_on_init is %s",
+ jtag_get_reset_on_init() ? "true": "false");
+ return ERROR_OK;
+}
+
static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char
*cmd, char **args, int argc)
{
int retval = ERROR_OK;
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development