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

View File

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