#include "command.h"
#include "log.h"
-#include "stdlib.h"
-#include "string.h"
+#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
/* 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
{
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);
- (*last_cmd)->cmd.scan->fields[nth_tap].out_mask = buf_cpy(fields[j].out_mask, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
if (jtag_verify_capture_ir)
{
{
/* if a tap isn't listed, set it to BYPASS */
(*last_cmd)->cmd.scan->fields[nth_tap].out_value = buf_set_ones(cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
- (*last_cmd)->cmd.scan->fields[nth_tap].out_mask = NULL;
tap->bypass = 1;
}
(*last_cmd)->cmd.scan->fields[i].tap = fields[i].tap;
(*last_cmd)->cmd.scan->fields[i].num_bits = num_bits;
(*last_cmd)->cmd.scan->fields[i].out_value = buf_cpy(fields[i].out_value, cmd_queue_alloc(num_bytes), num_bits);
- (*last_cmd)->cmd.scan->fields[i].out_mask = buf_cpy(fields[i].out_mask, cmd_queue_alloc(num_bytes), num_bits);
(*last_cmd)->cmd.scan->fields[i].in_value = fields[i].in_value;
(*last_cmd)->cmd.scan->fields[i].in_check_value = fields[i].in_check_value;
(*last_cmd)->cmd.scan->fields[i].in_check_mask = fields[i].in_check_mask;
scan_size = fields[j].num_bits;
(*last_cmd)->cmd.scan->fields[field_count].num_bits = scan_size;
(*last_cmd)->cmd.scan->fields[field_count].out_value = buf_cpy(fields[j].out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
- (*last_cmd)->cmd.scan->fields[field_count].out_mask = buf_cpy(fields[j].out_mask, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
(*last_cmd)->cmd.scan->fields[field_count].in_value = fields[j].in_value;
(*last_cmd)->cmd.scan->fields[field_count].in_check_value = fields[j].in_check_value;
(*last_cmd)->cmd.scan->fields[field_count].in_check_mask = fields[j].in_check_mask;
/* program the scan field to 1 bit length, and ignore it's value */
(*last_cmd)->cmd.scan->fields[field_count].num_bits = 1;
(*last_cmd)->cmd.scan->fields[field_count].out_value = NULL;
- (*last_cmd)->cmd.scan->fields[field_count].out_mask = NULL;
(*last_cmd)->cmd.scan->fields[field_count].in_value = NULL;
(*last_cmd)->cmd.scan->fields[field_count].in_check_value = NULL;
(*last_cmd)->cmd.scan->fields[field_count].in_check_mask = NULL;
buf_set_u32(out_value, 0, scan_size, value[j]);
(*last_cmd)->cmd.scan->fields[field_count].num_bits = scan_size;
(*last_cmd)->cmd.scan->fields[field_count].out_value = buf_cpy(out_value, cmd_queue_alloc(CEIL(scan_size, 8)), scan_size);
- (*last_cmd)->cmd.scan->fields[field_count].out_mask = NULL;
(*last_cmd)->cmd.scan->fields[field_count].in_value = NULL;
(*last_cmd)->cmd.scan->fields[field_count].in_check_value = NULL;
(*last_cmd)->cmd.scan->fields[field_count].in_check_mask = NULL;
/* program the scan field to 1 bit length, and ignore it's value */
(*last_cmd)->cmd.scan->fields[field_count].num_bits = 1;
(*last_cmd)->cmd.scan->fields[field_count].out_value = NULL;
- (*last_cmd)->cmd.scan->fields[field_count].out_mask = NULL;
(*last_cmd)->cmd.scan->fields[field_count].in_value = NULL;
(*last_cmd)->cmd.scan->fields[field_count].in_check_value = NULL;
(*last_cmd)->cmd.scan->fields[field_count].in_check_mask = NULL;
(*last_cmd)->cmd.scan->fields[i].tap = fields[i].tap;
(*last_cmd)->cmd.scan->fields[i].num_bits = num_bits;
(*last_cmd)->cmd.scan->fields[i].out_value = buf_cpy(fields[i].out_value, cmd_queue_alloc(num_bytes), num_bits);
- (*last_cmd)->cmd.scan->fields[i].out_mask = buf_cpy(fields[i].out_mask, cmd_queue_alloc(num_bytes), num_bits);
(*last_cmd)->cmd.scan->fields[i].in_value = fields[i].in_value;
(*last_cmd)->cmd.scan->fields[i].in_check_value = fields[i].in_check_value;
(*last_cmd)->cmd.scan->fields[i].in_check_mask = fields[i].in_check_mask;
void jtag_add_pathmove(int num_states, tap_state_t *path)
{
- tap_state_t cur_state=cmd_queue_cur_state;
+ tap_state_t cur_state = cmd_queue_cur_state;
int i;
int retval;
LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
exit(-1);
}
+
if ( tap_state_transition(cur_state, true) != path[i]
&& tap_state_transition(cur_state, false) != path[i])
{
jtag_prelude1();
- retval=interface_jtag_add_pathmove(num_states, path);
+ retval = interface_jtag_add_pathmove(num_states, path);
cmd_queue_cur_state = path[num_states - 1];
if (retval!=ERROR_OK)
jtag_error=retval;
field.tap = NULL;
field.num_bits = sizeof(idcode_buffer) * 8;
field.out_value = idcode_buffer;
- field.out_mask = NULL;
+
field.in_value = idcode_buffer;
- field.in_check_value = NULL;
- field.in_check_mask = NULL;
+
+
field.in_handler = NULL;
- field.in_handler_priv = NULL;
for (i = 0; i < JTAG_MAX_CHAIN_SIZE; i++)
{
field.tap = NULL;
field.num_bits = total_ir_length;
field.out_value = ir_test;
- field.out_mask = NULL;
+
field.in_value = ir_test;
- field.in_check_value = NULL;
- field.in_check_mask = NULL;
+
+
field.in_handler = NULL;
- field.in_handler_priv = NULL;
jtag_add_plain_ir_scan(1, &field, TAP_RESET);
jtag_execute_queue();
fields[i].tap = tap;
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].out_mask = NULL;
fields[i].in_value = NULL;
fields[i].in_check_mask = NULL;
fields[i].in_handler = NULL;
fields[field_count].num_bits = bits;
fields[field_count].out_value = malloc(CEIL(bits, 8));
str_to_buf(str, len, fields[field_count].out_value, bits, 0);
- fields[field_count].out_mask = NULL;
fields[field_count].in_value = fields[field_count].out_value;
fields[field_count].in_check_mask = NULL;
fields[field_count].in_check_value = NULL;
#define B8(bits,count) { ((u8)B8__(HEX__(bits))), (count) }
-#if 0 && ((BUILD_FT2232_FTD2XX==1) || (BUILD_FT2232_LIBFTDI==1))
+#if 0 && ((BUILD_FT2232_FTD2XX==1) || (BUILD_FT2232_LIBFTDI==1) || (BUILD_JLINK==1))
/* this is the table submitted by Jeff Williams on 3/30/2009 with this comment:
OK, I added Peter's version of the state table, and it works OK for
some long-standing problems.
Jeff
- I added the bit count into the table
+ I added the bit count into the table, reduced RESET column to 7 bits from 8.
Dick
+
+ state specific comments:
+ ------------------------
+ *->RESET tried the 5 bit reset and it gave me problems, 7 bits seems to
+ work better on ARM9 with ft2232 driver. (Dick)
+
+ RESET->DRSHIFT add 1 extra clock cycles in the RESET state before advancing.
+ needed on ARM9 with ft2232 driver. (Dick)
+
+ RESET->IRSHIFT add 1 extra clock cycles in the RESET state before advancing.
+ needed on ARM9 with ft2232 driver. (Dick)
*/
/* to state: */
- /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
- { B8(11111,5), B8(0,1), B8(0010,4), B8(01010,5), B8(00110,5), B8(010110,6) }, /* RESET */
- { B8(11111,5), B8(0,1), B8(001,3), B8(0101,4), B8(0011,4), B8(01011,5) }, /* IDLE */
- { B8(11111,5), B8(011,3), B8(00111,5), B8(01,2), B8(001111,6), B8(0101111,7) }, /* DRSHIFT */
- { B8(11111,5), B8(011,3), B8(01,2), B8(0,1), B8(001111,6), B8(0101111,7) }, /* DRPAUSE */
- { B8(11111,5), B8(011,3), B8(00111,5), B8(010111,6), B8(001111,6), B8(01,2) }, /* IRSHIFT */
- { B8(11111,5), B8(011,3), B8(00111,5), B8(010111,6), B8(01,2), B8(0,1) } /* IRPAUSE */
+ /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
+ { B8(1111111,7), B8(0,1), B8(00101,5), B8(01010,5), B8(001101,6), B8(010110,6) }, /* RESET */
+ { B8(1111111,7), B8(0,1), B8(001,3), B8(0101,4), B8(0011,4), B8(01011,5) }, /* IDLE */
+ { B8(1111111,7), B8(011,3), B8(00111,5), B8(01,2), B8(001111,6), B8(0101111,7) }, /* DRSHIFT */
+ { B8(1111111,7), B8(011,3), B8(01,2), B8(0,1), B8(001111,6), B8(0101111,7) }, /* DRPAUSE */
+ { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(001111,6), B8(01,2) }, /* IRSHIFT */
+ { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(01,2), B8(0,1) } /* IRPAUSE */
#else /* this is the old table, converted from hex and with the bit_count set to 7 for each combo, like before */
/* to state: */
- /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
- { B8(1111111,7), B8(0000000,7), B8(0010111,7), B8(0001010,7), B8(0011011,7), B8(0010110,7) }, /* RESET */
- { B8(1111111,7), B8(0000000,7), B8(0100101,7), B8(0000101,7), B8(0101011,7), B8(0001011,7) }, /* IDLE */
- { B8(1111111,7), B8(0110001,7), B8(0000000,7), B8(0000001,7), B8(0001111,7), B8(0101111,7) }, /* DRSHIFT */
- { B8(1111111,7), B8(0110000,7), B8(0100000,7), B8(0010111,7), B8(0011110,7), B8(0101111,7) }, /* DRPAUSE */
- { B8(1111111,7), B8(0110001,7), B8(0000111,7), B8(0010111,7), B8(0000000,7), B8(0000001,7) }, /* IRSHIFT */
- { B8(1111111,7), B8(0110000,7), B8(0011100,7), B8(0010111,7), B8(0100000,7), B8(0101111,7) } /* IRPAUSE */
+ /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
+ { B8(1111111,7), B8(0000000,7), B8(0010111,7), B8(0001010,7), B8(0011011,7), B8(0010110,7) }, /* RESET */
+ { B8(1111111,7), B8(0000000,7), B8(0100101,7), B8(0000101,7), B8(0101011,7), B8(0001011,7) }, /* IDLE */
+ { B8(1111111,7), B8(0110001,7), B8(0000000,7), B8(0000001,7), B8(0001111,7), B8(0101111,7) }, /* DRSHIFT */
+ { B8(1111111,7), B8(0110000,7), B8(0100000,7), B8(0010111,7), B8(0011110,7), B8(0101111,7) }, /* DRPAUSE */
+ { B8(1111111,7), B8(0110001,7), B8(0000111,7), B8(0010111,7), B8(0000000,7), B8(0000001,7) }, /* IRSHIFT */
+ { B8(1111111,7), B8(0110000,7), B8(0011100,7), B8(0010111,7), B8(0100000,7), B8(0101111,7) } /* IRPAUSE */
#endif