]> git.sur5r.net Git - openocd/commitdiff
zy1000: tweak the DCC inner loop a tiny bit
authorØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 16 Mar 2010 10:40:52 +0000 (11:40 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Wed, 17 Mar 2010 06:40:00 +0000 (07:40 +0100)
Uses FIFO a bit more efficiently now.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/jtag/zy1000/zy1000.c

index 005a4e02e4393dac7fd7310a89eb07e1f892f259..177d286d8be976e359f2f400de51b08b743687d4 100644 (file)
@@ -839,7 +839,7 @@ void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer,
        int post_bits;
        jtag_pre_post_bits(tap, &pre_bits, &post_bits);
 
-       if ((pre_bits > 32) || (post_bits > 32))
+       if (pre_bits + post_bits + 6 > 32)
        {
                int i;
                for (i = 0; i < count; i++)
@@ -854,15 +854,18 @@ void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer,
                if (post_bits == 0)
                        shift_end_state = end_state;
 
+               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0);
                int i;
-               for (i = 0; i < count; i++)
+               for (i = 0; i < count - 1; i++)
                {
-                       shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0);
+                       /* Fewer pokes means we get to use the FIFO more efficiently */
                        shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, little));
-                       shiftValueInner(TAP_DRSHIFT, shift_end_state, 6, reg_addr | (1 << 5));
-                       shiftValueInner(shift_end_state, end_state, post_bits, 0);
+                       shiftValueInner(TAP_DRSHIFT, shift_end_state, 6 + post_bits + pre_bits, (reg_addr | (1 << 5)));
                        buffer += 4;
                }
+               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, little));
+               shiftValueInner(TAP_DRSHIFT, shift_end_state, 6, reg_addr | (1 << 5));
+               shiftValueInner(shift_end_state, end_state, post_bits, 0);
        }
 }