+
+
+int jtag_check_value_inner(u8 *captured, u8 *in_check_value, u8 *in_check_mask, int num_bits);
+
+static int jtag_check_value_mask_callback(u8 *in, jtag_callback_data_t data1, jtag_callback_data_t data2, jtag_callback_data_t data3)
+{
+ return jtag_check_value_inner(in, (u8 *)data1, (u8 *)data2, (int)data3);
+}
+
+static void jtag_add_scan_check(void (*jtag_add_scan)(int in_num_fields, const scan_field_t *in_fields, tap_state_t state),
+ int in_num_fields, scan_field_t *in_fields, tap_state_t state)
+{
+ for (int i = 0; i < in_num_fields; i++)
+ {
+ in_fields[i].allocated = 0;
+ in_fields[i].modified = 0;
+ if ((in_fields[i].check_value != NULL) && (in_fields[i].in_value == NULL))
+ {
+ in_fields[i].modified = 1;
+ /* we need storage space... */
+#ifdef HAVE_JTAG_MINIDRIVER_H
+ if (in_fields[i].num_bits <= 32)
+ {
+ /* This is enough space and we're executing this synchronously */
+ in_fields[i].in_value = in_fields[i].intmp;
+ } else
+ {
+ in_fields[i].in_value = (u8 *)malloc(CEIL(in_fields[i].num_bits, 8));
+ in_fields[i].allocated = 1;
+ }
+#else
+ in_fields[i].in_value = (u8 *)cmd_queue_alloc(CEIL(in_fields[i].num_bits, 8));
+#endif
+ }
+ }
+
+ jtag_add_scan(in_num_fields, in_fields, state);
+
+ for (int i = 0; i < in_num_fields; i++)
+ {
+ if ((in_fields[i].check_value != NULL) && (in_fields[i].in_value != NULL))
+ {
+ /* this is synchronous for a minidriver */
+ jtag_add_callback4(jtag_check_value_mask_callback, in_fields[i].in_value,
+ (jtag_callback_data_t)in_fields[i].check_value,
+ (jtag_callback_data_t)in_fields[i].check_mask,
+ (jtag_callback_data_t)in_fields[i].num_bits);
+ }
+ if (in_fields[i].allocated)
+ {
+ free(in_fields[i].in_value);
+ }
+ if (in_fields[i].modified)
+ {
+ in_fields[i].in_value = NULL;
+ }
+ }
+}
+
+void jtag_add_dr_scan_check(int in_num_fields, scan_field_t *in_fields, tap_state_t state)
+{
+ if (jtag_verify)
+ {
+ jtag_add_scan_check(jtag_add_dr_scan, in_num_fields, in_fields, state);
+ } else
+ {
+ jtag_add_dr_scan(in_num_fields, in_fields, state);
+ }
+}
+
+
+/**
+ * Generate a DR SCAN using the fields passed to the function
+ *
+ * For not bypassed TAPs the function checks in_fields and uses fields specified there.
+ * For bypassed TAPs the function generates a dummy 1bit field.
+ *
+ * The bypass status of TAPs is set by jtag_add_ir_scan().
+ *
+ */
+void jtag_add_dr_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state)