From: <oh...@ma...> - 2009-05-06 19:25:18
|
Author: oharboe Date: 2009-05-06 19:25:14 +0200 (Wed, 06 May 2009) New Revision: 1615 Modified: trunk/src/jtag/bitbang.c Log: transition more directly to the end state + reuse more of the state move code/paths Modified: trunk/src/jtag/bitbang.c =================================================================== --- trunk/src/jtag/bitbang.c 2009-05-06 13:32:43 UTC (rev 1614) +++ trunk/src/jtag/bitbang.c 2009-05-06 17:25:14 UTC (rev 1615) @@ -84,12 +84,12 @@ } } -static void bitbang_state_move(void) +static void bitbang_state_move(int skip) { int i=0, tms=0; u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state()); - for (i = 0; i < 7; i++) + for (i = skip; i < 7; i++) { tms = (tms_scan >> i) & 1; bitbang_interface->write(0, tms, 0); @@ -146,7 +146,7 @@ if (tap_get_state() != TAP_IDLE) { bitbang_end_state(TAP_IDLE); - bitbang_state_move(); + bitbang_state_move(0); } /* execute num_cycles */ @@ -160,7 +160,7 @@ /* finish in end_state */ bitbang_end_state(saved_end_state); if (tap_get_state() != tap_get_end_state()) - bitbang_state_move(); + bitbang_state_move(0); } @@ -191,7 +191,7 @@ else bitbang_end_state(TAP_DRSHIFT); - bitbang_state_move(); + bitbang_state_move(0); bitbang_end_state(saved_end_state); } @@ -227,22 +227,14 @@ } } - /* TAP_DRSHIFT & TAP_IRSHIFT are illegal end states, so we always transition to the pause - * state which is a legal stable state from which statemove will work. - * - * Exit1 -> Pause - */ - bitbang_interface->write(0, 0, 0); - bitbang_interface->write(1, 0, 0); - bitbang_interface->write(CLOCK_IDLE(), 0, 0); - - if (ir_scan) - tap_set_state(TAP_IRPAUSE); - else - tap_set_state(TAP_DRPAUSE); - if (tap_get_state() != tap_get_end_state()) - bitbang_state_move(); + { + /* we *KNOW* the above loop transitioned out of + * the shift state, so we skip the first state + * and move directly to the end state. + */ + bitbang_state_move(1); + } } int bitbang_execute_queue(void) @@ -310,7 +302,7 @@ #endif if (cmd->cmd.statemove->end_state != TAP_INVALID) bitbang_end_state(cmd->cmd.statemove->end_state); - bitbang_state_move(); + bitbang_state_move(0); break; case JTAG_PATHMOVE: #ifdef _DEBUG_JTAG_IO_ |