From: dbrownell at B. <dbr...@ma...> - 2009-09-27 18:55:54
|
Author: dbrownell Date: 2009-09-27 18:55:52 +0200 (Sun, 27 Sep 2009) New Revision: 2763 Modified: trunk/src/jtag/ft2232.c Log: Update FT2232 driver so that it reliably enters TAP_RESET. 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.) Modified: trunk/src/jtag/ft2232.c =================================================================== --- trunk/src/jtag/ft2232.c 2009-09-27 07:59:10 UTC (rev 2762) +++ trunk/src/jtag/ft2232.c 2009-09-27 16:55:52 UTC (rev 2763) @@ -1587,8 +1587,16 @@ } 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; |