aboutsummaryrefslogtreecommitdiff
path: root/src/target
diff options
context:
space:
mode:
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>2013-11-07 00:40:50 +0100
committerSpencer Oliver <spen@spen-soft.co.uk>2014-01-20 13:28:26 +0000
commit63fa73169bd88258ef82f709e79769eacc50f793 (patch)
tree5f259281041de2aa5d7097db46a64d4175279a96 /src/target
parent87e91f4db9bea66a7866261130c6152c0304bc29 (diff)
Retire jtag_add_dr_out
The out only version of jtag_add_dr_scan smells like a bogus optimization that complicates the minidriver API for questionable gain. The function was only used by four old ARM targets. Rewrite the callers to use the generic function and remove all implementations. Change-Id: I13b643687ee8ed6bc9b6336e7096c34f40ea96af Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/1801 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Diffstat (limited to 'src/target')
-rw-r--r--src/target/arm7tdmi.c14
-rw-r--r--src/target/arm_jtag.c12
-rw-r--r--src/target/embeddedice.h13
-rw-r--r--src/target/xscale.c36
4 files changed, 44 insertions, 31 deletions
diff --git a/src/target/arm7tdmi.c b/src/target/arm7tdmi.c
index 3dc00134..807efad1 100644
--- a/src/target/arm7tdmi.c
+++ b/src/target/arm7tdmi.c
@@ -95,12 +95,18 @@ static const int arm7tdmi_num_bits[] = {1, 32};
static inline int arm7tdmi_clock_out_inner(struct arm_jtag *jtag_info, uint32_t out, int breakpoint)
{
- uint32_t values[2] = {breakpoint, flip_u32(out, 32)};
+ uint8_t bp = breakpoint ? 1 : 0;
+ uint8_t out_value[4];
+ buf_set_u32(out_value, 0, 32, flip_u32(out, 32));
- jtag_add_dr_out(jtag_info->tap,
+ struct scan_field fields[2] = {
+ { .num_bits = arm7tdmi_num_bits[0], .out_value = &bp },
+ { .num_bits = arm7tdmi_num_bits[1], .out_value = out_value },
+ };
+
+ jtag_add_dr_scan(jtag_info->tap,
2,
- arm7tdmi_num_bits,
- values,
+ fields,
TAP_DRPAUSE);
jtag_add_runtest(0, TAP_DRPAUSE);
diff --git a/src/target/arm_jtag.c b/src/target/arm_jtag.c
index 1739a8a9..6f70e853 100644
--- a/src/target/arm_jtag.c
+++ b/src/target/arm_jtag.c
@@ -59,20 +59,18 @@ int arm_jtag_set_instr_inner(struct arm_jtag *jtag_info,
int arm_jtag_scann_inner(struct arm_jtag *jtag_info, uint32_t new_scan_chain, tap_state_t end_state)
{
int retval = ERROR_OK;
- uint32_t values[1];
- int num_bits[1];
- values[0] = new_scan_chain;
- num_bits[0] = jtag_info->scann_size;
+ uint8_t out_value[4];
+ buf_set_u32(out_value, 0, jtag_info->scann_size, new_scan_chain);
+ struct scan_field field = { .num_bits = jtag_info->scann_size, .out_value = out_value, };
retval = arm_jtag_set_instr(jtag_info, jtag_info->scann_instr, NULL, end_state);
if (retval != ERROR_OK)
return retval;
- jtag_add_dr_out(jtag_info->tap,
+ jtag_add_dr_scan(jtag_info->tap,
1,
- num_bits,
- values,
+ &field,
end_state);
jtag_info->cur_scan_chain = new_scan_chain;
diff --git a/src/target/embeddedice.h b/src/target/embeddedice.h
index af28d38f..f110e82e 100644
--- a/src/target/embeddedice.h
+++ b/src/target/embeddedice.h
@@ -112,13 +112,16 @@ int embeddedice_handshake(struct arm_jtag *jtag_info, int hsbit, uint32_t timeou
*/
static inline void embeddedice_write_reg_inner(struct jtag_tap *tap, int reg_addr, uint32_t value)
{
- static const int embeddedice_num_bits[] = {32, 6};
- uint32_t values[2];
+ uint8_t out_reg_addr = (1 << 5) | reg_addr;
+ uint8_t out_value[4];
+ buf_set_u32(out_value, 0, 32, value);
- values[0] = value;
- values[1] = (1 << 5) | reg_addr;
+ struct scan_field fields[2] = {
+ { .num_bits = 32, .out_value = out_value },
+ { .num_bits = 6, .out_value = &out_reg_addr },
+ };
- jtag_add_dr_out(tap, 2, embeddedice_num_bits, values, TAP_IDLE);
+ jtag_add_dr_scan(tap, 2, fields, TAP_IDLE);
}
void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, const uint8_t *buffer,
diff --git a/src/target/xscale.c b/src/target/xscale.c
index 388c8eb5..99f67aff 100644
--- a/src/target/xscale.c
+++ b/src/target/xscale.c
@@ -513,8 +513,6 @@ done:
static int xscale_send(struct target *target, const uint8_t *buffer, int count, int size)
{
struct xscale_common *xscale = target_to_xscale(target);
- uint32_t t[3];
- int bits[3];
int retval;
int done_count = 0;
@@ -522,37 +520,45 @@ static int xscale_send(struct target *target, const uint8_t *buffer, int count,
XSCALE_DBGRX << xscale->xscale_variant,
TAP_IDLE);
- bits[0] = 3;
- t[0] = 0;
- bits[1] = 32;
- t[2] = 1;
- bits[2] = 1;
+ static const uint8_t t0;
+ uint8_t t1[4];
+ static const uint8_t t2 = 1;
+ struct scan_field fields[3] = {
+ { .num_bits = 3, .out_value = &t0 },
+ { .num_bits = 32, .out_value = t1 },
+ { .num_bits = 1, .out_value = &t2 },
+ };
+
int endianness = target->endianness;
while (done_count++ < count) {
+ uint32_t t;
+
switch (size) {
case 4:
if (endianness == TARGET_LITTLE_ENDIAN)
- t[1] = le_to_h_u32(buffer);
+ t = le_to_h_u32(buffer);
else
- t[1] = be_to_h_u32(buffer);
+ t = be_to_h_u32(buffer);
break;
case 2:
if (endianness == TARGET_LITTLE_ENDIAN)
- t[1] = le_to_h_u16(buffer);
+ t = le_to_h_u16(buffer);
else
- t[1] = be_to_h_u16(buffer);
+ t = be_to_h_u16(buffer);
break;
case 1:
- t[1] = buffer[0];
+ t = buffer[0];
break;
default:
LOG_ERROR("BUG: size neither 4, 2 nor 1");
return ERROR_COMMAND_SYNTAX_ERROR;
}
- jtag_add_dr_out(target->tap,
+
+ buf_set_u32(t1, 0, 32, t);
+
+ jtag_add_dr_scan(target->tap,
3,
- bits,
- t,
+ fields,
TAP_IDLE);
buffer += size;
}