diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jtag/jtag.c | 68 | ||||
-rw-r--r-- | src/jtag/jtag.h | 4 | ||||
-rw-r--r-- | src/target/arm_jtag.c | 17 | ||||
-rw-r--r-- | src/target/arm_jtag.h | 6 |
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); |