summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jtag/jtag.c68
-rw-r--r--src/jtag/jtag.h4
-rw-r--r--src/target/arm_jtag.c17
-rw-r--r--src/target/arm_jtag.h6
4 files changed, 70 insertions, 25 deletions
diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c
index eba09549..68706141 100644
--- a/src/jtag/jtag.c
+++ b/src/jtag/jtag.c
@@ -521,15 +521,65 @@ static void jtag_prelude(tap_state_t state)
cmd_queue_cur_state = cmd_queue_end_state;
}
-void jtag_add_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
+void jtag_add_ir_scan_noverify(int num_fields, scan_field_t *fields, tap_state_t state)
{
int retval;
-
jtag_prelude(state);
retval=interface_jtag_add_ir_scan(num_fields, fields, cmd_queue_end_state);
if (retval!=ERROR_OK)
jtag_error=retval;
+
+}
+
+
+void jtag_add_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
+{
+ /* 8 x 32 bit id's is enough for all invoations */
+ u32 id[8];
+ int modified[8];
+
+ /* if we are to run a verification of the ir scan, we need to get the input back.
+ * We may have to allocate space if the caller didn't ask for the input back.
+ *
+ */
+ if (jtag_verify_capture_ir)
+ {
+ int j;
+ for (j = 0; j < num_fields; j++)
+ {
+ modified[j]=0;
+ if ((fields[j].in_value==NULL)&&(fields[j].num_bits<=32))
+ {
+ if (j<8)
+ {
+ modified[j]=1;
+ fields[j].in_value=(u8 *)(id+j);
+ } else
+ {
+ LOG_DEBUG("caller must provide in_value space for verify_capture_ir to work");
+ }
+ }
+ }
+ }
+
+ jtag_add_ir_scan_noverify(num_fields, fields, state);
+
+ if (jtag_verify_capture_ir)
+ {
+ int j;
+ for (j = 0; j < num_fields; j++)
+ {
+ jtag_tap_t *tap=fields[j].tap;
+ jtag_check_value_mask(fields+j, tap->expected, tap->expected_mask);
+
+ if (modified[j])
+ {
+ fields[j].in_value=NULL;
+ }
+ }
+ }
+
}
int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
@@ -582,20 +632,6 @@ int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields,
found = 1;
(*last_cmd)->cmd.scan->fields[nth_tap].out_value = buf_cpy(fields[j].out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
- if (jtag_verify_capture_ir)
- {
- if (fields[j].in_handler==NULL)
- {
- jtag_set_check_value((*last_cmd)->cmd.scan->fields+nth_tap, tap->expected, tap->expected_mask, NULL);
- } else
- {
- (*last_cmd)->cmd.scan->fields[nth_tap].in_handler = fields[j].in_handler;
- (*last_cmd)->cmd.scan->fields[nth_tap].in_handler_priv = fields[j].in_handler_priv;
- (*last_cmd)->cmd.scan->fields[nth_tap].in_check_value = tap->expected;
- (*last_cmd)->cmd.scan->fields[nth_tap].in_check_mask = tap->expected_mask;
- }
- }
-
tap->bypass = 0;
break;
}
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index 6e3df55d..656741f9 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -559,6 +559,8 @@ extern int jtag_register_commands(struct command_context_s* cmd_ctx);
*
*/
extern void jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+/* same as jtag_add_ir_scan except no verify is performed */
+extern void jtag_add_ir_scan_noverify(int num_fields, scan_field_t *fields, tap_state_t state);
extern int interface_jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
extern void jtag_add_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
/* same as jtag_add_dr_scan but the scan is executed immediately. sets jtag_error if there
@@ -731,7 +733,7 @@ extern int jtag_srst_asserted(int* srst_asserted);
/* JTAG support functions */
struct invalidstruct
{
-
+
};
extern void jtag_set_check_value(scan_field_t* field, u8* value, u8* mask, struct invalidstruct *obsolete);
diff --git a/src/target/arm_jtag.c b/src/target/arm_jtag.c
index 951967e8..1732aac7 100644
--- a/src/target/arm_jtag.c
+++ b/src/target/arm_jtag.c
@@ -36,7 +36,7 @@
#define _ARM_JTAG_SCAN_N_CHECK_
#endif
-int arm_jtag_set_instr(arm_jtag_t *jtag_info, u32 new_instr, in_handler_t handler)
+int arm_jtag_set_instr(arm_jtag_t *jtag_info, u32 new_instr, void *no_verify_capture)
{
jtag_tap_t *tap;
tap = jtag_info->tap;
@@ -52,13 +52,20 @@ int arm_jtag_set_instr(arm_jtag_t *jtag_info, u32 new_instr, in_handler_t handl
field.num_bits = tap->ir_length;
field.out_value = t;
buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
-
field.in_value = NULL;
+ field.in_handler = NULL;
- field.in_handler = handler; /* deprecated! move into calling code */
-
- jtag_add_ir_scan(1, &field, TAP_INVALID);
+ if (no_verify_capture==NULL)
+ {
+ jtag_add_ir_scan(1, &field, TAP_INVALID);
+ } else
+ {
+ /* FIX!!!! this is a kludge!!! arm926ejs.c should reimplement this arm_jtag_set_instr to
+ * have special verification code.
+ */
+ jtag_add_ir_scan_noverify(1, &field, TAP_INVALID);
+ }
}
return ERROR_OK;
diff --git a/src/target/arm_jtag.h b/src/target/arm_jtag.h
index da004fce..fff3e79e 100644
--- a/src/target/arm_jtag.h
+++ b/src/target/arm_jtag.h
@@ -29,15 +29,15 @@
typedef struct arm_jtag_s
{
jtag_tap_t *tap;
-
+
u32 scann_size;
u32 scann_instr;
u32 cur_scan_chain;
-
+
u32 intest_instr;
} arm_jtag_t;
-extern int arm_jtag_set_instr(arm_jtag_t *jtag_info, u32 new_instr, in_handler_t handler);
+extern int arm_jtag_set_instr(arm_jtag_t *jtag_info, u32 new_instr, void *verify_capture);
extern int arm_jtag_scann(arm_jtag_t *jtag_info, u32 new_scan_chain);
extern int arm_jtag_setup_connection(arm_jtag_t *jtag_info);