build: cleanup src/xsvf directory

Change-Id: I5325980b240fba841d8cce81985f4da369ad9052
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/410
Tested-by: jenkins
This commit is contained in:
Spencer Oliver 2012-01-27 16:47:48 +00:00
parent e3b114e285
commit f7772ccb49
2 changed files with 453 additions and 476 deletions

View File

@ -1,31 +1,31 @@
/*
* Copyright (C) 2005 by Dominic Rath
* Dominic.Rath@gmx.de
*
* Copyright (C) 2007,2008 Øyvind Harboe
* oyvind.harboe@zylin.com
*
* Copyright (C) 2008 Peter Hettkamp
* peter.hettkamp@htp-tel.de
*
* Copyright (C) 2009 SoftPLC Corporation. http://softplc.com
* Dick Hollenbeck <dick@softplc.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/***************************************************************************
* Copyright (C) 2005 by Dominic Rath *
* Dominic.Rath@gmx.de *
* *
* Copyright (C) 2007,2008 Øyvind Harboe *
* oyvind.harboe@zylin.com *
* *
* Copyright (C) 2008 Peter Hettkamp *
* peter.hettkamp@htp-tel.de *
* *
* Copyright (C) 2009 SoftPLC Corporation. http://softplc.com *
* Dick Hollenbeck <dick@softplc.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
/* The specification for SVF is available here:
* http://www.asset-intertech.com/support/svf.pdf
@ -44,7 +44,6 @@
#include <jtag/jtag.h>
#include <svf/svf.h>
/* XSVF commands, from appendix B of xapp503.pdf */
#define XCOMPLETE 0x00
#define XTDOMASK 0x01
@ -88,7 +87,7 @@ LDELAY DRPAUSE 5 TCK 1.00E-003 SEC;
! Loop back to LDELAY line if not match and loop count less than 25.
LSDR 1 TDI (0)
TDO (1);
TDO (1);
*/
#define LCOUNT 0x19
@ -96,7 +95,6 @@ LSDR 1 TDI (0)
#define LSDR 0x1B
#define XTRST 0x1C
/* XSVF valid state values for the XSTATE command, from appendix B of xapp503.pdf */
#define XSV_RESET 0x00
#define XSV_IDLE 0x01
@ -123,33 +121,62 @@ LSDR 1 TDI (0)
#define XSTATE_MAX_PATH 12
static int xsvf_fd = 0;
static int xsvf_fd;
/* map xsvf tap state to an openocd "tap_state_t" */
static tap_state_t xsvf_to_tap(int xsvf_state)
{
tap_state_t ret;
switch (xsvf_state)
{
case XSV_RESET: ret = TAP_RESET; break;
case XSV_IDLE: ret = TAP_IDLE; break;
case XSV_DRSELECT: ret = TAP_DRSELECT; break;
case XSV_DRCAPTURE: ret = TAP_DRCAPTURE; break;
case XSV_DRSHIFT: ret = TAP_DRSHIFT; break;
case XSV_DREXIT1: ret = TAP_DREXIT1; break;
case XSV_DRPAUSE: ret = TAP_DRPAUSE; break;
case XSV_DREXIT2: ret = TAP_DREXIT2; break;
case XSV_DRUPDATE: ret = TAP_DRUPDATE; break;
case XSV_IRSELECT: ret = TAP_IRSELECT; break;
case XSV_IRCAPTURE: ret = TAP_IRCAPTURE; break;
case XSV_IRSHIFT: ret = TAP_IRSHIFT; break;
case XSV_IREXIT1: ret = TAP_IREXIT1; break;
case XSV_IRPAUSE: ret = TAP_IRPAUSE; break;
case XSV_IREXIT2: ret = TAP_IREXIT2; break;
case XSV_IRUPDATE: ret = TAP_IRUPDATE; break;
switch (xsvf_state) {
case XSV_RESET:
ret = TAP_RESET;
break;
case XSV_IDLE:
ret = TAP_IDLE;
break;
case XSV_DRSELECT:
ret = TAP_DRSELECT;
break;
case XSV_DRCAPTURE:
ret = TAP_DRCAPTURE;
break;
case XSV_DRSHIFT:
ret = TAP_DRSHIFT;
break;
case XSV_DREXIT1:
ret = TAP_DREXIT1;
break;
case XSV_DRPAUSE:
ret = TAP_DRPAUSE;
break;
case XSV_DREXIT2:
ret = TAP_DREXIT2;
break;
case XSV_DRUPDATE:
ret = TAP_DRUPDATE;
break;
case XSV_IRSELECT:
ret = TAP_IRSELECT;
break;
case XSV_IRCAPTURE:
ret = TAP_IRCAPTURE;
break;
case XSV_IRSHIFT:
ret = TAP_IRSHIFT;
break;
case XSV_IREXIT1:
ret = TAP_IREXIT1;
break;
case XSV_IRPAUSE:
ret = TAP_IRPAUSE;
break;
case XSV_IREXIT2:
ret = TAP_IREXIT2;
break;
case XSV_IRUPDATE:
ret = TAP_IRUPDATE;
break;
default:
LOG_ERROR("UNKNOWN XSVF STATE 0x%02X", xsvf_state);
exit(1);
@ -158,14 +185,11 @@ static tap_state_t xsvf_to_tap(int xsvf_state)
return ret;
}
static int xsvf_read_buffer(int num_bits, int fd, uint8_t* buf)
static int xsvf_read_buffer(int num_bits, int fd, uint8_t *buf)
{
int num_bytes;
for (num_bytes = (num_bits + 7) / 8; num_bytes > 0; num_bytes--)
{
for (num_bytes = (num_bits + 7) / 8; num_bytes > 0; num_bytes--) {
/* reverse the order of bytes as they are read sequentially from file */
if (read(fd, buf + num_bytes - 1, 1) < 0)
return ERROR_XSVF_EOF;
@ -174,7 +198,6 @@ static int xsvf_read_buffer(int num_bits, int fd, uint8_t* buf)
return ERROR_OK;
}
COMMAND_HANDLER(handle_xsvf_command)
{
uint8_t *dr_out_buf = NULL; /* from host to device (TDI) */
@ -182,10 +205,11 @@ COMMAND_HANDLER(handle_xsvf_command)
uint8_t *dr_in_mask = NULL;
int xsdrsize = 0;
int xruntest = 0; /* number of TCK cycles OR microseconds */
int xruntest = 0; /* number of TCK cycles OR *microseconds */
int xrepeat = 0; /* number of retries */
tap_state_t xendir = TAP_IDLE; /* see page 8 of the SVF spec, initial xendir to be TAP_IDLE */
tap_state_t xendir = TAP_IDLE; /* see page 8 of the SVF spec, initial
*xendir to be TAP_IDLE */
tap_state_t xenddr = TAP_IDLE;
uint8_t opcode;
@ -212,54 +236,46 @@ COMMAND_HANDLER(handle_xsvf_command)
*/
int runtest_requires_tck = 0;
/* use NULL to indicate a "plain" xsvf file which accounts for
additional devices in the scan chain, otherwise the device
that should be affected
* additional devices in the scan chain, otherwise the device
* that should be affected
*/
struct jtag_tap *tap = NULL;
if (CMD_ARGC < 2)
{
return ERROR_COMMAND_SYNTAX_ERROR;
}
/* we mess with CMD_ARGV starting point below, snapshot filename here */
const char *filename = CMD_ARGV[1];
if (strcmp(CMD_ARGV[0], "plain") != 0)
{
if (strcmp(CMD_ARGV[0], "plain") != 0) {
tap = jtag_tap_by_string(CMD_ARGV[0]);
if (!tap)
{
if (!tap) {
command_print(CMD_CTX, "Tap: %s unknown", CMD_ARGV[0]);
return ERROR_FAIL;
}
}
if ((xsvf_fd = open(filename, O_RDONLY)) < 0)
{
xsvf_fd = open(filename, O_RDONLY);
if (xsvf_fd < 0) {
command_print(CMD_CTX, "file \"%s\" not found", filename);
return ERROR_FAIL;
}
/* if this argument is present, then interpret xruntest counts as TCK cycles rather than as usecs */
if ((CMD_ARGC > 2) && (strcmp(CMD_ARGV[2], "virt2") == 0))
{
/* if this argument is present, then interpret xruntest counts as TCK cycles rather than as
*usecs */
if ((CMD_ARGC > 2) && (strcmp(CMD_ARGV[2], "virt2") == 0)) {
runtest_requires_tck = 1;
--CMD_ARGC;
++CMD_ARGV;
}
if ((CMD_ARGC > 2) && (strcmp(CMD_ARGV[2], "quiet") == 0))
{
verbose = 0;
}
LOG_USER("xsvf processing file: \"%s\"", filename);
while (read(xsvf_fd, &opcode, 1) > 0)
{
while (read(xsvf_fd, &opcode, 1) > 0) {
/* record the position of this opcode within the file */
file_offset = lseek(xsvf_fd, 0, SEEK_CUR) - 1;
@ -281,8 +297,7 @@ COMMAND_HANDLER(handle_xsvf_command)
break;
}
if (read(xsvf_fd, &uc, 1) < 0)
{
if (read(xsvf_fd, &uc, 1) < 0) {
do_abort = 1;
break;
}
@ -332,8 +347,7 @@ COMMAND_HANDLER(handle_xsvf_command)
result = jtag_execute_queue();
if (result != ERROR_OK) {
LOG_ERROR("XSVF: pathmove error %d",
result);
LOG_ERROR("XSVF: pathmove error %d", result);
do_abort = 1;
break;
}
@ -341,14 +355,12 @@ COMMAND_HANDLER(handle_xsvf_command)
}
}
switch (opcode)
{
switch (opcode) {
case XCOMPLETE:
LOG_DEBUG("XCOMPLETE");
result = jtag_execute_queue();
if (result != ERROR_OK)
{
if (result != ERROR_OK) {
tdo_mismatch = 1;
break;
}
@ -356,7 +368,8 @@ COMMAND_HANDLER(handle_xsvf_command)
case XTDOMASK:
LOG_DEBUG("XTDOMASK");
if (dr_in_mask && (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_mask) != ERROR_OK))
if (dr_in_mask &&
(xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_mask) != ERROR_OK))
do_abort = 1;
break;
@ -364,8 +377,7 @@ COMMAND_HANDLER(handle_xsvf_command)
{
uint8_t xruntest_buf[4];
if (read(xsvf_fd, xruntest_buf, 4) < 0)
{
if (read(xsvf_fd, xruntest_buf, 4) < 0) {
do_abort = 1;
break;
}
@ -381,8 +393,7 @@ COMMAND_HANDLER(handle_xsvf_command)
if (read(xsvf_fd, &myrepeat, 1) < 0)
do_abort = 1;
else
{
else {
xrepeat = myrepeat;
LOG_DEBUG("XREPEAT %d", xrepeat);
}
@ -393,8 +404,7 @@ COMMAND_HANDLER(handle_xsvf_command)
{
uint8_t xsdrsize_buf[4];
if (read(xsvf_fd, xsdrsize_buf, 4) < 0)
{
if (read(xsvf_fd, xsdrsize_buf, 4) < 0) {
do_abort = 1;
break;
}
@ -402,9 +412,12 @@ COMMAND_HANDLER(handle_xsvf_command)
xsdrsize = be_to_h_u32(xsdrsize_buf);
LOG_DEBUG("XSDRSIZE %d", xsdrsize);
if (dr_out_buf) free(dr_out_buf);
if (dr_in_buf) free(dr_in_buf);
if (dr_in_mask) free(dr_in_mask);
if (dr_out_buf)
free(dr_out_buf);
if (dr_in_buf)
free(dr_in_buf);
if (dr_in_mask)
free(dr_in_mask);
dr_out_buf = malloc((xsdrsize + 7) / 8);
dr_in_buf = malloc((xsdrsize + 7) / 8);
@ -419,18 +432,16 @@ COMMAND_HANDLER(handle_xsvf_command)
int matched = 0;
int attempt;
const char* op_name = (opcode == XSDR ? "XSDR" : "XSDRTDO");
const char *op_name = (opcode == XSDR ? "XSDR" : "XSDRTDO");
if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK)
{
if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK) {
do_abort = 1;
break;
}
if (opcode == XSDRTDO)
{
if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_buf) != ERROR_OK)
{
if (opcode == XSDRTDO) {
if (xsvf_read_buffer(xsdrsize, xsvf_fd,
dr_in_buf) != ERROR_OK) {
do_abort = 1;
break;
}
@ -441,23 +452,21 @@ COMMAND_HANDLER(handle_xsvf_command)
LOG_DEBUG("%s %d", op_name, xsdrsize);
for (attempt = 0; attempt < limit; ++attempt)
{
for (attempt = 0; attempt < limit; ++attempt) {
struct scan_field field;
if (attempt > 0)
{
if (attempt > 0) {
/* perform the XC9500 exception handling sequence shown in xapp067.pdf and
illustrated in psuedo code at end of this file. We start from state
DRPAUSE:
go to Exit2-DR
go to Shift-DR
go to Exit1-DR
go to Update-DR
go to Run-Test/Idle
This sequence should be harmless for other devices, and it
will be skipped entirely if xrepeat is set to zero.
* illustrated in psuedo code at end of this file. We start from state
* DRPAUSE:
* go to Exit2-DR
* go to Shift-DR
* go to Exit1-DR
* go to Update-DR
* go to Run-Test/Idle
*
* This sequence should be harmless for other devices, and it
* will be skipped entirely if xrepeat is set to zero.
*/
static tap_state_t exception_path[] = {
@ -471,7 +480,10 @@ COMMAND_HANDLER(handle_xsvf_command)
jtag_add_pathmove(ARRAY_SIZE(exception_path), exception_path);
if (verbose)
LOG_USER("%s mismatch, xsdrsize=%d retry=%d", op_name, xsdrsize, attempt);
LOG_USER("%s mismatch, xsdrsize=%d retry=%d",
op_name,
xsdrsize,
attempt);
}
field.num_bits = xsdrsize;
@ -479,7 +491,9 @@ COMMAND_HANDLER(handle_xsvf_command)
field.in_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
if (tap == NULL)
jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value,
jtag_add_plain_dr_scan(field.num_bits,
field.out_value,
field.in_value,
TAP_DRPAUSE);
else
jtag_add_dr_scan(tap, 1, &field, TAP_DRPAUSE);
@ -488,26 +502,22 @@ COMMAND_HANDLER(handle_xsvf_command)
free(field.in_value);
/* LOG_DEBUG("FLUSHING QUEUE"); */
result = jtag_execute_queue();
if (result == ERROR_OK)
{
if (result == ERROR_OK) {
matched = 1;
break;
}
}
if (!matched)
{
if (!matched) {
LOG_USER("%s mismatch", op_name);
tdo_mismatch = 1;
break;
}
/* See page 19 of XSVF spec regarding opcode "XSDR" */
if (xruntest)
{
if (xruntest) {
result = svf_add_statemove(TAP_IDLE);
if (result != ERROR_OK)
return result;
@ -569,8 +579,7 @@ COMMAND_HANDLER(handle_xsvf_command)
{
tap_state_t mystate;
if (read(xsvf_fd, &uc, 1) < 0)
{
if (read(xsvf_fd, &uc, 1) < 0) {
do_abort = 1;
break;
}
@ -593,8 +602,7 @@ COMMAND_HANDLER(handle_xsvf_command)
break;
/* Hand off to SVF? */
if (svf_tap_state_is_stable(mystate))
{
if (svf_tap_state_is_stable(mystate)) {
result = svf_add_statemove(mystate);
if (result != ERROR_OK)
unsupported = 1;
@ -614,8 +622,7 @@ COMMAND_HANDLER(handle_xsvf_command)
case XENDIR:
if (read(xsvf_fd, &uc, 1) < 0)
{
if (read(xsvf_fd, &uc, 1) < 0) {
do_abort = 1;
break;
}
@ -625,8 +632,7 @@ COMMAND_HANDLER(handle_xsvf_command)
xendir = TAP_IDLE;
else if (uc == 1)
xendir = TAP_IRPAUSE;
else
{
else {
LOG_ERROR("illegial XENDIR argument: 0x%02X", uc);
unsupported = 1;
break;
@ -637,8 +643,7 @@ COMMAND_HANDLER(handle_xsvf_command)
case XENDDR:
if (read(xsvf_fd, &uc, 1) < 0)
{
if (read(xsvf_fd, &uc, 1) < 0) {
do_abort = 1;
break;
}
@ -648,8 +653,7 @@ COMMAND_HANDLER(handle_xsvf_command)
xenddr = TAP_IDLE;
else if (uc == 1)
xenddr = TAP_DRPAUSE;
else
{
else {
LOG_ERROR("illegial XENDDR argument: 0x%02X", uc);
unsupported = 1;
break;
@ -662,25 +666,20 @@ COMMAND_HANDLER(handle_xsvf_command)
case XSIR2:
{
uint8_t short_buf[2];
uint8_t* ir_buf;
uint8_t *ir_buf;
int bitcount;
tap_state_t my_end_state = xruntest ? TAP_IDLE : xendir;
if (opcode == XSIR)
{
if (opcode == XSIR) {
/* one byte bitcount */
if (read(xsvf_fd, short_buf, 1) < 0)
{
if (read(xsvf_fd, short_buf, 1) < 0) {
do_abort = 1;
break;
}
bitcount = short_buf[0];
LOG_DEBUG("XSIR %d", bitcount);
}
else
{
if (read(xsvf_fd, short_buf, 2) < 0)
{
} else {
if (read(xsvf_fd, short_buf, 2) < 0) {
do_abort = 1;
break;
}
@ -692,8 +691,7 @@ COMMAND_HANDLER(handle_xsvf_command)
if (xsvf_read_buffer(bitcount, xsvf_fd, ir_buf) != ERROR_OK)
do_abort = 1;
else
{
else {
struct scan_field field;
field.num_bits = bitcount;
@ -701,17 +699,13 @@ COMMAND_HANDLER(handle_xsvf_command)
field.in_value = NULL;
if (tap == NULL)
jtag_add_plain_ir_scan(field.num_bits,
field.out_value, field.in_value, my_end_state);
else
jtag_add_ir_scan(tap, &field, my_end_state);
if (xruntest)
{
if (xruntest) {
if (runtest_requires_tck)
jtag_add_clocks(xruntest);
else
@ -726,10 +720,8 @@ COMMAND_HANDLER(handle_xsvf_command)
/* LOG_DEBUG("FLUSHING QUEUE"); */
result = jtag_execute_queue();
if (result != ERROR_OK)
{
tdo_mismatch = 1;
}
}
free(ir_buf);
}
break;
@ -739,10 +731,8 @@ COMMAND_HANDLER(handle_xsvf_command)
unsigned int ndx = 0;
char comment[128];
do
{
if (read(xsvf_fd, &uc, 1) < 0)
{
do {
if (read(xsvf_fd, &uc, 1) < 0) {
do_abort = 1;
break;
}
@ -774,8 +764,7 @@ COMMAND_HANDLER(handle_xsvf_command)
if (read(xsvf_fd, &wait_local, 1) < 0
|| read(xsvf_fd, &end, 1) < 0
|| read(xsvf_fd, delay_buf, 4) < 0)
{
|| read(xsvf_fd, delay_buf, 4) < 0) {
do_abort = 1;
break;
}
@ -784,14 +773,12 @@ COMMAND_HANDLER(handle_xsvf_command)
end_state = xsvf_to_tap(end);
delay = be_to_h_u32(delay_buf);
LOG_DEBUG("XWAIT %s %s usecs:%d", tap_state_name(wait_state), tap_state_name(end_state), delay);
LOG_DEBUG("XWAIT %s %s usecs:%d", tap_state_name(
wait_state), tap_state_name(end_state), delay);
if (runtest_requires_tck && wait_state == TAP_IDLE)
{
jtag_add_runtest(delay, end_state);
}
else
{
else {
/* FIXME handle statemove errors ... */
result = svf_add_statemove(wait_state);
if (result != ERROR_OK)
@ -807,7 +794,8 @@ COMMAND_HANDLER(handle_xsvf_command)
case XWAITSTATE:
{
/* expected in stream:
XWAITSTATE <uint8_t wait_state> <uint8_t end_state> <uint32_t clock_count> <uint32_t usecs>
* XWAITSTATE <uint8_t wait_state> <uint8_t end_state> <uint32_t clock_count>
* <uint32_t usecs>
*/
uint8_t clock_buf[4];
@ -822,8 +810,7 @@ COMMAND_HANDLER(handle_xsvf_command)
if (read(xsvf_fd, &wait_local, 1) < 0
|| read(xsvf_fd, &end, 1) < 0
|| read(xsvf_fd, clock_buf, 4) < 0
|| read(xsvf_fd, usecs_buf, 4) < 0)
{
|| read(xsvf_fd, usecs_buf, 4) < 0) {
do_abort = 1;
break;
}
@ -844,8 +831,7 @@ COMMAND_HANDLER(handle_xsvf_command)
* be issuing a number of clocks in this state. This set of allowed states is also
* determined by the SVF RUNTEST command's allowed states.
*/
if (!svf_tap_state_is_stable(wait_state))
{
if (!svf_tap_state_is_stable(wait_state)) {
LOG_ERROR("illegal XWAITSTATE wait_state: \"%s\"",
tap_state_name(wait_state));
unsupported = 1;
@ -858,7 +844,6 @@ COMMAND_HANDLER(handle_xsvf_command)
return result;
jtag_add_clocks(clock_count);
jtag_add_sleep(usecs);
result = svf_add_statemove(end_state);
@ -870,12 +855,11 @@ COMMAND_HANDLER(handle_xsvf_command)
case LCOUNT:
{
/* expected in stream:
LCOUNT <uint32_t loop_count>
* LCOUNT <uint32_t loop_count>
*/
uint8_t count_buf[4];
if (read(xsvf_fd, count_buf, 4) < 0)
{
if (read(xsvf_fd, count_buf, 4) < 0) {
do_abort = 1;
break;
}
@ -888,7 +872,7 @@ COMMAND_HANDLER(handle_xsvf_command)
case LDELAY:
{
/* expected in stream:
LDELAY <uint8_t wait_state> <uint32_t clock_count> <uint32_t usecs_to_sleep>
* LDELAY <uint8_t wait_state> <uint32_t clock_count> <uint32_t usecs_to_sleep>
*/
uint8_t state;
uint8_t clock_buf[4];
@ -896,8 +880,7 @@ COMMAND_HANDLER(handle_xsvf_command)
if (read(xsvf_fd, &state, 1) < 0
|| read(xsvf_fd, clock_buf, 4) < 0
|| read(xsvf_fd, usecs_buf, 4) < 0)
{
|| read(xsvf_fd, usecs_buf, 4) < 0) {
do_abort = 1;
break;
}
@ -907,7 +890,8 @@ COMMAND_HANDLER(handle_xsvf_command)
loop_clocks = be_to_h_u32(clock_buf);
loop_usecs = be_to_h_u32(usecs_buf);
LOG_DEBUG("LDELAY %s clocks:%d usecs:%d", tap_state_name(loop_state), loop_clocks, loop_usecs);
LOG_DEBUG("LDELAY %s clocks:%d usecs:%d", tap_state_name(
loop_state), loop_clocks, loop_usecs);
}
break;
@ -923,8 +907,7 @@ COMMAND_HANDLER(handle_xsvf_command)
LOG_DEBUG("LSDR");
if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK
|| xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_buf) != ERROR_OK)
{
|| xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_buf) != ERROR_OK) {
do_abort = 1;
break;
}
@ -932,8 +915,7 @@ COMMAND_HANDLER(handle_xsvf_command)
if (limit < 1)
limit = 1;
for (attempt = 0; attempt < limit; ++attempt)
{
for (attempt = 0; attempt < limit; ++attempt) {
struct scan_field field;
result = svf_add_statemove(loop_state);
@ -950,7 +932,9 @@ COMMAND_HANDLER(handle_xsvf_command)
LOG_USER("LSDR retry %d", attempt);
if (tap == NULL)
jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value,
jtag_add_plain_dr_scan(field.num_bits,
field.out_value,
field.in_value,
TAP_DRPAUSE);
else
jtag_add_dr_scan(tap, 1, &field, TAP_DRPAUSE);
@ -962,15 +946,13 @@ COMMAND_HANDLER(handle_xsvf_command)
/* LOG_DEBUG("FLUSHING QUEUE"); */
result = jtag_execute_queue();
if (result == ERROR_OK)
{
if (result == ERROR_OK) {
matched = 1;
break;
}
}
if (!matched)
{
if (!matched) {
LOG_USER("LSDR mismatch");
tdo_mismatch = 1;
break;
@ -982,14 +964,12 @@ COMMAND_HANDLER(handle_xsvf_command)
{
uint8_t trst_mode;
if (read(xsvf_fd, &trst_mode, 1) < 0)
{
if (read(xsvf_fd, &trst_mode, 1) < 0) {
do_abort = 1;
break;
}
switch (trst_mode)
{
switch (trst_mode) {
case XTRST_ON:
jtag_add_reset(1, 0);
break;
@ -1011,8 +991,7 @@ COMMAND_HANDLER(handle_xsvf_command)
unsupported = 1;
}
if (do_abort || unsupported || tdo_mismatch)
{
if (do_abort || unsupported || tdo_mismatch) {
LOG_DEBUG("xsvf failed, setting taps to reasonable state");
/* upon error, return the TAPs to a reasonable state */
@ -1026,17 +1005,15 @@ COMMAND_HANDLER(handle_xsvf_command)
}
}
if (tdo_mismatch)
{
command_print(CMD_CTX, "TDO mismatch, somewhere near offset %lu in xsvf file, aborting",
if (tdo_mismatch) {
command_print(CMD_CTX,
"TDO mismatch, somewhere near offset %lu in xsvf file, aborting",
file_offset);
return ERROR_FAIL;
}
if (unsupported)
{
if (unsupported) {
off_t offset = lseek(xsvf_fd, 0, SEEK_CUR) - 1;
command_print(CMD_CTX,
"unsupported xsvf command (0x%02X) at offset %jd, aborting",
@ -1044,8 +1021,7 @@ COMMAND_HANDLER(handle_xsvf_command)
return ERROR_FAIL;
}
if (do_abort)
{
if (do_abort) {
command_print(CMD_CTX, "premature end of xsvf file detected, aborting");
return ERROR_FAIL;
}
@ -1085,11 +1061,11 @@ int xsvf_register_commands(struct command_context *cmd_ctx)
return register_commands(cmd_ctx, NULL, xsvf_command_handlers);
}
#if 0 /* this comment style used to try and keep uncrustify from adding * at begin of line */
/*
PSUEDO-Code from Xilinx Appnote XAPP067.pdf:
PSUEDO-Code from Xilinx Appnote XAPP067.pdf :
the following pseudo code clarifies the intent of the xrepeat support. The
the following pseudo code clarifies the intent of the xrepeat support.The
flow given is for the entire processing of an SVF file, not an XSVF file.
No idea if this is just for the XC9500/XL/XV devices or all Xilinx parts.
@ -1100,39 +1076,39 @@ No idea if this is just for the XC9500/XL/XV devices or all Xilinx parts.
3. Read SVF record
4. if SIR record then
go to Shift-IR state
Scan in <TDI value>
go to Shift-IR state
Scan in <TDI value>
5. else if SDR record then
set <repeat count> to 0
store <TDI value> as <current TDI value>
store <TDO value> as <current TDO value>
set <repeat count> to 0
store <TDI value> as <current TDI value>
store <TDO value> as <current TDO value>
6. go to Shift-DR state
scan in <current TDI value>
if <current TDO value> is specified then
if <current TDO value> does not equal <actual TDO value> then
if <repeat count> > 32 then
LOG ERROR
go to Run-Test Idle state
go to Step 3
end if
go to Pause-DR
go to Exit2-DR
go to Shift-DR
go to Exit1-DR
go to Update-DR
go to Run-Test/Idle
increment <repeat count> by 1
pause <current pause time> microseconds
go to Step 6)
end if
else
scan in <current TDI value>
if < current TDO value > is specified then
if < current TDO value > does not equal <actual TDO value> then
if < repeat count > > 32 then
LOG ERROR
go to Run-Test Idle state
go to Step 3
end if
go to Pause-DR
go to Exit2-DR
go to Shift-DR
go to Exit1-DR
go to Update-DR
go to Run-Test/Idle
increment <repeat count> by 1
pause <current pause time> microseconds
go to Step 6)
end if
else
go to Run-Test Idle state
go to Step 3
endif
else if RUNTEST record then
pause tester for <TCK value> microseconds
else if RUNTEST record then
pause tester for < TCK value > microseconds
store <TCK value> as <current pause time>
end if
end if
#endif
*/

View File

@ -17,6 +17,7 @@
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef XSVF_H
#define XSVF_H