]> git.sur5r.net Git - openocd/commitdiff
SVF: better spec conformance for STATE switch
authorDavid Brownell <dbrownell@users.sourceforge.net>
Tue, 20 Oct 2009 06:33:08 +0000 (23:33 -0700)
committerDavid Brownell <dbrownell@users.sourceforge.net>
Tue, 20 Oct 2009 06:33:08 +0000 (23:33 -0700)
Don't add extra TCK in current state; exit from RESET had four extras.
Only IDLE --> IDLE needs such an extra clock.  (At least one TCK must
be issued.)

Allow entry to RESET; SVF allows it, so must we (despite those entries
being commented out of the statemove table).

When entering RESET, always use TLR ... we might end up with extra clocks
in reset that way, which is harmless, but we'll never end up in any other
state than RESET, which is useful paranoia.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
src/svf/svf.c

index 5b96971c1fd7fd597332d5796335d66c13a9c3ec..ecb0ffa4ba1798a46c08062ab031df6212318c0f 100644 (file)
@@ -316,30 +316,28 @@ static int svf_add_statemove(tap_state_t state_to)
        tap_state_t state_from = cmd_queue_cur_state;
        uint8_t index;
 
+       /* when resetting, be paranoid and ignore current state */
+       if (state_to == TAP_RESET) {
+               jtag_add_tlr();
+               return ERROR_OK;
+       }
+
        for (index = 0; index < dimof(svf_statemoves); index++)
        {
                if ((svf_statemoves[index].from == state_from)
                        && (svf_statemoves[index].to == state_to))
                {
-                       if (TAP_RESET == state_from)
-                       {
-                               jtag_add_tlr();
-                               if (svf_statemoves[index].num_of_moves > 1)
-                               {
-                                       jtag_add_pathmove(svf_statemoves[index].num_of_moves - 1, svf_statemoves[index].paths + 1);
-                               }
-                       }
+                       /* recorded path includes current state ... avoid extra TCKs! */
+                       if (svf_statemoves[index].num_of_moves > 1)
+                               jtag_add_pathmove(svf_statemoves[index].num_of_moves - 1,
+                                               svf_statemoves[index].paths + 1);
                        else
-                       {
-                               if (svf_statemoves[index].num_of_moves > 0)
-                               {
-                                       jtag_add_pathmove(svf_statemoves[index].num_of_moves, svf_statemoves[index].paths);
-                               }
-                       }
+                               jtag_add_pathmove(svf_statemoves[index].num_of_moves,
+                                               svf_statemoves[index].paths);
                        return ERROR_OK;
                }
        }
-       LOG_ERROR("can not move to %s", tap_state_svf_name(state_to));
+       LOG_ERROR("SVF: can not move to %s", tap_state_svf_name(state_to));
        return ERROR_FAIL;
 }