aboutsummaryrefslogtreecommitdiff
path: root/src/xsvf
diff options
context:
space:
mode:
authorDavid Brownell <dbrownell@users.sourceforge.net>2009-10-20 20:04:36 -0700
committerDavid Brownell <dbrownell@users.sourceforge.net>2009-10-20 20:04:36 -0700
commit7556a93aed97c3fad2c0a904a115168cd3dd61a8 (patch)
tree9ec8b3587676945e34181671fdbb4b8eb0c70344 /src/xsvf
parenta1609e5ad1b8df67f216d2f7c43db82c420db373 (diff)
downloadriscv-openocd-7556a93aed97c3fad2c0a904a115168cd3dd61a8.zip
riscv-openocd-7556a93aed97c3fad2c0a904a115168cd3dd61a8.tar.gz
riscv-openocd-7556a93aed97c3fad2c0a904a115168cd3dd61a8.tar.bz2
XSVF: use svf_add_statemove()
XSVF improvements: - Layer parts of XSVF directly over SVF, calling svf_add_statemove() instead of expecting jtag_add_statemove() to conform to the SVF/XSVF requirements (which it doesn't). This should improve XSTATE handling a lot; it removes most users of jtag_add_statemove(), and the comments about how it should really do what svf_add_statemove() does. - Update XSTATE logic to be a closer match to the XSVF spec. The main open issue here is (still) that this implementation doesn't know how to build and submit paths from single-state transitions ... but now it will report that error case. - Update the User's Guide to mention the two utility scripts for working with XSVF, and to mention the five extension opcodes. Handling of state transition paths is, overall, still a mess. I think they should all be specified as paths not unlike SVF uses, and compiled to the bitstrings later ... so that we can actually make sense of the paths. (And see the extra clocks, detours through RUN, etc.) Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Diffstat (limited to 'src/xsvf')
-rw-r--r--src/xsvf/Makefile.am1
-rw-r--r--src/xsvf/xsvf.c79
2 files changed, 46 insertions, 34 deletions
diff --git a/src/xsvf/Makefile.am b/src/xsvf/Makefile.am
index 847fb80..fd9f8c3 100644
--- a/src/xsvf/Makefile.am
+++ b/src/xsvf/Makefile.am
@@ -1,6 +1,7 @@
AM_CPPFLAGS = \
-I$(top_srcdir)/src/server \
-I$(top_srcdir)/src/helper \
+ -I$(top_srcdir)/src/svf \
-I$(top_srcdir)/src/jtag
METASOURCES = AUTO
diff --git a/src/xsvf/xsvf.c b/src/xsvf/xsvf.c
index 083e6e3..d00c47c 100644
--- a/src/xsvf/xsvf.c
+++ b/src/xsvf/xsvf.c
@@ -42,6 +42,7 @@
#include "xsvf.h"
#include "jtag.h"
+#include "svf.h"
/* XSVF commands, from appendix B of xapp503.pdf */
@@ -432,7 +433,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
/* See page 19 of XSVF spec regarding opcode "XSDR" */
if (xruntest)
{
- jtag_add_statemove(TAP_IDLE);
+ result = svf_add_statemove(TAP_IDLE);
if (runtest_requires_tck)
jtag_add_clocks(xruntest);
@@ -440,7 +441,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
jtag_add_sleep(xruntest);
}
else if (xendir != TAP_DRPAUSE) /* we are already in TAP_DRPAUSE */
- jtag_add_statemove(xenddr);
+ result = svf_add_statemove(xenddr);
}
break;
@@ -499,32 +500,37 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
LOG_DEBUG("XSTATE 0x%02X %s", uc, tap_state_name(mystate));
- /* there is no need for the lookahead code that was here since we
- queue up the jtag commands anyway. This is a simple way to handle
- the XSTATE.
- */
+ /* NOTE: the current state is SVF-stable! */
+
+ /* no change == NOP */
+ if (mystate == cmd_queue_cur_state
+ && mystate != TAP_RESET)
+ break;
- if (jtag_add_statemove(mystate) != ERROR_OK)
+ /* Hand off to SVF? */
+ if (svf_tap_state_is_stable(mystate))
{
- /* For special states known as stable states
- (Test-Logic-Reset, Run-Test/Idle, Pause-DR, Pause- IR),
- an XSVF interpreter follows predefined TAP state paths
- when the starting state is a stable state and when the
- XSTATE specifies a new stable state (see the STATE
- command in the [Ref 5] for the TAP state paths between
- stable states). For non-stable states, XSTATE should
- specify a state that is only one TAP state transition
- distance from the current TAP state to avoid undefined
- TAP state paths. A sequence of multiple XSTATE commands
- can be issued to transition the TAP through a specific
- state path.
- */
-
- LOG_ERROR("XSTATE %s is not reachable from current state %s in one clock cycle",
- tap_state_name(mystate),
- tap_state_name(cmd_queue_cur_state)
-);
+ result = svf_add_statemove(mystate);
+ if (result != ERROR_OK)
+ unsupported = 1;
+ break;
}
+
+ /*
+ * A sequence of XSTATE transitions, each TAP
+ * state adjacent to the previous one.
+ *
+ * NOTE: OpenOCD requires something that XSVF
+ * doesn't: the last TAP state in the path
+ * must be stable.
+ *
+ * FIXME Implement path collection; submit via
+ * jtag_add_pathmove() after teaching it to
+ * report errors.
+ */
+ LOG_ERROR("XSVF: 'XSTATE %s' ... NYET",
+ tap_state_name(mystate));
+ unsupported = 1;
}
break;
@@ -708,9 +714,10 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
}
else
{
- jtag_add_statemove(wait_state);
+ /* FIXME handle statemove errors ... */
+ result = svf_add_statemove(wait_state);
jtag_add_sleep(delay);
- jtag_add_statemove(end_state);
+ result = svf_add_statemove(end_state);
}
}
break;
@@ -755,19 +762,22 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
* be issuing a number of clocks in this state. This set of allowed states is also
* determined by the SVF RUNTEST command's allowed states.
*/
- if (wait_state != TAP_IRPAUSE && wait_state != TAP_DRPAUSE && wait_state != TAP_RESET && wait_state != TAP_IDLE)
+ if (!svf_tap_state_is_stable(wait_state))
{
- LOG_ERROR("illegal XWAITSTATE wait_state: \"%s\"", tap_state_name(wait_state));
+ LOG_ERROR("illegal XWAITSTATE wait_state: \"%s\"",
+ tap_state_name(wait_state));
unsupported = 1;
+ /* REVISIT "break" so we won't run? */
}
- jtag_add_statemove(wait_state);
+ /* FIXME handle statemove errors ... */
+ result = svf_add_statemove(wait_state);
jtag_add_clocks(clock_count);
jtag_add_sleep(usecs);
- jtag_add_statemove(end_state);
+ result = svf_add_statemove(end_state);
}
break;
@@ -806,6 +816,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
break;
}
+ /* NOTE: loop_state must be stable! */
loop_state = xsvf_to_tap(state);
loop_clocks = be_to_h_u32(clock_buf);
loop_usecs = be_to_h_u32(usecs_buf);
@@ -839,7 +850,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
{
scan_field_t field;
- jtag_add_statemove(loop_state);
+ result = svf_add_statemove(loop_state);
jtag_add_clocks(loop_clocks);
jtag_add_sleep(loop_usecs);
@@ -917,8 +928,8 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
LOG_DEBUG("xsvf failed, setting taps to reasonable state");
/* upon error, return the TAPs to a reasonable state */
- jtag_add_statemove(TAP_IDLE);
- jtag_execute_queue();
+ result = svf_add_statemove(TAP_IDLE);
+ result = jtag_execute_queue();
break;
}
}