Committed.

This pulls up verify_captuer_ir one level in the api stack.

-- 
Øyvind Harboe
Embedded software and hardware consulting services
http://consulting.zylin.com
### Eclipse Workspace Patch 1.0
#P openocd
Index: src/target/arm_jtag.h
===================================================================
--- src/target/arm_jtag.h       (revision 1668)
+++ src/target/arm_jtag.h       (working copy)
@@ -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);
 
Index: src/jtag/jtag.h
===================================================================
--- src/jtag/jtag.h     (revision 1664)
+++ src/jtag/jtag.h     (working copy)
@@ -559,6 +559,8 @@
  *
  */
 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 @@
 /* JTAG support functions */
 struct invalidstruct
 {
-       
+
 };
 
 extern void           jtag_set_check_value(scan_field_t* field, u8* value, u8* 
mask, struct invalidstruct *obsolete);
Index: src/jtag/jtag.c
===================================================================
--- src/jtag/jtag.c     (revision 1664)
+++ src/jtag/jtag.c     (working copy)
@@ -521,15 +521,65 @@
        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 @@
                                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;
                        }
Index: src/target/arm_jtag.c
===================================================================
--- src/target/arm_jtag.c       (revision 1668)
+++ src/target/arm_jtag.c       (working copy)
@@ -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 @@
                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;
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to