zy1000: embedded ice dcc tweak

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>
This commit is contained in:
Øyvind Harboe 2010-03-08 08:32:45 +01:00
parent 50dc56a488
commit 7a5c9c2f4a
1 changed files with 48 additions and 21 deletions

View 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); 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; /* bypass bits before and after */
tap_state_t end_state = jtag_get_end_state(); int pre_bits = 0;
if (jtag_tap_next_enabled(jtag_tap_next_enabled(NULL)) == NULL) 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 */ nextTap = jtag_tap_next_enabled(cur_tap);
if (little) if (cur_tap == tap)
{ {
int i; found = true;
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;
}
} else } else
{ {
int i; if (found)
for (i = 0; i < count; i++)
{ {
shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, 0)); post_bits++;
shiftValueInner(TAP_DRSHIFT, end_state, 6, reg_addr | (1 << 5)); } else
buffer += 4; {
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; int i;
for (i = 0; i < count; 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)); embeddedice_write_reg_inner(tap, reg_addr, fast_target_buffer_get_u32(buffer, little));
buffer += 4; 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 */ /* bypass bits before and after */
int pre_bits = 0; int pre_bits;
int post_bits = 0; int post_bits;
jtag_pre_post_bits(tap, &pre_bits, &post_bits);
bool found = false; bool found = false;
struct jtag_tap *cur_tap, *nextTap; 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); value |= (*t++<<24);
shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, value); shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, value);
/* minimum 2 bits */
shiftValueInner(TAP_DRSHIFT, TAP_DRPAUSE, post_bits, 0); shiftValueInner(TAP_DRSHIFT, TAP_DRPAUSE, post_bits, 0);
#if 1 #if 1