jtag_vpi: fixed state transitions in "stableclocks"

In jtag_vpi_stableclocks() the TMS line needs to be set properly
based on the current JTAG TAP state (TMS=1 in TAP_RESET state vs.
TMS=0 in other cases).

Change-Id: Id49622ba83015f97b61b6a896edde4448f1fbdc6
Signed-off-by: Jan Matyas <matyas@codasip.com>
Reviewed-on: http://openocd.zylin.com/5151
Tested-by: jenkins
Reviewed-by: Franck Jullien <franck.jullien@gmail.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
bscan_optimization
Jan Matyas 2019-05-06 07:20:33 +02:00 committed by Tomas Vanek
parent 6dab4c70c8
commit b3d4c97b9f
1 changed files with 21 additions and 1 deletions

View File

@ -328,7 +328,27 @@ static int jtag_vpi_runtest(int cycles, tap_state_t state)
static int jtag_vpi_stableclocks(int cycles) static int jtag_vpi_stableclocks(int cycles)
{ {
return jtag_vpi_queue_tdi(NULL, cycles, TAP_SHIFT); uint8_t tms_bits[4];
int cycles_remain = cycles;
int nb_bits;
int retval;
const int CYCLES_ONE_BATCH = sizeof(tms_bits) * 8;
assert(cycles >= 0);
/* use TMS=1 in TAP RESET state, TMS=0 in all other stable states */
memset(&tms_bits, (tap_get_state() == TAP_RESET) ? 0xff : 0x00, sizeof(tms_bits));
/* send the TMS bits */
while (cycles_remain > 0) {
nb_bits = (cycles_remain < CYCLES_ONE_BATCH) ? cycles_remain : CYCLES_ONE_BATCH;
retval = jtag_vpi_tms_seq(tms_bits, nb_bits);
if (retval != ERROR_OK)
return retval;
cycles_remain -= nb_bits;
}
return ERROR_OK;
} }
static int jtag_vpi_execute_queue(void) static int jtag_vpi_execute_queue(void)