]> git.sur5r.net Git - openocd/commitdiff
Update FT2232 driver so that it reliably enters TAP_RESET.
authordbrownell <dbrownell@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 27 Sep 2009 16:55:52 +0000 (16:55 +0000)
committerdbrownell <dbrownell@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 27 Sep 2009 16:55:52 +0000 (16:55 +0000)
When the OpenOCD server starts up it records its state as TAP_RESET,
even though it could be anything.  Then when it starts to examine
the scan chain, it calls jtag_add_tlr() which sees it doesn't have
any work to do, and so it does nothing.  This can make the next
operations fail because they start from the wrong TAP state...

Instead of caring about the current recorded state, always enter
TAP_RESET by forcing five clocks with TMS high.

(NOTE:  it seems most other JTAG adapter drivers have this same bug.)

git-svn-id: svn://svn.berlios.de/openocd/trunk@2763 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/ft2232.c

index 9265b436a494cd9262ccc3d3ea948295f6e1c875..bebf707ad4311ca58b5e54e6ce184e6aa6659b71 100644 (file)
@@ -1587,8 +1587,16 @@ static int ft2232_execute_statemove(jtag_command_t *cmd)
        }
        ft2232_end_state(cmd->cmd.statemove->end_state);
 
-       /* move to end state */
-       if (tap_get_state() != tap_get_end_state())
+       /* For TAP_RESET, ignore the current recorded state.  It's often
+        * wrong at server startup, and this transation is critical whenever
+        * it's requested.
+        */
+       if (tap_get_end_state() == TAP_RESET) {
+               clock_tms(0x4b,  0xff, 5, 0);
+               require_send = 1;
+
+       /* shortest-path move to desired end state */
+       } else if (tap_get_state() != tap_get_end_state())
        {
                move_to_state(tap_get_end_state());
                require_send = 1;