michal smulski <michal.smulski@ooma.com> fix regression in jtag_add_pathmove() which...
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 17 Sep 2009 12:25:53 +0000 (12:25 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Thu, 17 Sep 2009 12:25:53 +0000 (12:25 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@2722 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/ft2232.c

index 1a49df9cba0210f34f0e25cc6456840bc6126624..10fa1b42e9a4cec10f52c5faaaf3796669014383 100644 (file)
@@ -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());
 }