#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
-#include <assert.h>
+
int jtag_flush_queue_count; /* count # of flushes for profiling / debugging purposes */
+static void jtag_add_scan_check(void (*jtag_add_scan)(int num_fields, scan_field_t *fields, tap_state_t state),
+ int num_fields, scan_field_t *fields, tap_state_t state);
/* note that this is not marked as static as it must be available from outside jtag.c for those
that implement the jtag_xxx() minidriver layer
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++)
{
- int j;
- for (j = 0; j < num_fields; j++)
+ fields[j].check_value=NULL;
+ fields[j].check_mask=NULL;
+ /* 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)
{
- jtag_tap_t *tap=fields[j].tap;
- if (fields[j].in_value!=NULL)
- {
- /* we verify max 32 bit long irlens. */
- jtag_check_value_mask(fields+j, tap->expected, tap->expected_mask);
- }
-
- if (modified[j])
- {
- fields[j].in_value=NULL;
- }
+ fields[j].check_value=fields[j].tap->expected;
+ fields[j].check_mask=fields[j].tap->expected_mask;
}
}
+ jtag_add_scan_check(jtag_add_ir_scan_noverify, num_fields, fields, state);
}
int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
return jtag_check_value_inner(in, (u8 *)data1, (u8 *)data2, (int)data3);
}
-void jtag_add_dr_scan_check(int num_fields, scan_field_t *fields, tap_state_t state)
+static void jtag_add_scan_check(void (*jtag_add_scan)(int num_fields, scan_field_t *fields, tap_state_t state),
+ int num_fields, scan_field_t *fields, tap_state_t state)
{
for (int i=0; i<num_fields; i++)
{
if (fields[i].num_bits<=32)
{
/* This is enough space and we're executing this synchronously */
- fields[i].in_value=(u8 *)&fields[i].intmp;
+ fields[i].in_value=fields[i].intmp;
} else
{
fields[i].in_value=(u8 *)malloc(CEIL(fields[i].num_bits, 8));
}
}
- jtag_add_dr_scan(num_fields, fields, state);
+ jtag_add_scan(num_fields, fields, state);
for (int i=0; i<num_fields; i++)
{
if ((fields[i].check_value!=NULL)&&(fields[i].in_value!=NULL))
{
/* this is synchronous for a minidriver */
- jtag_add_callback4(jtag_check_value_mask_callback, fields[i].in_value, fields[i].check_value, fields[i].check_mask, (jtag_callback_data_t)fields[i].num_bits);
+ jtag_add_callback4(jtag_check_value_mask_callback, fields[i].in_value, (jtag_callback_data_t)fields[i].check_value, (jtag_callback_data_t)fields[i].check_mask, (jtag_callback_data_t)fields[i].num_bits);
}
if (fields[i].allocated)
{
fields[i].in_value=NULL;
}
}
+}
-
+void jtag_add_dr_scan_check(int num_fields, scan_field_t *fields, tap_state_t state)
+{
+ jtag_add_scan_check(jtag_add_dr_scan, num_fields, fields, state);
}
+
+
+
int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
{
int j;
}
}
- fields = malloc(sizeof(scan_field_t) * argc / 2);
+ int num_fields= num_fields;
- for (i = 0; i < argc / 2; i++)
+ fields = malloc(sizeof(scan_field_t) * num_fields);
+
+ for (i = 0; i < num_fields; i++)
{
tap = jtag_TapByString( args[i*2] );
if (tap==NULL)
}
int field_size = tap->ir_length;
fields[i].tap = tap;
+ fields[i].num_bits = field_size;
fields[i].out_value = malloc(CEIL(field_size, 8));
buf_set_u32(fields[i].out_value, 0, field_size, strtoul(args[i*2+1], NULL, 0));
fields[i].in_value = NULL;
}
- jtag_add_ir_scan(argc / 2, fields, TAP_INVALID);
+ jtag_add_ir_scan(num_fields, fields, TAP_INVALID);
/* did we have an endstate? */
if (endstate != TAP_INVALID)
jtag_add_end_state(endstate);
jtag_execute_queue();
- for (i = 0; i < argc / 2; i++)
+ for (i = 0; i < num_fields; i++)
free(fields[i].out_value);
free (fields);
}
#endif // _DEBUG_JTAG_IO_
+#ifndef HAVE_JTAG_MINIDRIVER_H
+void jtag_alloc_in_value32(scan_field_t *field)
+{
+ field->in_value=(u8 *)cmd_queue_alloc(4);
+}
+#endif
+
+
/*-----</Cable Helper API>--------------------------------------*/