summaryrefslogtreecommitdiff
path: root/src/target/arm_jtag.c
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-05-07 14:25:34 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-05-07 14:25:34 +0000
commitee793f0fcbd2d7e4ad08e61d242ba178e8909b45 (patch)
tree772607aa303278b216305ccf40fc88d76511edf2 /src/target/arm_jtag.c
parenta197e759ffcb047a383adf686966f68934fef206 (diff)
downloadopenocd+libswd-ee793f0fcbd2d7e4ad08e61d242ba178e8909b45.tar.gz
openocd+libswd-ee793f0fcbd2d7e4ad08e61d242ba178e8909b45.tar.bz2
openocd+libswd-ee793f0fcbd2d7e4ad08e61d242ba178e8909b45.tar.xz
openocd+libswd-ee793f0fcbd2d7e4ad08e61d242ba178e8909b45.zip
This matters for embedded devices, but is probably not observably better for PC hosted OpenOCD.
git-svn-id: svn://svn.berlios.de/openocd/trunk@647 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/target/arm_jtag.c')
-rw-r--r--src/target/arm_jtag.c36
1 files changed, 11 insertions, 25 deletions
diff --git a/src/target/arm_jtag.c b/src/target/arm_jtag.c
index 02dc2e19..77c81871 100644
--- a/src/target/arm_jtag.c
+++ b/src/target/arm_jtag.c
@@ -40,10 +40,11 @@ int arm_jtag_set_instr(arm_jtag_t *jtag_info, u32 new_instr, in_handler_t handl
if (buf_get_u32(device->cur_instr, 0, device->ir_length) != new_instr)
{
scan_field_t field;
+ u8 t[4];
field.device = jtag_info->chain_pos;
field.num_bits = device->ir_length;
- field.out_value = calloc(CEIL(field.num_bits, 8), 1);
+ field.out_value = t;
buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
field.out_mask = NULL;
field.in_value = NULL;
@@ -52,9 +53,6 @@ int arm_jtag_set_instr(arm_jtag_t *jtag_info, u32 new_instr, in_handler_t handl
field.in_handler = handler;
field.in_handler_priv = NULL;
jtag_add_ir_scan(1, &field, -1);
-
-
- free(field.out_value);
}
return ERROR_OK;
@@ -64,32 +62,20 @@ int arm_jtag_scann(arm_jtag_t *jtag_info, u32 new_scan_chain)
{
if(jtag_info->cur_scan_chain != new_scan_chain)
{
-#ifdef _ARM_JTAG_SCAN_N_CHECK_
- u8 scan_n_check_value = 1 << (jtag_info->scann_size - 1);
-#endif
- scan_field_t field;
-
- field.device = jtag_info->chain_pos;
- field.num_bits = jtag_info->scann_size;
- field.out_value = calloc(CEIL(field.num_bits, 8), 1);
- buf_set_u32(field.out_value, 0, field.num_bits, new_scan_chain);
- field.out_mask = NULL;
- field.in_value = NULL;
-#ifdef _ARM_JTAG_SCAN_N_CHECK_
-#error FIX!!! this is broken, scan_n_check_value goes out of scope.
- jtag_set_check_value(&field, &scan_n_check_value, NULL, NULL, NULL);
-#else
- field.in_handler = NULL;
- field.in_handler_priv = NULL;
-#endif
+ u32 values[1];
+ int num_bits[1];
+ values[0]=new_scan_chain;
+ num_bits[0]=jtag_info->scann_size;
arm_jtag_set_instr(jtag_info, jtag_info->scann_instr, NULL);
- jtag_add_dr_scan(1, &field, -1);
+ jtag_add_dr_out(jtag_info->chain_pos,
+ 1,
+ num_bits,
+ values,
+ -1);
jtag_info->cur_scan_chain = new_scan_chain;
-
- free(field.out_value);
}
return ERROR_OK;