]> git.sur5r.net Git - openocd/commitdiff
zy1000: embedded ice dcc tweak
authorØyvind Harboe <oyvind.harboe@zylin.com>
Mon, 8 Mar 2010 07:32:45 +0000 (08:32 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Mon, 8 Mar 2010 07:37:13 +0000 (08:37 +0100)
How many bits to shift out before/after enabled tap not
in bypass is calculated outside the loop. This is more of
a demonstration of principle and to clarify code than
a performance optimisation as such. Follows up a bit
on the simplification work in jtag interface.

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

index 65d84026079504d56d8016d67925f3f1b3104098..005a4e02e4393dac7fd7310a89eb07e1f892f259 100644 (file)
@@ -803,34 +803,43 @@ int interface_jtag_add_pathmove(int num_states, const tap_state_t *path)
        return interface_add_tms_seq(state_count, seq, cur_state);
 }
 
-void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer, int little, int count)
+static void jtag_pre_post_bits(struct jtag_tap *tap, int *pre, int *post)
 {
-//     static int const reg_addr = 0x5;
-       tap_state_t end_state = jtag_get_end_state();
-       if (jtag_tap_next_enabled(jtag_tap_next_enabled(NULL)) == NULL)
+       /* bypass bits before and after */
+       int pre_bits = 0;
+       int post_bits = 0;
+
+       bool found = false;
+       struct jtag_tap *cur_tap, *nextTap;
+       for (cur_tap = jtag_tap_next_enabled(NULL); cur_tap!= NULL; cur_tap = nextTap)
        {
-               /* better performance via code duplication */
-               if (little)
+               nextTap = jtag_tap_next_enabled(cur_tap);
+               if (cur_tap == tap)
                {
-                       int i;
-                       for (i = 0; i < count; i++)
-                       {
-                               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, 1));
-                               shiftValueInner(TAP_DRSHIFT, end_state, 6, reg_addr | (1 << 5));
-                               buffer += 4;
-                       }
+                       found = true;
                } else
                {
-                       int i;
-                       for (i = 0; i < count; i++)
+                       if (found)
                        {
-                               shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, 0));
-                               shiftValueInner(TAP_DRSHIFT, end_state, 6, reg_addr | (1 << 5));
-                               buffer += 4;
+                               post_bits++;
+                       } else
+                       {
+                               pre_bits++;
                        }
                }
        }
-       else
+       *pre = pre_bits;
+       *post = post_bits;
+}
+
+void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer, int little, int count)
+{
+
+       int pre_bits;
+       int post_bits;
+       jtag_pre_post_bits(tap, &pre_bits, &post_bits);
+
+       if ((pre_bits > 32) || (post_bits > 32))
        {
                int i;
                for (i = 0; i < count; i++)
@@ -838,6 +847,22 @@ void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer,
                        embeddedice_write_reg_inner(tap, reg_addr, fast_target_buffer_get_u32(buffer, little));
                        buffer += 4;
                }
+       } else
+       {
+               tap_state_t end_state = jtag_get_end_state();
+               tap_state_t shift_end_state;
+               if (post_bits == 0)
+                       shift_end_state = end_state;
+
+               int i;
+               for (i = 0; i < count; i++)
+               {
+                       shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0);
+                       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);
+                       buffer += 4;
+               }
        }
 }
 
@@ -858,8 +883,9 @@ int arm11_run_instr_data_to_core_noack_inner(struct jtag_tap * tap, uint32_t opc
 
 
        /* bypass bits before and after */
-       int pre_bits = 0;
-       int post_bits = 0;
+       int pre_bits;
+       int post_bits;
+       jtag_pre_post_bits(tap, &pre_bits, &post_bits);
 
        bool found = false;
        struct jtag_tap *cur_tap, *nextTap;
@@ -895,6 +921,7 @@ int arm11_run_instr_data_to_core_noack_inner(struct jtag_tap * tap, uint32_t opc
                value |= (*t++<<24);
 
                shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, value);
+               /* minimum 2 bits */
                shiftValueInner(TAP_DRSHIFT, TAP_DRPAUSE, post_bits, 0);
 
 #if 1