]> git.sur5r.net Git - openocd/blobdiff - src/jtag/jtag.c
Include config.h in pregenerated rlink_speed_table.c source.
[openocd] / src / jtag / jtag.c
index e2e324a49406d0326f5d3715c96e217b99f842d0..d66a779d13f818fdd749f38b049d7b64c448c161 100644 (file)
 #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
@@ -549,54 +551,22 @@ void jtag_add_ir_scan_noverify(int num_fields, scan_field_t *fields, tap_state_t
 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)
@@ -733,7 +703,8 @@ static int jtag_check_value_mask_callback(u8 *in, jtag_callback_data_t data1, jt
        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++)
        {
@@ -747,7 +718,7 @@ void jtag_add_dr_scan_check(int num_fields, scan_field_t *fields, tap_state_t st
                        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));
@@ -759,14 +730,14 @@ void jtag_add_dr_scan_check(int num_fields, scan_field_t *fields, tap_state_t st
                }
        }
 
-       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)
                {
@@ -777,10 +748,16 @@ void jtag_add_dr_scan_check(int num_fields, scan_field_t *fields, tap_state_t st
                        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;
@@ -2912,9 +2889,11 @@ static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, c
                }
        }
 
-       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)
@@ -2924,19 +2903,20 @@ static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, c
                }
                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);
@@ -3582,4 +3562,12 @@ tap_state_t jtag_debug_state_machine(const void *tms_buf, const void *tdi_buf,
 }
 #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>--------------------------------------*/