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:
parent
50dc56a488
commit
7a5c9c2f4a
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue