pull up verify_capture_ir one level in api stack
git-svn-id: svn://svn.berlios.de/openocd/trunk@1669 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
bf4da345ec
commit
4f19ef3cce
|
@ -521,15 +521,65 @@ static void jtag_prelude(tap_state_t state)
|
||||||
cmd_queue_cur_state = cmd_queue_end_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;
|
int retval;
|
||||||
|
|
||||||
jtag_prelude(state);
|
jtag_prelude(state);
|
||||||
|
|
||||||
retval=interface_jtag_add_ir_scan(num_fields, fields, cmd_queue_end_state);
|
retval=interface_jtag_add_ir_scan(num_fields, fields, cmd_queue_end_state);
|
||||||
if (retval!=ERROR_OK)
|
if (retval!=ERROR_OK)
|
||||||
jtag_error=retval;
|
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)
|
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;
|
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);
|
(*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;
|
tap->bypass = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
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 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);
|
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
|
/* 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 */
|
/* JTAG support functions */
|
||||||
struct invalidstruct
|
struct invalidstruct
|
||||||
{
|
{
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void jtag_set_check_value(scan_field_t* field, u8* value, u8* mask, struct invalidstruct *obsolete);
|
extern void jtag_set_check_value(scan_field_t* field, u8* value, u8* mask, struct invalidstruct *obsolete);
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#define _ARM_JTAG_SCAN_N_CHECK_
|
#define _ARM_JTAG_SCAN_N_CHECK_
|
||||||
#endif
|
#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;
|
jtag_tap_t *tap;
|
||||||
tap = jtag_info->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.num_bits = tap->ir_length;
|
||||||
field.out_value = t;
|
field.out_value = t;
|
||||||
buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
|
buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
|
||||||
|
|
||||||
field.in_value = NULL;
|
field.in_value = NULL;
|
||||||
|
field.in_handler = NULL;
|
||||||
|
|
||||||
|
|
||||||
field.in_handler = handler; /* deprecated! move into calling code */
|
if (no_verify_capture==NULL)
|
||||||
|
{
|
||||||
jtag_add_ir_scan(1, &field, TAP_INVALID);
|
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;
|
return ERROR_OK;
|
||||||
|
|
|
@ -29,15 +29,15 @@
|
||||||
typedef struct arm_jtag_s
|
typedef struct arm_jtag_s
|
||||||
{
|
{
|
||||||
jtag_tap_t *tap;
|
jtag_tap_t *tap;
|
||||||
|
|
||||||
u32 scann_size;
|
u32 scann_size;
|
||||||
u32 scann_instr;
|
u32 scann_instr;
|
||||||
u32 cur_scan_chain;
|
u32 cur_scan_chain;
|
||||||
|
|
||||||
u32 intest_instr;
|
u32 intest_instr;
|
||||||
} arm_jtag_t;
|
} 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_scann(arm_jtag_t *jtag_info, u32 new_scan_chain);
|
||||||
extern int arm_jtag_setup_connection(arm_jtag_t *jtag_info);
|
extern int arm_jtag_setup_connection(arm_jtag_t *jtag_info);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue