> A closer look, for configured taps not in the list of taps used in the
> scan_field array passed to the function the default values should be
>
> scan_size = tap->ir_length;
> (*last_cmd)->cmd.scan->fields[nth_tap].tap = tap;
> (*last_cmd)->cmd.scan->fields[nth_tap].num_bits = scan_size;
> (*last_cmd)->cmd.scan->fields[nth_tap].in_value = NULL;
> <============================ set default
> (*last_cmd)->cmd.scan->fields[nth_tap].in_handler = NULL; /*
> disable verification by default */
>
>
> not
>
> scan_size = tap->ir_length;
> (*last_cmd)->cmd.scan->fields[nth_tap].tap = tap;
> (*last_cmd)->cmd.scan->fields[nth_tap].num_bits = scan_size;
> (*last_cmd)->cmd.scan->fields[nth_tap].in_value =
> fields[nth_tap].in_value; <============= this does not exist !
>
>
> Compare to the original.
Ah. Gotit. How is the attached patch?
Ouch. I'm turning into a pumpkin and the attached patch is only half
a fix, because it seems to have uncovered some other problem when
I connect to STM32...
Error: BUG: all the scan fields where not filled out 1 2!
--
Øyvind Harboe
Embedded software and hardware consulting services
http://consulting.zylin.com
### Eclipse Workspace Patch 1.0
#P openocd
Index: src/jtag/jtag.c
===================================================================
--- src/jtag/jtag.c (revision 1676)
+++ src/jtag/jtag.c (working copy)
@@ -45,6 +45,7 @@
int jtag_flush_queue_count; /* count # of flushes for profiling / debugging
purposes */
+
/* 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
*/
@@ -541,7 +542,6 @@
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.
*
@@ -621,10 +621,16 @@
break;
}
nth_tap++;
+
+ if (nth_tap >= x )
+ {
+ LOG_ERROR("BUG: not enough fields allocated!");
+ }
+
scan_size = tap->ir_length;
(*last_cmd)->cmd.scan->fields[nth_tap].tap = tap;
(*last_cmd)->cmd.scan->fields[nth_tap].num_bits = scan_size;
- (*last_cmd)->cmd.scan->fields[nth_tap].in_value =
fields[nth_tap].in_value;
+ (*last_cmd)->cmd.scan->fields[nth_tap].in_value = NULL;
/* search the list */
for (j = 0; j < num_fields; j++)
@@ -632,6 +638,7 @@
if (tap == fields[j].tap)
{
found = 1;
+ (*last_cmd)->cmd.scan->fields[nth_tap].in_value
= fields[j].in_value;
(*last_cmd)->cmd.scan->fields[nth_tap].out_value = buf_cpy(fields[j].out_value,
cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
tap->bypass = 0;
@@ -649,6 +656,10 @@
/* update device information */
buf_cpy((*last_cmd)->cmd.scan->fields[nth_tap].out_value,
tap->cur_instr, scan_size);
}
+ if (nth_tap != x )
+ {
+ LOG_ERROR("BUG: all the scan fields where not filled out %d
%d!", nth_tap, x);
+ }
return ERROR_OK;
}
@@ -1450,7 +1461,7 @@
/* each flush can take as much as 1-2ms on high bandwidth low latency
interfaces.
* E.g. a JTAG over TCP/IP or USB....
*/
- jtag_flush_queue_count++;
+ jtag_flush_queue_count++;
int retval=interface_jtag_execute_queue();
/* we keep the first error */
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development