diff options
author | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-09-17 12:25:53 +0000 |
---|---|---|
committer | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-09-17 12:25:53 +0000 |
commit | 84f51bf50cfd2e93914b017533ef8c7f89982183 (patch) | |
tree | 6dfdba12be63acb0a24c64246bdae0cf1a43be06 /src/jtag/ft2232.c | |
parent | 1dd302883d7109eb0cb97cb4e6df9b5320e00889 (diff) | |
download | riscv-openocd-84f51bf50cfd2e93914b017533ef8c7f89982183.zip riscv-openocd-84f51bf50cfd2e93914b017533ef8c7f89982183.tar.gz riscv-openocd-84f51bf50cfd2e93914b017533ef8c7f89982183.tar.bz2 |
michal smulski <michal.smulski@ooma.com> fix regression in jtag_add_pathmove() which broke arm11 in r1825. Other uses of jtag_add_pathmove are svn + xsvf + xscale...
git-svn-id: svn://svn.berlios.de/openocd/trunk@2722 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/jtag/ft2232.c')
-rw-r--r-- | src/jtag/ft2232.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/src/jtag/ft2232.c b/src/jtag/ft2232.c index 1a49df9..10fa1b4 100644 --- a/src/jtag/ft2232.c +++ b/src/jtag/ft2232.c @@ -766,33 +766,45 @@ static int ft2232_send_and_recv(jtag_command_t* first, jtag_command_t* last) */ static void ft2232_add_pathmove(tap_state_t* path, int num_states) { - int tms_bits = 0; - int state_ndx; - tap_state_t walker = tap_get_state(); + int state_count = 0; assert((unsigned) num_states <= 32u); /* tms_bits only holds 32 bits */ /* this loop verifies that the path is legal and logs each state in the path */ - for (state_ndx = 0; state_ndx < num_states; ++state_ndx) + while (num_states) { - tap_state_t desired_next_state = path[state_ndx]; + unsigned char tms_byte = 0; /* zero this on each MPSSE batch */ - if (tap_state_transition(walker, false) == desired_next_state) - ; /* bit within tms_bits at index state_ndx is already zero */ - else if (tap_state_transition(walker, true) == desired_next_state) - tms_bits |= (1 << state_ndx); - else - { - LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", - tap_state_name(walker), tap_state_name(desired_next_state)); - exit(-1); - } + int bit_count = 0; - walker = desired_next_state; - } + int num_states_batch = num_states > 7 ? 7 : num_states; + + /* command "Clock Data to TMS/CS Pin (no Read)" */ + buffer_write(0x4b); - clock_tms(0x4b, tms_bits, num_states, 0); + /* number of states remaining */ + buffer_write(num_states_batch - 1); + + while (num_states_batch--) + { + if (tap_state_transition(tap_get_state(), false) == path[state_count]) + buf_set_u32(&tms_byte, bit_count++, 1, 0x0); + else if (tap_state_transition(tap_get_state(), true) == path[state_count]) + buf_set_u32(&tms_byte, bit_count++, 1, 0x1); + else + { + LOG_ERROR( "BUG: %s -> %s isn't a valid TAP transition", tap_state_name( + tap_get_state() ), tap_state_name(path[state_count]) ); + exit(-1); + } + + tap_set_state(path[state_count]); + state_count++; + num_states--; + } + buffer_write(tms_byte); + } tap_set_end_state(tap_get_state()); } |