Currently Non-working JTAG programmer

Dependencies:   mbed

Committer:
monpjc
Date:
Thu Jun 28 13:36:55 2012 +0000
Revision:
0:a23e8a7c9275
new

Who changed what in which revision?

UserRevisionLine numberNew contents of line
monpjc 0:a23e8a7c9275 1 /*****************************************************************************
monpjc 0:a23e8a7c9275 2 * file: micro.c
monpjc 0:a23e8a7c9275 3 * abstract: This file contains the function, xsvfExecute(),
monpjc 0:a23e8a7c9275 4 * call for interpreting the XSVF commands.
monpjc 0:a23e8a7c9275 5 * Usage: Call xsvfExecute() to process XSVF data.
monpjc 0:a23e8a7c9275 6 * The XSVF data is retrieved by readByte() in ports.c
monpjc 0:a23e8a7c9275 7 * Remove the main function if you already have one.
monpjc 0:a23e8a7c9275 8 * Options: XSVF_SUPPORT_COMPRESSION
monpjc 0:a23e8a7c9275 9 * This define supports the XC9500/XL compression scheme.
monpjc 0:a23e8a7c9275 10 * This define adds support for XSDRINC and XSETSDRMASKS.
monpjc 0:a23e8a7c9275 11 * XSVF_SUPPORT_ERRORCODES
monpjc 0:a23e8a7c9275 12 * This define causes the xsvfExecute function to return
monpjc 0:a23e8a7c9275 13 * an error code for specific errors. See error codes below.
monpjc 0:a23e8a7c9275 14 * If this is not defined, the return value defaults to the
monpjc 0:a23e8a7c9275 15 * legacy values for backward compatibility:
monpjc 0:a23e8a7c9275 16 * 1 = success; 0 = failure.
monpjc 0:a23e8a7c9275 17 * Debugging: DEBUG_MODE (Legacy name)
monpjc 0:a23e8a7c9275 18 * Define DEBUG_MODE to compile with debugging features.
monpjc 0:a23e8a7c9275 19 * Both micro.c and ports.c must be compiled with the DEBUG_MODE
monpjc 0:a23e8a7c9275 20 * defined to enable the standalone main implementation in
monpjc 0:a23e8a7c9275 21 * micro.c that reads XSVF from a file.
monpjc 0:a23e8a7c9275 22 * History: v2.00 - Original XSVF implementation.
monpjc 0:a23e8a7c9275 23 * v4.04 - Added delay at end of XSIR for XC18v00 support.
monpjc 0:a23e8a7c9275 24 * Added new commands for CoolRunner support:
monpjc 0:a23e8a7c9275 25 * XSTATE, XENDIR, XENDDR
monpjc 0:a23e8a7c9275 26 * v4.05 - Cleanup micro.c but leave ports.c intact.
monpjc 0:a23e8a7c9275 27 * v4.06 - Fix xsvfGotoTapState for retry transition.
monpjc 0:a23e8a7c9275 28 * v4.07 - Update example waitTime implementations for
monpjc 0:a23e8a7c9275 29 * compatibility with Virtex-II.
monpjc 0:a23e8a7c9275 30 * v4.10 - Add new XSIR2 command that supports a 2-byte
monpjc 0:a23e8a7c9275 31 * IR-length parameter for IR shifts > 255 bits.
monpjc 0:a23e8a7c9275 32 * v4.11 - No change. Update version to match SVF2XSVF xlator.
monpjc 0:a23e8a7c9275 33 * v4.14 - Added XCOMMENT.
monpjc 0:a23e8a7c9275 34 * v5.00 - Improve XSTATE support.
monpjc 0:a23e8a7c9275 35 * Added XWAIT.
monpjc 0:a23e8a7c9275 36 * v5.01 - make sure that TCK is low during RUNTEST wait for
monpjc 0:a23e8a7c9275 37 * XC18V00/XCF00 support. Only change is in PORTS.C
monpjc 0:a23e8a7c9275 38 * waitTime() function for implementations that do NOT
monpjc 0:a23e8a7c9275 39 * pulse TCK during the waitTime.
monpjc 0:a23e8a7c9275 40 *****************************************************************************/
monpjc 0:a23e8a7c9275 41
monpjc 0:a23e8a7c9275 42 /*============================================================================
monpjc 0:a23e8a7c9275 43 * #pragmas
monpjc 0:a23e8a7c9275 44 ============================================================================*/
monpjc 0:a23e8a7c9275 45 #ifdef _MSC_VER
monpjc 0:a23e8a7c9275 46 #pragma warning( disable : 4100 )
monpjc 0:a23e8a7c9275 47 #endif /* _MSC_VER */
monpjc 0:a23e8a7c9275 48
monpjc 0:a23e8a7c9275 49 /*============================================================================
monpjc 0:a23e8a7c9275 50 * #include files
monpjc 0:a23e8a7c9275 51 ============================================================================*/
monpjc 0:a23e8a7c9275 52 #define DEBUG_MODE
monpjc 0:a23e8a7c9275 53 //#define DEBUG_MODE
monpjc 0:a23e8a7c9275 54 /*#ifdef DEBUG_MODE
monpjc 0:a23e8a7c9275 55 #include <stdio.h>
monpjc 0:a23e8a7c9275 56 #include <stdlib.h>
monpjc 0:a23e8a7c9275 57 #include <string.h>
monpjc 0:a23e8a7c9275 58 #include <time.h>
monpjc 0:a23e8a7c9275 59 #endif*/ /* DEBUG_MODE */
monpjc 0:a23e8a7c9275 60
monpjc 0:a23e8a7c9275 61 #include "micro.h"
monpjc 0:a23e8a7c9275 62 #include "lenval.h"
monpjc 0:a23e8a7c9275 63 #include "ports.h"
monpjc 0:a23e8a7c9275 64 #include "mbed.h"
monpjc 0:a23e8a7c9275 65 extern Serial pc;
monpjc 0:a23e8a7c9275 66
monpjc 0:a23e8a7c9275 67 /*============================================================================
monpjc 0:a23e8a7c9275 68 * XSVF #define
monpjc 0:a23e8a7c9275 69 ============================================================================*/
monpjc 0:a23e8a7c9275 70
monpjc 0:a23e8a7c9275 71 #define XSVF_VERSION "5.01"
monpjc 0:a23e8a7c9275 72
monpjc 0:a23e8a7c9275 73 /*****************************************************************************
monpjc 0:a23e8a7c9275 74 * Define: XSVF_SUPPORT_COMPRESSION
monpjc 0:a23e8a7c9275 75 * Description: Define this to support the XC9500/XL XSVF data compression
monpjc 0:a23e8a7c9275 76 * scheme.
monpjc 0:a23e8a7c9275 77 * Code size can be reduced by NOT supporting this feature.
monpjc 0:a23e8a7c9275 78 * However, you must use the -nc (no compress) option when
monpjc 0:a23e8a7c9275 79 * translating SVF to XSVF using the SVF2XSVF translator.
monpjc 0:a23e8a7c9275 80 * Corresponding, uncompressed XSVF may be larger.
monpjc 0:a23e8a7c9275 81 *****************************************************************************/
monpjc 0:a23e8a7c9275 82 #ifndef XSVF_SUPPORT_COMPRESSION
monpjc 0:a23e8a7c9275 83 #define XSVF_SUPPORT_COMPRESSION 1
monpjc 0:a23e8a7c9275 84 #endif
monpjc 0:a23e8a7c9275 85
monpjc 0:a23e8a7c9275 86 /*****************************************************************************
monpjc 0:a23e8a7c9275 87 * Define: XSVF_SUPPORT_ERRORCODES
monpjc 0:a23e8a7c9275 88 * Description: Define this to support the new XSVF error codes.
monpjc 0:a23e8a7c9275 89 * (The original XSVF player just returned 1 for success and
monpjc 0:a23e8a7c9275 90 * 0 for an unspecified failure.)
monpjc 0:a23e8a7c9275 91 *****************************************************************************/
monpjc 0:a23e8a7c9275 92 #ifndef XSVF_SUPPORT_ERRORCODES
monpjc 0:a23e8a7c9275 93 #define XSVF_SUPPORT_ERRORCODES 1
monpjc 0:a23e8a7c9275 94 #endif
monpjc 0:a23e8a7c9275 95
monpjc 0:a23e8a7c9275 96 #ifdef XSVF_SUPPORT_ERRORCODES
monpjc 0:a23e8a7c9275 97 #define XSVF_ERRORCODE(errorCode) errorCode
monpjc 0:a23e8a7c9275 98 #else /* Use legacy error code */
monpjc 0:a23e8a7c9275 99 #define XSVF_ERRORCODE(errorCode) ((errorCode==XSVF_ERROR_NONE)?1:0)
monpjc 0:a23e8a7c9275 100 #endif /* XSVF_SUPPORT_ERRORCODES */
monpjc 0:a23e8a7c9275 101
monpjc 0:a23e8a7c9275 102
monpjc 0:a23e8a7c9275 103 /*****************************************************************************
monpjc 0:a23e8a7c9275 104 * Define: XSVF_MAIN
monpjc 0:a23e8a7c9275 105 * Description: Define this to compile with a main function for standalone
monpjc 0:a23e8a7c9275 106 * debugging.
monpjc 0:a23e8a7c9275 107 *****************************************************************************/
monpjc 0:a23e8a7c9275 108 #ifndef XSVF_MAIN
monpjc 0:a23e8a7c9275 109 #ifdef DEBUG_MODE
monpjc 0:a23e8a7c9275 110 // #define XSVF_MAIN 1
monpjc 0:a23e8a7c9275 111 #endif /* DEBUG_MODE */
monpjc 0:a23e8a7c9275 112 #endif /* XSVF_MAIN */
monpjc 0:a23e8a7c9275 113
monpjc 0:a23e8a7c9275 114
monpjc 0:a23e8a7c9275 115 /*============================================================================
monpjc 0:a23e8a7c9275 116 * DEBUG_MODE #define
monpjc 0:a23e8a7c9275 117 ============================================================================*/
monpjc 0:a23e8a7c9275 118
monpjc 0:a23e8a7c9275 119 #ifdef DEBUG_MODE
monpjc 0:a23e8a7c9275 120 #define XSVFDBG_PRINTF(iDebugLevel,pzFormat) pc.printf( pzFormat )
monpjc 0:a23e8a7c9275 121 #define XSVFDBG_PRINTF1(iDebugLevel,pzFormat,arg1) pc.printf( pzFormat, arg1 )
monpjc 0:a23e8a7c9275 122 #define XSVFDBG_PRINTF2(iDebugLevel,pzFormat,arg1,arg2) pc.printf( pzFormat, arg1, arg2 )
monpjc 0:a23e8a7c9275 123 #define XSVFDBG_PRINTF3(iDebugLevel,pzFormat,arg1,arg2,arg3) pc.printf( pzFormat, arg1, arg2, arg3 )
monpjc 0:a23e8a7c9275 124 #define XSVFDBG_PRINTLENVAL(iDebugLevel,plenVal)
monpjc 0:a23e8a7c9275 125 #else /* !DEBUG_MODE */
monpjc 0:a23e8a7c9275 126 #define XSVFDBG_PRINTF(iDebugLevel,pzFormat)
monpjc 0:a23e8a7c9275 127 #define XSVFDBG_PRINTF1(iDebugLevel,pzFormat,arg1)
monpjc 0:a23e8a7c9275 128 #define XSVFDBG_PRINTF2(iDebugLevel,pzFormat,arg1,arg2)
monpjc 0:a23e8a7c9275 129 #define XSVFDBG_PRINTF3(iDebugLevel,pzFormat,arg1,arg2,arg3)
monpjc 0:a23e8a7c9275 130 #define XSVFDBG_PRINTLENVAL(iDebugLevel,plenVal)
monpjc 0:a23e8a7c9275 131 #endif /* DEBUG_MODE */
monpjc 0:a23e8a7c9275 132
monpjc 0:a23e8a7c9275 133
monpjc 0:a23e8a7c9275 134 /*============================================================================
monpjc 0:a23e8a7c9275 135 * XSVF Type Declarations
monpjc 0:a23e8a7c9275 136 ============================================================================*/
monpjc 0:a23e8a7c9275 137
monpjc 0:a23e8a7c9275 138 /*****************************************************************************
monpjc 0:a23e8a7c9275 139 * Struct: SXsvfInfo
monpjc 0:a23e8a7c9275 140 * Description: This structure contains all of the data used during the
monpjc 0:a23e8a7c9275 141 * execution of the XSVF. Some data is persistent, predefined
monpjc 0:a23e8a7c9275 142 * information (e.g. lRunTestTime). The bulk of this struct's
monpjc 0:a23e8a7c9275 143 * size is due to the lenVal structs (defined in lenval.h)
monpjc 0:a23e8a7c9275 144 * which contain buffers for the active shift data. The MAX_LEN
monpjc 0:a23e8a7c9275 145 * #define in lenval.h defines the size of these buffers.
monpjc 0:a23e8a7c9275 146 * These buffers must be large enough to store the longest
monpjc 0:a23e8a7c9275 147 * shift data in your XSVF file. For example:
monpjc 0:a23e8a7c9275 148 * MAX_LEN >= ( longest_shift_data_in_bits / 8 )
monpjc 0:a23e8a7c9275 149 * Because the lenVal struct dominates the space usage of this
monpjc 0:a23e8a7c9275 150 * struct, the rough size of this struct is:
monpjc 0:a23e8a7c9275 151 * sizeof( SXsvfInfo ) ~= MAX_LEN * 7 (number of lenVals)
monpjc 0:a23e8a7c9275 152 * xsvfInitialize() contains initialization code for the data
monpjc 0:a23e8a7c9275 153 * in this struct.
monpjc 0:a23e8a7c9275 154 * xsvfCleanup() contains cleanup code for the data in this
monpjc 0:a23e8a7c9275 155 * struct.
monpjc 0:a23e8a7c9275 156 *****************************************************************************/
monpjc 0:a23e8a7c9275 157 typedef struct tagSXsvfInfo
monpjc 0:a23e8a7c9275 158 {
monpjc 0:a23e8a7c9275 159 /* XSVF status information */
monpjc 0:a23e8a7c9275 160 unsigned char ucComplete; /* 0 = running; 1 = complete */
monpjc 0:a23e8a7c9275 161 unsigned char ucCommand; /* Current XSVF command byte */
monpjc 0:a23e8a7c9275 162 long lCommandCount; /* Number of commands processed */
monpjc 0:a23e8a7c9275 163 int iErrorCode; /* An error code. 0 = no error. */
monpjc 0:a23e8a7c9275 164
monpjc 0:a23e8a7c9275 165 /* TAP state/sequencing information */
monpjc 0:a23e8a7c9275 166 unsigned char ucTapState; /* Current TAP state */
monpjc 0:a23e8a7c9275 167 unsigned char ucEndIR; /* ENDIR TAP state (See SVF) */
monpjc 0:a23e8a7c9275 168 unsigned char ucEndDR; /* ENDDR TAP state (See SVF) */
monpjc 0:a23e8a7c9275 169
monpjc 0:a23e8a7c9275 170 /* RUNTEST information */
monpjc 0:a23e8a7c9275 171 unsigned char ucMaxRepeat; /* Max repeat loops (for xc9500/xl) */
monpjc 0:a23e8a7c9275 172 long lRunTestTime; /* Pre-specified RUNTEST time (usec) */
monpjc 0:a23e8a7c9275 173
monpjc 0:a23e8a7c9275 174 /* Shift Data Info and Buffers */
monpjc 0:a23e8a7c9275 175 long lShiftLengthBits; /* Len. current shift data in bits */
monpjc 0:a23e8a7c9275 176 short sShiftLengthBytes; /* Len. current shift data in bytes */
monpjc 0:a23e8a7c9275 177
monpjc 0:a23e8a7c9275 178 lenVal lvTdi; /* Current TDI shift data */
monpjc 0:a23e8a7c9275 179 lenVal lvTdoExpected; /* Expected TDO shift data */
monpjc 0:a23e8a7c9275 180 lenVal lvTdoCaptured; /* Captured TDO shift data */
monpjc 0:a23e8a7c9275 181 lenVal lvTdoMask; /* TDO mask: 0=dontcare; 1=compare */
monpjc 0:a23e8a7c9275 182
monpjc 0:a23e8a7c9275 183 #ifdef XSVF_SUPPORT_COMPRESSION
monpjc 0:a23e8a7c9275 184 /* XSDRINC Data Buffers */
monpjc 0:a23e8a7c9275 185 lenVal lvAddressMask; /* Address mask for XSDRINC */
monpjc 0:a23e8a7c9275 186 lenVal lvDataMask; /* Data mask for XSDRINC */
monpjc 0:a23e8a7c9275 187 lenVal lvNextData; /* Next data for XSDRINC */
monpjc 0:a23e8a7c9275 188 #endif /* XSVF_SUPPORT_COMPRESSION */
monpjc 0:a23e8a7c9275 189 } SXsvfInfo;
monpjc 0:a23e8a7c9275 190
monpjc 0:a23e8a7c9275 191 /* Declare pointer to functions that perform XSVF commands */
monpjc 0:a23e8a7c9275 192 typedef int (*TXsvfDoCmdFuncPtr)( SXsvfInfo* );
monpjc 0:a23e8a7c9275 193
monpjc 0:a23e8a7c9275 194
monpjc 0:a23e8a7c9275 195 /*============================================================================
monpjc 0:a23e8a7c9275 196 * XSVF Command Bytes
monpjc 0:a23e8a7c9275 197 ============================================================================*/
monpjc 0:a23e8a7c9275 198
monpjc 0:a23e8a7c9275 199 /* encodings of xsvf instructions */
monpjc 0:a23e8a7c9275 200 #define XCOMPLETE 0
monpjc 0:a23e8a7c9275 201 #define XTDOMASK 1
monpjc 0:a23e8a7c9275 202 #define XSIR 2
monpjc 0:a23e8a7c9275 203 #define XSDR 3
monpjc 0:a23e8a7c9275 204 #define XRUNTEST 4
monpjc 0:a23e8a7c9275 205 /* Reserved 5 */
monpjc 0:a23e8a7c9275 206 /* Reserved 6 */
monpjc 0:a23e8a7c9275 207 #define XREPEAT 7
monpjc 0:a23e8a7c9275 208 #define XSDRSIZE 8
monpjc 0:a23e8a7c9275 209 #define XSDRTDO 9
monpjc 0:a23e8a7c9275 210 #define XSETSDRMASKS 10
monpjc 0:a23e8a7c9275 211 #define XSDRINC 11
monpjc 0:a23e8a7c9275 212 #define XSDRB 12
monpjc 0:a23e8a7c9275 213 #define XSDRC 13
monpjc 0:a23e8a7c9275 214 #define XSDRE 14
monpjc 0:a23e8a7c9275 215 #define XSDRTDOB 15
monpjc 0:a23e8a7c9275 216 #define XSDRTDOC 16
monpjc 0:a23e8a7c9275 217 #define XSDRTDOE 17
monpjc 0:a23e8a7c9275 218 #define XSTATE 18 /* 4.00 */
monpjc 0:a23e8a7c9275 219 #define XENDIR 19 /* 4.04 */
monpjc 0:a23e8a7c9275 220 #define XENDDR 20 /* 4.04 */
monpjc 0:a23e8a7c9275 221 #define XSIR2 21 /* 4.10 */
monpjc 0:a23e8a7c9275 222 #define XCOMMENT 22 /* 4.14 */
monpjc 0:a23e8a7c9275 223 #define XWAIT 23 /* 5.00 */
monpjc 0:a23e8a7c9275 224 /* Insert new commands here */
monpjc 0:a23e8a7c9275 225 /* and add corresponding xsvfDoCmd function to xsvf_pfDoCmd below. */
monpjc 0:a23e8a7c9275 226 #define XLASTCMD 24 /* Last command marker */
monpjc 0:a23e8a7c9275 227
monpjc 0:a23e8a7c9275 228
monpjc 0:a23e8a7c9275 229 /*============================================================================
monpjc 0:a23e8a7c9275 230 * XSVF Command Parameter Values
monpjc 0:a23e8a7c9275 231 ============================================================================*/
monpjc 0:a23e8a7c9275 232
monpjc 0:a23e8a7c9275 233 #define XSTATE_RESET 0 /* 4.00 parameter for XSTATE */
monpjc 0:a23e8a7c9275 234 #define XSTATE_RUNTEST 1 /* 4.00 parameter for XSTATE */
monpjc 0:a23e8a7c9275 235
monpjc 0:a23e8a7c9275 236 #define XENDXR_RUNTEST 0 /* 4.04 parameter for XENDIR/DR */
monpjc 0:a23e8a7c9275 237 #define XENDXR_PAUSE 1 /* 4.04 parameter for XENDIR/DR */
monpjc 0:a23e8a7c9275 238
monpjc 0:a23e8a7c9275 239 /* TAP states */
monpjc 0:a23e8a7c9275 240 #define XTAPSTATE_RESET 0x00
monpjc 0:a23e8a7c9275 241 #define XTAPSTATE_RUNTEST 0x01 /* a.k.a. IDLE */
monpjc 0:a23e8a7c9275 242 #define XTAPSTATE_SELECTDR 0x02
monpjc 0:a23e8a7c9275 243 #define XTAPSTATE_CAPTUREDR 0x03
monpjc 0:a23e8a7c9275 244 #define XTAPSTATE_SHIFTDR 0x04
monpjc 0:a23e8a7c9275 245 #define XTAPSTATE_EXIT1DR 0x05
monpjc 0:a23e8a7c9275 246 #define XTAPSTATE_PAUSEDR 0x06
monpjc 0:a23e8a7c9275 247 #define XTAPSTATE_EXIT2DR 0x07
monpjc 0:a23e8a7c9275 248 #define XTAPSTATE_UPDATEDR 0x08
monpjc 0:a23e8a7c9275 249 #define XTAPSTATE_IRSTATES 0x09 /* All IR states begin here */
monpjc 0:a23e8a7c9275 250 #define XTAPSTATE_SELECTIR 0x09
monpjc 0:a23e8a7c9275 251 #define XTAPSTATE_CAPTUREIR 0x0A
monpjc 0:a23e8a7c9275 252 #define XTAPSTATE_SHIFTIR 0x0B
monpjc 0:a23e8a7c9275 253 #define XTAPSTATE_EXIT1IR 0x0C
monpjc 0:a23e8a7c9275 254 #define XTAPSTATE_PAUSEIR 0x0D
monpjc 0:a23e8a7c9275 255 #define XTAPSTATE_EXIT2IR 0x0E
monpjc 0:a23e8a7c9275 256 #define XTAPSTATE_UPDATEIR 0x0F
monpjc 0:a23e8a7c9275 257
monpjc 0:a23e8a7c9275 258 /*============================================================================
monpjc 0:a23e8a7c9275 259 * XSVF Function Prototypes
monpjc 0:a23e8a7c9275 260 ============================================================================*/
monpjc 0:a23e8a7c9275 261
monpjc 0:a23e8a7c9275 262 int xsvfDoIllegalCmd( SXsvfInfo* pXsvfInfo ); /* Illegal command function */
monpjc 0:a23e8a7c9275 263 int xsvfDoXCOMPLETE( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 264 int xsvfDoXTDOMASK( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 265 int xsvfDoXSIR( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 266 int xsvfDoXSIR2( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 267 int xsvfDoXSDR( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 268 int xsvfDoXRUNTEST( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 269 int xsvfDoXREPEAT( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 270 int xsvfDoXSDRSIZE( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 271 int xsvfDoXSDRTDO( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 272 int xsvfDoXSETSDRMASKS( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 273 int xsvfDoXSDRINC( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 274 int xsvfDoXSDRBCE( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 275 int xsvfDoXSDRTDOBCE( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 276 int xsvfDoXSTATE( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 277 int xsvfDoXENDXR( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 278 int xsvfDoXCOMMENT( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 279 int xsvfDoXWAIT( SXsvfInfo* pXsvfInfo );
monpjc 0:a23e8a7c9275 280 /* Insert new command functions here */
monpjc 0:a23e8a7c9275 281
monpjc 0:a23e8a7c9275 282 /*============================================================================
monpjc 0:a23e8a7c9275 283 * XSVF Global Variables
monpjc 0:a23e8a7c9275 284 ============================================================================*/
monpjc 0:a23e8a7c9275 285
monpjc 0:a23e8a7c9275 286 /* Array of XSVF command functions. Must follow command byte value order! */
monpjc 0:a23e8a7c9275 287 /* If your compiler cannot take this form, then convert to a switch statement*/
monpjc 0:a23e8a7c9275 288 TXsvfDoCmdFuncPtr xsvf_pfDoCmd[] =
monpjc 0:a23e8a7c9275 289 {
monpjc 0:a23e8a7c9275 290 xsvfDoXCOMPLETE, /* 0 */
monpjc 0:a23e8a7c9275 291 xsvfDoXTDOMASK, /* 1 */
monpjc 0:a23e8a7c9275 292 xsvfDoXSIR, /* 2 */
monpjc 0:a23e8a7c9275 293 xsvfDoXSDR, /* 3 */
monpjc 0:a23e8a7c9275 294 xsvfDoXRUNTEST, /* 4 */
monpjc 0:a23e8a7c9275 295 xsvfDoIllegalCmd, /* 5 */
monpjc 0:a23e8a7c9275 296 xsvfDoIllegalCmd, /* 6 */
monpjc 0:a23e8a7c9275 297 xsvfDoXREPEAT, /* 7 */
monpjc 0:a23e8a7c9275 298 xsvfDoXSDRSIZE, /* 8 */
monpjc 0:a23e8a7c9275 299 xsvfDoXSDRTDO, /* 9 */
monpjc 0:a23e8a7c9275 300 #ifdef XSVF_SUPPORT_COMPRESSION
monpjc 0:a23e8a7c9275 301 xsvfDoXSETSDRMASKS, /* 10 */
monpjc 0:a23e8a7c9275 302 xsvfDoXSDRINC, /* 11 */
monpjc 0:a23e8a7c9275 303 #else
monpjc 0:a23e8a7c9275 304 xsvfDoIllegalCmd, /* 10 */
monpjc 0:a23e8a7c9275 305 xsvfDoIllegalCmd, /* 11 */
monpjc 0:a23e8a7c9275 306 #endif /* XSVF_SUPPORT_COMPRESSION */
monpjc 0:a23e8a7c9275 307 xsvfDoXSDRBCE, /* 12 */
monpjc 0:a23e8a7c9275 308 xsvfDoXSDRBCE, /* 13 */
monpjc 0:a23e8a7c9275 309 xsvfDoXSDRBCE, /* 14 */
monpjc 0:a23e8a7c9275 310 xsvfDoXSDRTDOBCE, /* 15 */
monpjc 0:a23e8a7c9275 311 xsvfDoXSDRTDOBCE, /* 16 */
monpjc 0:a23e8a7c9275 312 xsvfDoXSDRTDOBCE, /* 17 */
monpjc 0:a23e8a7c9275 313 xsvfDoXSTATE, /* 18 */
monpjc 0:a23e8a7c9275 314 xsvfDoXENDXR, /* 19 */
monpjc 0:a23e8a7c9275 315 xsvfDoXENDXR, /* 20 */
monpjc 0:a23e8a7c9275 316 xsvfDoXSIR2, /* 21 */
monpjc 0:a23e8a7c9275 317 xsvfDoXCOMMENT, /* 22 */
monpjc 0:a23e8a7c9275 318 xsvfDoXWAIT /* 23 */
monpjc 0:a23e8a7c9275 319 /* Insert new command functions here */
monpjc 0:a23e8a7c9275 320 };
monpjc 0:a23e8a7c9275 321
monpjc 0:a23e8a7c9275 322 #ifdef DEBUG_MODE
monpjc 0:a23e8a7c9275 323 char* xsvf_pzCommandName[] =
monpjc 0:a23e8a7c9275 324 {
monpjc 0:a23e8a7c9275 325 "XCOMPLETE",
monpjc 0:a23e8a7c9275 326 "XTDOMASK",
monpjc 0:a23e8a7c9275 327 "XSIR",
monpjc 0:a23e8a7c9275 328 "XSDR",
monpjc 0:a23e8a7c9275 329 "XRUNTEST",
monpjc 0:a23e8a7c9275 330 "Reserved5",
monpjc 0:a23e8a7c9275 331 "Reserved6",
monpjc 0:a23e8a7c9275 332 "XREPEAT",
monpjc 0:a23e8a7c9275 333 "XSDRSIZE",
monpjc 0:a23e8a7c9275 334 "XSDRTDO",
monpjc 0:a23e8a7c9275 335 "XSETSDRMASKS",
monpjc 0:a23e8a7c9275 336 "XSDRINC",
monpjc 0:a23e8a7c9275 337 "XSDRB",
monpjc 0:a23e8a7c9275 338 "XSDRC",
monpjc 0:a23e8a7c9275 339 "XSDRE",
monpjc 0:a23e8a7c9275 340 "XSDRTDOB",
monpjc 0:a23e8a7c9275 341 "XSDRTDOC",
monpjc 0:a23e8a7c9275 342 "XSDRTDOE",
monpjc 0:a23e8a7c9275 343 "XSTATE",
monpjc 0:a23e8a7c9275 344 "XENDIR",
monpjc 0:a23e8a7c9275 345 "XENDDR",
monpjc 0:a23e8a7c9275 346 "XSIR2",
monpjc 0:a23e8a7c9275 347 "XCOMMENT",
monpjc 0:a23e8a7c9275 348 "XWAIT"
monpjc 0:a23e8a7c9275 349 };
monpjc 0:a23e8a7c9275 350
monpjc 0:a23e8a7c9275 351 char* xsvf_pzErrorName[] =
monpjc 0:a23e8a7c9275 352 {
monpjc 0:a23e8a7c9275 353 "No error",
monpjc 0:a23e8a7c9275 354 "ERROR: Unknown",
monpjc 0:a23e8a7c9275 355 "ERROR: TDO mismatch",
monpjc 0:a23e8a7c9275 356 "ERROR: TDO mismatch and exceeded max retries",
monpjc 0:a23e8a7c9275 357 "ERROR: Unsupported XSVF command",
monpjc 0:a23e8a7c9275 358 "ERROR: Illegal state specification",
monpjc 0:a23e8a7c9275 359 "ERROR: Data overflows allocated MAX_LEN buffer size"
monpjc 0:a23e8a7c9275 360 };
monpjc 0:a23e8a7c9275 361
monpjc 0:a23e8a7c9275 362 char* xsvf_pzTapState[] =
monpjc 0:a23e8a7c9275 363 {
monpjc 0:a23e8a7c9275 364 "RESET", /* 0x00 */
monpjc 0:a23e8a7c9275 365 "RUNTEST/IDLE", /* 0x01 */
monpjc 0:a23e8a7c9275 366 "DRSELECT", /* 0x02 */
monpjc 0:a23e8a7c9275 367 "DRCAPTURE", /* 0x03 */
monpjc 0:a23e8a7c9275 368 "DRSHIFT", /* 0x04 */
monpjc 0:a23e8a7c9275 369 "DREXIT1", /* 0x05 */
monpjc 0:a23e8a7c9275 370 "DRPAUSE", /* 0x06 */
monpjc 0:a23e8a7c9275 371 "DREXIT2", /* 0x07 */
monpjc 0:a23e8a7c9275 372 "DRUPDATE", /* 0x08 */
monpjc 0:a23e8a7c9275 373 "IRSELECT", /* 0x09 */
monpjc 0:a23e8a7c9275 374 "IRCAPTURE", /* 0x0A */
monpjc 0:a23e8a7c9275 375 "IRSHIFT", /* 0x0B */
monpjc 0:a23e8a7c9275 376 "IREXIT1", /* 0x0C */
monpjc 0:a23e8a7c9275 377 "IRPAUSE", /* 0x0D */
monpjc 0:a23e8a7c9275 378 "IREXIT2", /* 0x0E */
monpjc 0:a23e8a7c9275 379 "IRUPDATE" /* 0x0F */
monpjc 0:a23e8a7c9275 380 };
monpjc 0:a23e8a7c9275 381 #endif /* DEBUG_MODE */
monpjc 0:a23e8a7c9275 382
monpjc 0:a23e8a7c9275 383 #ifdef DEBUG_MODE
monpjc 0:a23e8a7c9275 384 //FILE* in; /* Legacy DEBUG_MODE file pointer */
monpjc 0:a23e8a7c9275 385 int xsvf_iDebugLevel;
monpjc 0:a23e8a7c9275 386 #endif /* DEBUG_MODE */
monpjc 0:a23e8a7c9275 387
monpjc 0:a23e8a7c9275 388 /*============================================================================
monpjc 0:a23e8a7c9275 389 * Utility Functions
monpjc 0:a23e8a7c9275 390 ============================================================================*/
monpjc 0:a23e8a7c9275 391
monpjc 0:a23e8a7c9275 392 /*****************************************************************************
monpjc 0:a23e8a7c9275 393 * Function: xsvfPrintLenVal
monpjc 0:a23e8a7c9275 394 * Description: Print the lenval value in hex.
monpjc 0:a23e8a7c9275 395 * Parameters: plv - ptr to lenval.
monpjc 0:a23e8a7c9275 396 * Returns: void.
monpjc 0:a23e8a7c9275 397 *****************************************************************************/
monpjc 0:a23e8a7c9275 398 #ifdef DEBUG_MODE
monpjc 0:a23e8a7c9275 399 void xsvfPrintLenVal( lenVal *plv )
monpjc 0:a23e8a7c9275 400 {
monpjc 0:a23e8a7c9275 401 int i;
monpjc 0:a23e8a7c9275 402
monpjc 0:a23e8a7c9275 403 if ( plv )
monpjc 0:a23e8a7c9275 404 {
monpjc 0:a23e8a7c9275 405 printf( "0x" );
monpjc 0:a23e8a7c9275 406 for ( i = 0; i < plv->len; ++i )
monpjc 0:a23e8a7c9275 407 {
monpjc 0:a23e8a7c9275 408 printf( "%02x", ((unsigned int)(plv->val[ i ])) );
monpjc 0:a23e8a7c9275 409 }
monpjc 0:a23e8a7c9275 410 }
monpjc 0:a23e8a7c9275 411 }
monpjc 0:a23e8a7c9275 412 #endif /* DEBUG_MODE */
monpjc 0:a23e8a7c9275 413
monpjc 0:a23e8a7c9275 414
monpjc 0:a23e8a7c9275 415 /*****************************************************************************
monpjc 0:a23e8a7c9275 416 * Function: xsvfInfoInit
monpjc 0:a23e8a7c9275 417 * Description: Initialize the xsvfInfo data.
monpjc 0:a23e8a7c9275 418 * Parameters: pXsvfInfo - ptr to the XSVF info structure.
monpjc 0:a23e8a7c9275 419 * Returns: int - 0 = success; otherwise error.
monpjc 0:a23e8a7c9275 420 *****************************************************************************/
monpjc 0:a23e8a7c9275 421 int xsvfInfoInit( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 422 {
monpjc 0:a23e8a7c9275 423 //XSVFDBG_PRINTF1( 4, " sizeof( SXsvfInfo ) = %d bytes\n",
monpjc 0:a23e8a7c9275 424 // sizeof( SXsvfInfo ) );
monpjc 0:a23e8a7c9275 425
monpjc 0:a23e8a7c9275 426 pXsvfInfo->ucComplete = 0;
monpjc 0:a23e8a7c9275 427 pXsvfInfo->ucCommand = XCOMPLETE;
monpjc 0:a23e8a7c9275 428 pXsvfInfo->lCommandCount = 0;
monpjc 0:a23e8a7c9275 429 pXsvfInfo->iErrorCode = XSVF_ERROR_NONE;
monpjc 0:a23e8a7c9275 430 pXsvfInfo->ucMaxRepeat = 0;
monpjc 0:a23e8a7c9275 431 pXsvfInfo->ucTapState = XTAPSTATE_RESET;
monpjc 0:a23e8a7c9275 432 pXsvfInfo->ucEndIR = XTAPSTATE_RUNTEST;
monpjc 0:a23e8a7c9275 433 pXsvfInfo->ucEndDR = XTAPSTATE_RUNTEST;
monpjc 0:a23e8a7c9275 434 pXsvfInfo->lShiftLengthBits = 0L;
monpjc 0:a23e8a7c9275 435 pXsvfInfo->sShiftLengthBytes= 0;
monpjc 0:a23e8a7c9275 436 pXsvfInfo->lRunTestTime = 0L;
monpjc 0:a23e8a7c9275 437
monpjc 0:a23e8a7c9275 438 return( 0 );
monpjc 0:a23e8a7c9275 439 }
monpjc 0:a23e8a7c9275 440
monpjc 0:a23e8a7c9275 441 /*****************************************************************************
monpjc 0:a23e8a7c9275 442 * Function: xsvfInfoCleanup
monpjc 0:a23e8a7c9275 443 * Description: Cleanup the xsvfInfo data.
monpjc 0:a23e8a7c9275 444 * Parameters: pXsvfInfo - ptr to the XSVF info structure.
monpjc 0:a23e8a7c9275 445 * Returns: void.
monpjc 0:a23e8a7c9275 446 *****************************************************************************/
monpjc 0:a23e8a7c9275 447 void xsvfInfoCleanup( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 448 {
monpjc 0:a23e8a7c9275 449 }
monpjc 0:a23e8a7c9275 450
monpjc 0:a23e8a7c9275 451 /*****************************************************************************
monpjc 0:a23e8a7c9275 452 * Function: xsvfGetAsNumBytes
monpjc 0:a23e8a7c9275 453 * Description: Calculate the number of bytes the given number of bits
monpjc 0:a23e8a7c9275 454 * consumes.
monpjc 0:a23e8a7c9275 455 * Parameters: lNumBits - the number of bits.
monpjc 0:a23e8a7c9275 456 * Returns: short - the number of bytes to store the number of bits.
monpjc 0:a23e8a7c9275 457 *****************************************************************************/
monpjc 0:a23e8a7c9275 458 short xsvfGetAsNumBytes( long lNumBits )
monpjc 0:a23e8a7c9275 459 {
monpjc 0:a23e8a7c9275 460 return( (short)( ( lNumBits + 7L ) / 8L ) );
monpjc 0:a23e8a7c9275 461 }
monpjc 0:a23e8a7c9275 462
monpjc 0:a23e8a7c9275 463 /*****************************************************************************
monpjc 0:a23e8a7c9275 464 * Function: xsvfTmsTransition
monpjc 0:a23e8a7c9275 465 * Description: Apply TMS and transition TAP controller by applying one TCK
monpjc 0:a23e8a7c9275 466 * cycle.
monpjc 0:a23e8a7c9275 467 * Parameters: sTms - new TMS value.
monpjc 0:a23e8a7c9275 468 * Returns: void.
monpjc 0:a23e8a7c9275 469 *****************************************************************************/
monpjc 0:a23e8a7c9275 470 void xsvfTmsTransition( short sTms )
monpjc 0:a23e8a7c9275 471 {
monpjc 0:a23e8a7c9275 472 setPort( TMS, sTms );
monpjc 0:a23e8a7c9275 473 setPort( TCK, 0 );
monpjc 0:a23e8a7c9275 474 setPort( TCK, 1 );
monpjc 0:a23e8a7c9275 475 }
monpjc 0:a23e8a7c9275 476
monpjc 0:a23e8a7c9275 477 /*****************************************************************************
monpjc 0:a23e8a7c9275 478 * Function: xsvfGotoTapState
monpjc 0:a23e8a7c9275 479 * Description: From the current TAP state, go to the named TAP state.
monpjc 0:a23e8a7c9275 480 * A target state of RESET ALWAYS causes TMS reset sequence.
monpjc 0:a23e8a7c9275 481 * All SVF standard stable state paths are supported.
monpjc 0:a23e8a7c9275 482 * All state transitions are supported except for the following
monpjc 0:a23e8a7c9275 483 * which cause an XSVF_ERROR_ILLEGALSTATE:
monpjc 0:a23e8a7c9275 484 * - Target==DREXIT2; Start!=DRPAUSE
monpjc 0:a23e8a7c9275 485 * - Target==IREXIT2; Start!=IRPAUSE
monpjc 0:a23e8a7c9275 486 * Parameters: pucTapState - Current TAP state; returns final TAP state.
monpjc 0:a23e8a7c9275 487 * ucTargetState - New target TAP state.
monpjc 0:a23e8a7c9275 488 * Returns: int - 0 = success; otherwise error.
monpjc 0:a23e8a7c9275 489 *****************************************************************************/
monpjc 0:a23e8a7c9275 490 int xsvfGotoTapState( unsigned char* pucTapState,
monpjc 0:a23e8a7c9275 491 unsigned char ucTargetState )
monpjc 0:a23e8a7c9275 492 {
monpjc 0:a23e8a7c9275 493 int i;
monpjc 0:a23e8a7c9275 494 int iErrorCode;
monpjc 0:a23e8a7c9275 495
monpjc 0:a23e8a7c9275 496 iErrorCode = XSVF_ERROR_NONE;
monpjc 0:a23e8a7c9275 497 if ( ucTargetState == XTAPSTATE_RESET )
monpjc 0:a23e8a7c9275 498 {
monpjc 0:a23e8a7c9275 499 /* If RESET, always perform TMS reset sequence to reset/sync TAPs */
monpjc 0:a23e8a7c9275 500 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 501 for ( i = 0; i < 5; ++i )
monpjc 0:a23e8a7c9275 502 {
monpjc 0:a23e8a7c9275 503 setPort( TCK, 0 );
monpjc 0:a23e8a7c9275 504 setPort( TCK, 1 );
monpjc 0:a23e8a7c9275 505 }
monpjc 0:a23e8a7c9275 506 *pucTapState = XTAPSTATE_RESET;
monpjc 0:a23e8a7c9275 507 XSVFDBG_PRINTF( 3, " TMS Reset Sequence -> Test-Logic-Reset\n" );
monpjc 0:a23e8a7c9275 508 XSVFDBG_PRINTF1( 3, " TAP State = %s\n",
monpjc 0:a23e8a7c9275 509 xsvf_pzTapState[ *pucTapState ] );
monpjc 0:a23e8a7c9275 510 }
monpjc 0:a23e8a7c9275 511 else if ( ( ucTargetState != *pucTapState ) &&
monpjc 0:a23e8a7c9275 512 ( ( ( ucTargetState == XTAPSTATE_EXIT2DR ) && ( *pucTapState != XTAPSTATE_PAUSEDR ) ) ||
monpjc 0:a23e8a7c9275 513 ( ( ucTargetState == XTAPSTATE_EXIT2IR ) && ( *pucTapState != XTAPSTATE_PAUSEIR ) ) ) )
monpjc 0:a23e8a7c9275 514 {
monpjc 0:a23e8a7c9275 515 /* Trap illegal TAP state path specification */
monpjc 0:a23e8a7c9275 516 iErrorCode = XSVF_ERROR_ILLEGALSTATE;
monpjc 0:a23e8a7c9275 517 }
monpjc 0:a23e8a7c9275 518 else
monpjc 0:a23e8a7c9275 519 {
monpjc 0:a23e8a7c9275 520 if ( ucTargetState == *pucTapState )
monpjc 0:a23e8a7c9275 521 {
monpjc 0:a23e8a7c9275 522 /* Already in target state. Do nothing except when in DRPAUSE
monpjc 0:a23e8a7c9275 523 or in IRPAUSE to comply with SVF standard */
monpjc 0:a23e8a7c9275 524 if ( ucTargetState == XTAPSTATE_PAUSEDR )
monpjc 0:a23e8a7c9275 525 {
monpjc 0:a23e8a7c9275 526 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 527 *pucTapState = XTAPSTATE_EXIT2DR;
monpjc 0:a23e8a7c9275 528 XSVFDBG_PRINTF1( 3, " TAP State = %s\n",
monpjc 0:a23e8a7c9275 529 xsvf_pzTapState[ *pucTapState ] );
monpjc 0:a23e8a7c9275 530 }
monpjc 0:a23e8a7c9275 531 else if ( ucTargetState == XTAPSTATE_PAUSEIR )
monpjc 0:a23e8a7c9275 532 {
monpjc 0:a23e8a7c9275 533 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 534 *pucTapState = XTAPSTATE_EXIT2IR;
monpjc 0:a23e8a7c9275 535 XSVFDBG_PRINTF1( 3, " TAP State = %s\n",
monpjc 0:a23e8a7c9275 536 xsvf_pzTapState[ *pucTapState ] );
monpjc 0:a23e8a7c9275 537 }
monpjc 0:a23e8a7c9275 538 }
monpjc 0:a23e8a7c9275 539
monpjc 0:a23e8a7c9275 540 /* Perform TAP state transitions to get to the target state */
monpjc 0:a23e8a7c9275 541 while ( ucTargetState != *pucTapState )
monpjc 0:a23e8a7c9275 542 {
monpjc 0:a23e8a7c9275 543 switch ( *pucTapState )
monpjc 0:a23e8a7c9275 544 {
monpjc 0:a23e8a7c9275 545 case XTAPSTATE_RESET:
monpjc 0:a23e8a7c9275 546 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 547 *pucTapState = XTAPSTATE_RUNTEST;
monpjc 0:a23e8a7c9275 548 break;
monpjc 0:a23e8a7c9275 549 case XTAPSTATE_RUNTEST:
monpjc 0:a23e8a7c9275 550 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 551 *pucTapState = XTAPSTATE_SELECTDR;
monpjc 0:a23e8a7c9275 552 break;
monpjc 0:a23e8a7c9275 553 case XTAPSTATE_SELECTDR:
monpjc 0:a23e8a7c9275 554 if ( ucTargetState >= XTAPSTATE_IRSTATES )
monpjc 0:a23e8a7c9275 555 {
monpjc 0:a23e8a7c9275 556 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 557 *pucTapState = XTAPSTATE_SELECTIR;
monpjc 0:a23e8a7c9275 558 }
monpjc 0:a23e8a7c9275 559 else
monpjc 0:a23e8a7c9275 560 {
monpjc 0:a23e8a7c9275 561 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 562 *pucTapState = XTAPSTATE_CAPTUREDR;
monpjc 0:a23e8a7c9275 563 }
monpjc 0:a23e8a7c9275 564 break;
monpjc 0:a23e8a7c9275 565 case XTAPSTATE_CAPTUREDR:
monpjc 0:a23e8a7c9275 566 if ( ucTargetState == XTAPSTATE_SHIFTDR )
monpjc 0:a23e8a7c9275 567 {
monpjc 0:a23e8a7c9275 568 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 569 *pucTapState = XTAPSTATE_SHIFTDR;
monpjc 0:a23e8a7c9275 570 }
monpjc 0:a23e8a7c9275 571 else
monpjc 0:a23e8a7c9275 572 {
monpjc 0:a23e8a7c9275 573 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 574 *pucTapState = XTAPSTATE_EXIT1DR;
monpjc 0:a23e8a7c9275 575 }
monpjc 0:a23e8a7c9275 576 break;
monpjc 0:a23e8a7c9275 577 case XTAPSTATE_SHIFTDR:
monpjc 0:a23e8a7c9275 578 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 579 *pucTapState = XTAPSTATE_EXIT1DR;
monpjc 0:a23e8a7c9275 580 break;
monpjc 0:a23e8a7c9275 581 case XTAPSTATE_EXIT1DR:
monpjc 0:a23e8a7c9275 582 if ( ucTargetState == XTAPSTATE_PAUSEDR )
monpjc 0:a23e8a7c9275 583 {
monpjc 0:a23e8a7c9275 584 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 585 *pucTapState = XTAPSTATE_PAUSEDR;
monpjc 0:a23e8a7c9275 586 }
monpjc 0:a23e8a7c9275 587 else
monpjc 0:a23e8a7c9275 588 {
monpjc 0:a23e8a7c9275 589 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 590 *pucTapState = XTAPSTATE_UPDATEDR;
monpjc 0:a23e8a7c9275 591 }
monpjc 0:a23e8a7c9275 592 break;
monpjc 0:a23e8a7c9275 593 case XTAPSTATE_PAUSEDR:
monpjc 0:a23e8a7c9275 594 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 595 *pucTapState = XTAPSTATE_EXIT2DR;
monpjc 0:a23e8a7c9275 596 break;
monpjc 0:a23e8a7c9275 597 case XTAPSTATE_EXIT2DR:
monpjc 0:a23e8a7c9275 598 if ( ucTargetState == XTAPSTATE_SHIFTDR )
monpjc 0:a23e8a7c9275 599 {
monpjc 0:a23e8a7c9275 600 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 601 *pucTapState = XTAPSTATE_SHIFTDR;
monpjc 0:a23e8a7c9275 602 }
monpjc 0:a23e8a7c9275 603 else
monpjc 0:a23e8a7c9275 604 {
monpjc 0:a23e8a7c9275 605 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 606 *pucTapState = XTAPSTATE_UPDATEDR;
monpjc 0:a23e8a7c9275 607 }
monpjc 0:a23e8a7c9275 608 break;
monpjc 0:a23e8a7c9275 609 case XTAPSTATE_UPDATEDR:
monpjc 0:a23e8a7c9275 610 if ( ucTargetState == XTAPSTATE_RUNTEST )
monpjc 0:a23e8a7c9275 611 {
monpjc 0:a23e8a7c9275 612 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 613 *pucTapState = XTAPSTATE_RUNTEST;
monpjc 0:a23e8a7c9275 614 }
monpjc 0:a23e8a7c9275 615 else
monpjc 0:a23e8a7c9275 616 {
monpjc 0:a23e8a7c9275 617 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 618 *pucTapState = XTAPSTATE_SELECTDR;
monpjc 0:a23e8a7c9275 619 }
monpjc 0:a23e8a7c9275 620 break;
monpjc 0:a23e8a7c9275 621 case XTAPSTATE_SELECTIR:
monpjc 0:a23e8a7c9275 622 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 623 *pucTapState = XTAPSTATE_CAPTUREIR;
monpjc 0:a23e8a7c9275 624 break;
monpjc 0:a23e8a7c9275 625 case XTAPSTATE_CAPTUREIR:
monpjc 0:a23e8a7c9275 626 if ( ucTargetState == XTAPSTATE_SHIFTIR )
monpjc 0:a23e8a7c9275 627 {
monpjc 0:a23e8a7c9275 628 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 629 *pucTapState = XTAPSTATE_SHIFTIR;
monpjc 0:a23e8a7c9275 630 }
monpjc 0:a23e8a7c9275 631 else
monpjc 0:a23e8a7c9275 632 {
monpjc 0:a23e8a7c9275 633 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 634 *pucTapState = XTAPSTATE_EXIT1IR;
monpjc 0:a23e8a7c9275 635 }
monpjc 0:a23e8a7c9275 636 break;
monpjc 0:a23e8a7c9275 637 case XTAPSTATE_SHIFTIR:
monpjc 0:a23e8a7c9275 638 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 639 *pucTapState = XTAPSTATE_EXIT1IR;
monpjc 0:a23e8a7c9275 640 break;
monpjc 0:a23e8a7c9275 641 case XTAPSTATE_EXIT1IR:
monpjc 0:a23e8a7c9275 642 if ( ucTargetState == XTAPSTATE_PAUSEIR )
monpjc 0:a23e8a7c9275 643 {
monpjc 0:a23e8a7c9275 644 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 645 *pucTapState = XTAPSTATE_PAUSEIR;
monpjc 0:a23e8a7c9275 646 }
monpjc 0:a23e8a7c9275 647 else
monpjc 0:a23e8a7c9275 648 {
monpjc 0:a23e8a7c9275 649 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 650 *pucTapState = XTAPSTATE_UPDATEIR;
monpjc 0:a23e8a7c9275 651 }
monpjc 0:a23e8a7c9275 652 break;
monpjc 0:a23e8a7c9275 653 case XTAPSTATE_PAUSEIR:
monpjc 0:a23e8a7c9275 654 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 655 *pucTapState = XTAPSTATE_EXIT2IR;
monpjc 0:a23e8a7c9275 656 break;
monpjc 0:a23e8a7c9275 657 case XTAPSTATE_EXIT2IR:
monpjc 0:a23e8a7c9275 658 if ( ucTargetState == XTAPSTATE_SHIFTIR )
monpjc 0:a23e8a7c9275 659 {
monpjc 0:a23e8a7c9275 660 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 661 *pucTapState = XTAPSTATE_SHIFTIR;
monpjc 0:a23e8a7c9275 662 }
monpjc 0:a23e8a7c9275 663 else
monpjc 0:a23e8a7c9275 664 {
monpjc 0:a23e8a7c9275 665 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 666 *pucTapState = XTAPSTATE_UPDATEIR;
monpjc 0:a23e8a7c9275 667 }
monpjc 0:a23e8a7c9275 668 break;
monpjc 0:a23e8a7c9275 669 case XTAPSTATE_UPDATEIR:
monpjc 0:a23e8a7c9275 670 if ( ucTargetState == XTAPSTATE_RUNTEST )
monpjc 0:a23e8a7c9275 671 {
monpjc 0:a23e8a7c9275 672 xsvfTmsTransition( 0 );
monpjc 0:a23e8a7c9275 673 *pucTapState = XTAPSTATE_RUNTEST;
monpjc 0:a23e8a7c9275 674 }
monpjc 0:a23e8a7c9275 675 else
monpjc 0:a23e8a7c9275 676 {
monpjc 0:a23e8a7c9275 677 xsvfTmsTransition( 1 );
monpjc 0:a23e8a7c9275 678 *pucTapState = XTAPSTATE_SELECTDR;
monpjc 0:a23e8a7c9275 679 }
monpjc 0:a23e8a7c9275 680 break;
monpjc 0:a23e8a7c9275 681 default:
monpjc 0:a23e8a7c9275 682 iErrorCode = XSVF_ERROR_ILLEGALSTATE;
monpjc 0:a23e8a7c9275 683 *pucTapState = ucTargetState; /* Exit while loop */
monpjc 0:a23e8a7c9275 684 break;
monpjc 0:a23e8a7c9275 685 }
monpjc 0:a23e8a7c9275 686 XSVFDBG_PRINTF1( 3, " TAP State = %s\n",
monpjc 0:a23e8a7c9275 687 xsvf_pzTapState[ *pucTapState ] );
monpjc 0:a23e8a7c9275 688 }
monpjc 0:a23e8a7c9275 689 }
monpjc 0:a23e8a7c9275 690
monpjc 0:a23e8a7c9275 691 return( iErrorCode );
monpjc 0:a23e8a7c9275 692 }
monpjc 0:a23e8a7c9275 693
monpjc 0:a23e8a7c9275 694 /*****************************************************************************
monpjc 0:a23e8a7c9275 695 * Function: xsvfShiftOnly
monpjc 0:a23e8a7c9275 696 * Description: Assumes that starting TAP state is SHIFT-DR or SHIFT-IR.
monpjc 0:a23e8a7c9275 697 * Shift the given TDI data into the JTAG scan chain.
monpjc 0:a23e8a7c9275 698 * Optionally, save the TDO data shifted out of the scan chain.
monpjc 0:a23e8a7c9275 699 * Last shift cycle is special: capture last TDO, set last TDI,
monpjc 0:a23e8a7c9275 700 * but does not pulse TCK. Caller must pulse TCK and optionally
monpjc 0:a23e8a7c9275 701 * set TMS=1 to exit shift state.
monpjc 0:a23e8a7c9275 702 * Parameters: lNumBits - number of bits to shift.
monpjc 0:a23e8a7c9275 703 * plvTdi - ptr to lenval for TDI data.
monpjc 0:a23e8a7c9275 704 * plvTdoCaptured - ptr to lenval for storing captured TDO data.
monpjc 0:a23e8a7c9275 705 * iExitShift - 1=exit at end of shift; 0=stay in Shift-DR.
monpjc 0:a23e8a7c9275 706 * Returns: void.
monpjc 0:a23e8a7c9275 707 *****************************************************************************/
monpjc 0:a23e8a7c9275 708 void xsvfShiftOnly( long lNumBits,
monpjc 0:a23e8a7c9275 709 lenVal* plvTdi,
monpjc 0:a23e8a7c9275 710 lenVal* plvTdoCaptured,
monpjc 0:a23e8a7c9275 711 int iExitShift )
monpjc 0:a23e8a7c9275 712 {
monpjc 0:a23e8a7c9275 713 unsigned char* pucTdi;
monpjc 0:a23e8a7c9275 714 unsigned char* pucTdo;
monpjc 0:a23e8a7c9275 715 unsigned char ucTdiByte;
monpjc 0:a23e8a7c9275 716 unsigned char ucTdoByte;
monpjc 0:a23e8a7c9275 717 unsigned char ucTdoBit;
monpjc 0:a23e8a7c9275 718 int i;
monpjc 0:a23e8a7c9275 719
monpjc 0:a23e8a7c9275 720 /* assert( ( ( lNumBits + 7 ) / 8 ) == plvTdi->len ); */
monpjc 0:a23e8a7c9275 721
monpjc 0:a23e8a7c9275 722 /* Initialize TDO storage len == TDI len */
monpjc 0:a23e8a7c9275 723 pucTdo = 0;
monpjc 0:a23e8a7c9275 724 if ( plvTdoCaptured )
monpjc 0:a23e8a7c9275 725 {
monpjc 0:a23e8a7c9275 726 plvTdoCaptured->len = plvTdi->len;
monpjc 0:a23e8a7c9275 727 pucTdo = plvTdoCaptured->val + plvTdi->len;
monpjc 0:a23e8a7c9275 728 }
monpjc 0:a23e8a7c9275 729
monpjc 0:a23e8a7c9275 730 /* Shift LSB first. val[N-1] == LSB. val[0] == MSB. */
monpjc 0:a23e8a7c9275 731 pucTdi = plvTdi->val + plvTdi->len;
monpjc 0:a23e8a7c9275 732 while ( lNumBits )
monpjc 0:a23e8a7c9275 733 {
monpjc 0:a23e8a7c9275 734 /* Process on a byte-basis */
monpjc 0:a23e8a7c9275 735 ucTdiByte = (*(--pucTdi));
monpjc 0:a23e8a7c9275 736 ucTdoByte = 0;
monpjc 0:a23e8a7c9275 737 for ( i = 0; ( lNumBits && ( i < 8 ) ); ++i )
monpjc 0:a23e8a7c9275 738 {
monpjc 0:a23e8a7c9275 739 --lNumBits;
monpjc 0:a23e8a7c9275 740 if ( iExitShift && !lNumBits )
monpjc 0:a23e8a7c9275 741 {
monpjc 0:a23e8a7c9275 742 /* Exit Shift-DR state */
monpjc 0:a23e8a7c9275 743 setPort( TMS, 1 );
monpjc 0:a23e8a7c9275 744 }
monpjc 0:a23e8a7c9275 745
monpjc 0:a23e8a7c9275 746 /* Set the new TDI value */
monpjc 0:a23e8a7c9275 747 setPort( TDI, (short)(ucTdiByte & 1) );
monpjc 0:a23e8a7c9275 748 ucTdiByte >>= 1;
monpjc 0:a23e8a7c9275 749
monpjc 0:a23e8a7c9275 750 /* Set TCK low */
monpjc 0:a23e8a7c9275 751 setPort( TCK, 0 );
monpjc 0:a23e8a7c9275 752
monpjc 0:a23e8a7c9275 753 if ( pucTdo )
monpjc 0:a23e8a7c9275 754 {
monpjc 0:a23e8a7c9275 755 /* Save the TDO value */
monpjc 0:a23e8a7c9275 756 ucTdoBit = readTDOBit();
monpjc 0:a23e8a7c9275 757 ucTdoByte |= ( ucTdoBit << i );
monpjc 0:a23e8a7c9275 758 }
monpjc 0:a23e8a7c9275 759
monpjc 0:a23e8a7c9275 760 /* Set TCK high */
monpjc 0:a23e8a7c9275 761 setPort( TCK, 1 );
monpjc 0:a23e8a7c9275 762 }
monpjc 0:a23e8a7c9275 763
monpjc 0:a23e8a7c9275 764 /* Save the TDO byte value */
monpjc 0:a23e8a7c9275 765 if ( pucTdo )
monpjc 0:a23e8a7c9275 766 {
monpjc 0:a23e8a7c9275 767 (*(--pucTdo)) = ucTdoByte;
monpjc 0:a23e8a7c9275 768 }
monpjc 0:a23e8a7c9275 769 }
monpjc 0:a23e8a7c9275 770 }
monpjc 0:a23e8a7c9275 771
monpjc 0:a23e8a7c9275 772 /*****************************************************************************
monpjc 0:a23e8a7c9275 773 * Function: xsvfShift
monpjc 0:a23e8a7c9275 774 * Description: Goes to the given starting TAP state.
monpjc 0:a23e8a7c9275 775 * Calls xsvfShiftOnly to shift in the given TDI data and
monpjc 0:a23e8a7c9275 776 * optionally capture the TDO data.
monpjc 0:a23e8a7c9275 777 * Compares the TDO captured data against the TDO expected
monpjc 0:a23e8a7c9275 778 * data.
monpjc 0:a23e8a7c9275 779 * If a data mismatch occurs, then executes the exception
monpjc 0:a23e8a7c9275 780 * handling loop upto ucMaxRepeat times.
monpjc 0:a23e8a7c9275 781 * Parameters: pucTapState - Ptr to current TAP state.
monpjc 0:a23e8a7c9275 782 * ucStartState - Starting shift state: Shift-DR or Shift-IR.
monpjc 0:a23e8a7c9275 783 * lNumBits - number of bits to shift.
monpjc 0:a23e8a7c9275 784 * plvTdi - ptr to lenval for TDI data.
monpjc 0:a23e8a7c9275 785 * plvTdoCaptured - ptr to lenval for storing TDO data.
monpjc 0:a23e8a7c9275 786 * plvTdoExpected - ptr to expected TDO data.
monpjc 0:a23e8a7c9275 787 * plvTdoMask - ptr to TDO mask.
monpjc 0:a23e8a7c9275 788 * ucEndState - state in which to end the shift.
monpjc 0:a23e8a7c9275 789 * lRunTestTime - amount of time to wait after the shift.
monpjc 0:a23e8a7c9275 790 * ucMaxRepeat - Maximum number of retries on TDO mismatch.
monpjc 0:a23e8a7c9275 791 * Returns: int - 0 = success; otherwise TDO mismatch.
monpjc 0:a23e8a7c9275 792 * Notes: XC9500XL-only Optimization:
monpjc 0:a23e8a7c9275 793 * Skip the waitTime() if plvTdoMask->val[0:plvTdoMask->len-1]
monpjc 0:a23e8a7c9275 794 * is NOT all zeros and sMatch==1.
monpjc 0:a23e8a7c9275 795 *****************************************************************************/
monpjc 0:a23e8a7c9275 796 int xsvfShift( unsigned char* pucTapState,
monpjc 0:a23e8a7c9275 797 unsigned char ucStartState,
monpjc 0:a23e8a7c9275 798 long lNumBits,
monpjc 0:a23e8a7c9275 799 lenVal* plvTdi,
monpjc 0:a23e8a7c9275 800 lenVal* plvTdoCaptured,
monpjc 0:a23e8a7c9275 801 lenVal* plvTdoExpected,
monpjc 0:a23e8a7c9275 802 lenVal* plvTdoMask,
monpjc 0:a23e8a7c9275 803 unsigned char ucEndState,
monpjc 0:a23e8a7c9275 804 long lRunTestTime,
monpjc 0:a23e8a7c9275 805 unsigned char ucMaxRepeat )
monpjc 0:a23e8a7c9275 806 {
monpjc 0:a23e8a7c9275 807 int iErrorCode;
monpjc 0:a23e8a7c9275 808 int iMismatch;
monpjc 0:a23e8a7c9275 809 unsigned char ucRepeat;
monpjc 0:a23e8a7c9275 810 int iExitShift;
monpjc 0:a23e8a7c9275 811
monpjc 0:a23e8a7c9275 812 iErrorCode = XSVF_ERROR_NONE;
monpjc 0:a23e8a7c9275 813 iMismatch = 0;
monpjc 0:a23e8a7c9275 814 ucRepeat = 0;
monpjc 0:a23e8a7c9275 815 iExitShift = ( ucStartState != ucEndState );
monpjc 0:a23e8a7c9275 816
monpjc 0:a23e8a7c9275 817 XSVFDBG_PRINTF1( 3, " Shift Length = %ld\n", lNumBits );
monpjc 0:a23e8a7c9275 818 XSVFDBG_PRINTF( 4, " TDI = ");
monpjc 0:a23e8a7c9275 819 XSVFDBG_PRINTLENVAL( 4, plvTdi );
monpjc 0:a23e8a7c9275 820 XSVFDBG_PRINTF( 4, "\n");
monpjc 0:a23e8a7c9275 821 XSVFDBG_PRINTF( 4, " TDO Expected = ");
monpjc 0:a23e8a7c9275 822 XSVFDBG_PRINTLENVAL( 4, plvTdoExpected );
monpjc 0:a23e8a7c9275 823 XSVFDBG_PRINTF( 4, "\n");
monpjc 0:a23e8a7c9275 824
monpjc 0:a23e8a7c9275 825 if ( !lNumBits )
monpjc 0:a23e8a7c9275 826 {
monpjc 0:a23e8a7c9275 827 /* Compatibility with XSVF2.00: XSDR 0 = no shift, but wait in RTI */
monpjc 0:a23e8a7c9275 828 if ( lRunTestTime )
monpjc 0:a23e8a7c9275 829 {
monpjc 0:a23e8a7c9275 830 /* Wait for prespecified XRUNTEST time */
monpjc 0:a23e8a7c9275 831 xsvfGotoTapState( pucTapState, XTAPSTATE_RUNTEST );
monpjc 0:a23e8a7c9275 832 XSVFDBG_PRINTF1( 3, " Wait = %ld usec\n", lRunTestTime );
monpjc 0:a23e8a7c9275 833 waitTime( lRunTestTime );
monpjc 0:a23e8a7c9275 834 }
monpjc 0:a23e8a7c9275 835 }
monpjc 0:a23e8a7c9275 836 else
monpjc 0:a23e8a7c9275 837 {
monpjc 0:a23e8a7c9275 838 do
monpjc 0:a23e8a7c9275 839 {
monpjc 0:a23e8a7c9275 840 /* Goto Shift-DR or Shift-IR */
monpjc 0:a23e8a7c9275 841 xsvfGotoTapState( pucTapState, ucStartState );
monpjc 0:a23e8a7c9275 842
monpjc 0:a23e8a7c9275 843 /* Shift TDI and capture TDO */
monpjc 0:a23e8a7c9275 844 xsvfShiftOnly( lNumBits, plvTdi, plvTdoCaptured, iExitShift );
monpjc 0:a23e8a7c9275 845
monpjc 0:a23e8a7c9275 846 if ( plvTdoExpected )
monpjc 0:a23e8a7c9275 847 {
monpjc 0:a23e8a7c9275 848 /* Compare TDO data to expected TDO data */
monpjc 0:a23e8a7c9275 849 iMismatch = !EqualLenVal( plvTdoExpected,
monpjc 0:a23e8a7c9275 850 plvTdoCaptured,
monpjc 0:a23e8a7c9275 851 plvTdoMask );
monpjc 0:a23e8a7c9275 852 }
monpjc 0:a23e8a7c9275 853
monpjc 0:a23e8a7c9275 854 if ( iExitShift )
monpjc 0:a23e8a7c9275 855 {
monpjc 0:a23e8a7c9275 856 /* Update TAP state: Shift->Exit */
monpjc 0:a23e8a7c9275 857 ++(*pucTapState);
monpjc 0:a23e8a7c9275 858 XSVFDBG_PRINTF1( 3, " TAP State = %s\n",
monpjc 0:a23e8a7c9275 859 xsvf_pzTapState[ *pucTapState ] );
monpjc 0:a23e8a7c9275 860
monpjc 0:a23e8a7c9275 861 if ( iMismatch && lRunTestTime && ( ucRepeat < ucMaxRepeat ) )
monpjc 0:a23e8a7c9275 862 {
monpjc 0:a23e8a7c9275 863 XSVFDBG_PRINTF( 4, " TDO Expected = ");
monpjc 0:a23e8a7c9275 864 XSVFDBG_PRINTLENVAL( 4, plvTdoExpected );
monpjc 0:a23e8a7c9275 865 XSVFDBG_PRINTF( 4, "\n");
monpjc 0:a23e8a7c9275 866 XSVFDBG_PRINTF( 4, " TDO Captured = ");
monpjc 0:a23e8a7c9275 867 XSVFDBG_PRINTLENVAL( 4, plvTdoCaptured );
monpjc 0:a23e8a7c9275 868 XSVFDBG_PRINTF( 4, "\n");
monpjc 0:a23e8a7c9275 869 XSVFDBG_PRINTF( 4, " TDO Mask = ");
monpjc 0:a23e8a7c9275 870 XSVFDBG_PRINTLENVAL( 4, plvTdoMask );
monpjc 0:a23e8a7c9275 871 XSVFDBG_PRINTF( 4, "\n");
monpjc 0:a23e8a7c9275 872 XSVFDBG_PRINTF1( 3, " Retry #%d\n", ( ucRepeat + 1 ) );
monpjc 0:a23e8a7c9275 873 /* Do exception handling retry - ShiftDR only */
monpjc 0:a23e8a7c9275 874 xsvfGotoTapState( pucTapState, XTAPSTATE_PAUSEDR );
monpjc 0:a23e8a7c9275 875 /* Shift 1 extra bit */
monpjc 0:a23e8a7c9275 876 xsvfGotoTapState( pucTapState, XTAPSTATE_SHIFTDR );
monpjc 0:a23e8a7c9275 877 /* Increment RUNTEST time by an additional 25% */
monpjc 0:a23e8a7c9275 878 lRunTestTime += ( lRunTestTime >> 2 );
monpjc 0:a23e8a7c9275 879 }
monpjc 0:a23e8a7c9275 880 else
monpjc 0:a23e8a7c9275 881 {
monpjc 0:a23e8a7c9275 882 /* Do normal exit from Shift-XR */
monpjc 0:a23e8a7c9275 883 xsvfGotoTapState( pucTapState, ucEndState );
monpjc 0:a23e8a7c9275 884 }
monpjc 0:a23e8a7c9275 885
monpjc 0:a23e8a7c9275 886 if ( lRunTestTime )
monpjc 0:a23e8a7c9275 887 {
monpjc 0:a23e8a7c9275 888 /* Wait for prespecified XRUNTEST time */
monpjc 0:a23e8a7c9275 889 xsvfGotoTapState( pucTapState, XTAPSTATE_RUNTEST );
monpjc 0:a23e8a7c9275 890 XSVFDBG_PRINTF1( 3, " Wait = %ld usec\n", lRunTestTime );
monpjc 0:a23e8a7c9275 891 waitTime( lRunTestTime );
monpjc 0:a23e8a7c9275 892 }
monpjc 0:a23e8a7c9275 893 }
monpjc 0:a23e8a7c9275 894 } while ( iMismatch && ( ucRepeat++ < ucMaxRepeat ) );
monpjc 0:a23e8a7c9275 895 }
monpjc 0:a23e8a7c9275 896
monpjc 0:a23e8a7c9275 897 if ( iMismatch )
monpjc 0:a23e8a7c9275 898 {
monpjc 0:a23e8a7c9275 899 XSVFDBG_PRINTF( 1, " TDO Expected = ");
monpjc 0:a23e8a7c9275 900 XSVFDBG_PRINTLENVAL( 1, plvTdoExpected );
monpjc 0:a23e8a7c9275 901 XSVFDBG_PRINTF( 1, "\n");
monpjc 0:a23e8a7c9275 902 XSVFDBG_PRINTF( 1, " TDO Captured = ");
monpjc 0:a23e8a7c9275 903 XSVFDBG_PRINTLENVAL( 1, plvTdoCaptured );
monpjc 0:a23e8a7c9275 904 XSVFDBG_PRINTF( 1, "\n");
monpjc 0:a23e8a7c9275 905 XSVFDBG_PRINTF( 1, " TDO Mask = ");
monpjc 0:a23e8a7c9275 906 XSVFDBG_PRINTLENVAL( 1, plvTdoMask );
monpjc 0:a23e8a7c9275 907 XSVFDBG_PRINTF( 1, "\n");
monpjc 0:a23e8a7c9275 908 if ( ucMaxRepeat && ( ucRepeat > ucMaxRepeat ) )
monpjc 0:a23e8a7c9275 909 {
monpjc 0:a23e8a7c9275 910 iErrorCode = XSVF_ERROR_MAXRETRIES;
monpjc 0:a23e8a7c9275 911 }
monpjc 0:a23e8a7c9275 912 else
monpjc 0:a23e8a7c9275 913 {
monpjc 0:a23e8a7c9275 914 iErrorCode = XSVF_ERROR_TDOMISMATCH;
monpjc 0:a23e8a7c9275 915 }
monpjc 0:a23e8a7c9275 916 }
monpjc 0:a23e8a7c9275 917
monpjc 0:a23e8a7c9275 918 return( iErrorCode );
monpjc 0:a23e8a7c9275 919 }
monpjc 0:a23e8a7c9275 920
monpjc 0:a23e8a7c9275 921 /*****************************************************************************
monpjc 0:a23e8a7c9275 922 * Function: xsvfBasicXSDRTDO
monpjc 0:a23e8a7c9275 923 * Description: Get the XSDRTDO parameters and execute the XSDRTDO command.
monpjc 0:a23e8a7c9275 924 * This is the common function for all XSDRTDO commands.
monpjc 0:a23e8a7c9275 925 * Parameters: pucTapState - Current TAP state.
monpjc 0:a23e8a7c9275 926 * lShiftLengthBits - number of bits to shift.
monpjc 0:a23e8a7c9275 927 * sShiftLengthBytes - number of bytes to read.
monpjc 0:a23e8a7c9275 928 * plvTdi - ptr to lenval for TDI data.
monpjc 0:a23e8a7c9275 929 * lvTdoCaptured - ptr to lenval for storing TDO data.
monpjc 0:a23e8a7c9275 930 * iEndState - state in which to end the shift.
monpjc 0:a23e8a7c9275 931 * lRunTestTime - amount of time to wait after the shift.
monpjc 0:a23e8a7c9275 932 * ucMaxRepeat - maximum xc9500/xl retries.
monpjc 0:a23e8a7c9275 933 * Returns: int - 0 = success; otherwise TDO mismatch.
monpjc 0:a23e8a7c9275 934 *****************************************************************************/
monpjc 0:a23e8a7c9275 935 int xsvfBasicXSDRTDO( unsigned char* pucTapState,
monpjc 0:a23e8a7c9275 936 long lShiftLengthBits,
monpjc 0:a23e8a7c9275 937 short sShiftLengthBytes,
monpjc 0:a23e8a7c9275 938 lenVal* plvTdi,
monpjc 0:a23e8a7c9275 939 lenVal* plvTdoCaptured,
monpjc 0:a23e8a7c9275 940 lenVal* plvTdoExpected,
monpjc 0:a23e8a7c9275 941 lenVal* plvTdoMask,
monpjc 0:a23e8a7c9275 942 unsigned char ucEndState,
monpjc 0:a23e8a7c9275 943 long lRunTestTime,
monpjc 0:a23e8a7c9275 944 unsigned char ucMaxRepeat )
monpjc 0:a23e8a7c9275 945 {
monpjc 0:a23e8a7c9275 946 readVal( plvTdi, sShiftLengthBytes );
monpjc 0:a23e8a7c9275 947 if ( plvTdoExpected )
monpjc 0:a23e8a7c9275 948 {
monpjc 0:a23e8a7c9275 949 readVal( plvTdoExpected, sShiftLengthBytes );
monpjc 0:a23e8a7c9275 950 }
monpjc 0:a23e8a7c9275 951 return( xsvfShift( pucTapState, XTAPSTATE_SHIFTDR, lShiftLengthBits,
monpjc 0:a23e8a7c9275 952 plvTdi, plvTdoCaptured, plvTdoExpected, plvTdoMask,
monpjc 0:a23e8a7c9275 953 ucEndState, lRunTestTime, ucMaxRepeat ) );
monpjc 0:a23e8a7c9275 954 }
monpjc 0:a23e8a7c9275 955
monpjc 0:a23e8a7c9275 956 /*****************************************************************************
monpjc 0:a23e8a7c9275 957 * Function: xsvfDoSDRMasking
monpjc 0:a23e8a7c9275 958 * Description: Update the data value with the next XSDRINC data and address.
monpjc 0:a23e8a7c9275 959 * Example: dataVal=0x01ff, nextData=0xab, addressMask=0x0100,
monpjc 0:a23e8a7c9275 960 * dataMask=0x00ff, should set dataVal to 0x02ab
monpjc 0:a23e8a7c9275 961 * Parameters: plvTdi - The current TDI value.
monpjc 0:a23e8a7c9275 962 * plvNextData - the next data value.
monpjc 0:a23e8a7c9275 963 * plvAddressMask - the address mask.
monpjc 0:a23e8a7c9275 964 * plvDataMask - the data mask.
monpjc 0:a23e8a7c9275 965 * Returns: void.
monpjc 0:a23e8a7c9275 966 *****************************************************************************/
monpjc 0:a23e8a7c9275 967 #ifdef XSVF_SUPPORT_COMPRESSION
monpjc 0:a23e8a7c9275 968 void xsvfDoSDRMasking( lenVal* plvTdi,
monpjc 0:a23e8a7c9275 969 lenVal* plvNextData,
monpjc 0:a23e8a7c9275 970 lenVal* plvAddressMask,
monpjc 0:a23e8a7c9275 971 lenVal* plvDataMask )
monpjc 0:a23e8a7c9275 972 {
monpjc 0:a23e8a7c9275 973 int i;
monpjc 0:a23e8a7c9275 974 unsigned char ucTdi;
monpjc 0:a23e8a7c9275 975 unsigned char ucTdiMask;
monpjc 0:a23e8a7c9275 976 unsigned char ucDataMask;
monpjc 0:a23e8a7c9275 977 unsigned char ucNextData;
monpjc 0:a23e8a7c9275 978 unsigned char ucNextMask;
monpjc 0:a23e8a7c9275 979 short sNextData;
monpjc 0:a23e8a7c9275 980
monpjc 0:a23e8a7c9275 981 /* add the address Mask to dataVal and return as a new dataVal */
monpjc 0:a23e8a7c9275 982 addVal( plvTdi, plvTdi, plvAddressMask );
monpjc 0:a23e8a7c9275 983
monpjc 0:a23e8a7c9275 984 ucNextData = 0;
monpjc 0:a23e8a7c9275 985 ucNextMask = 0;
monpjc 0:a23e8a7c9275 986 sNextData = plvNextData->len;
monpjc 0:a23e8a7c9275 987 for ( i = plvDataMask->len - 1; i >= 0; --i )
monpjc 0:a23e8a7c9275 988 {
monpjc 0:a23e8a7c9275 989 /* Go through data mask in reverse order looking for mask (1) bits */
monpjc 0:a23e8a7c9275 990 ucDataMask = plvDataMask->val[ i ];
monpjc 0:a23e8a7c9275 991 if ( ucDataMask )
monpjc 0:a23e8a7c9275 992 {
monpjc 0:a23e8a7c9275 993 /* Retrieve the corresponding TDI byte value */
monpjc 0:a23e8a7c9275 994 ucTdi = plvTdi->val[ i ];
monpjc 0:a23e8a7c9275 995
monpjc 0:a23e8a7c9275 996 /* For each bit in the data mask byte, look for 1's */
monpjc 0:a23e8a7c9275 997 ucTdiMask = 1;
monpjc 0:a23e8a7c9275 998 while ( ucDataMask )
monpjc 0:a23e8a7c9275 999 {
monpjc 0:a23e8a7c9275 1000 if ( ucDataMask & 1 )
monpjc 0:a23e8a7c9275 1001 {
monpjc 0:a23e8a7c9275 1002 if ( !ucNextMask )
monpjc 0:a23e8a7c9275 1003 {
monpjc 0:a23e8a7c9275 1004 /* Get the next data byte */
monpjc 0:a23e8a7c9275 1005 ucNextData = plvNextData->val[ --sNextData ];
monpjc 0:a23e8a7c9275 1006 ucNextMask = 1;
monpjc 0:a23e8a7c9275 1007 }
monpjc 0:a23e8a7c9275 1008
monpjc 0:a23e8a7c9275 1009 /* Set or clear the data bit according to the next data */
monpjc 0:a23e8a7c9275 1010 if ( ucNextData & ucNextMask )
monpjc 0:a23e8a7c9275 1011 {
monpjc 0:a23e8a7c9275 1012 ucTdi |= ucTdiMask; /* Set bit */
monpjc 0:a23e8a7c9275 1013 }
monpjc 0:a23e8a7c9275 1014 else
monpjc 0:a23e8a7c9275 1015 {
monpjc 0:a23e8a7c9275 1016 ucTdi &= ( ~ucTdiMask ); /* Clear bit */
monpjc 0:a23e8a7c9275 1017 }
monpjc 0:a23e8a7c9275 1018
monpjc 0:a23e8a7c9275 1019 /* Update the next data */
monpjc 0:a23e8a7c9275 1020 ucNextMask <<= 1;
monpjc 0:a23e8a7c9275 1021 }
monpjc 0:a23e8a7c9275 1022 ucTdiMask <<= 1;
monpjc 0:a23e8a7c9275 1023 ucDataMask >>= 1;
monpjc 0:a23e8a7c9275 1024 }
monpjc 0:a23e8a7c9275 1025
monpjc 0:a23e8a7c9275 1026 /* Update the TDI value */
monpjc 0:a23e8a7c9275 1027 plvTdi->val[ i ] = ucTdi;
monpjc 0:a23e8a7c9275 1028 }
monpjc 0:a23e8a7c9275 1029 }
monpjc 0:a23e8a7c9275 1030 }
monpjc 0:a23e8a7c9275 1031 #endif /* XSVF_SUPPORT_COMPRESSION */
monpjc 0:a23e8a7c9275 1032
monpjc 0:a23e8a7c9275 1033 /*============================================================================
monpjc 0:a23e8a7c9275 1034 * XSVF Command Functions (type = TXsvfDoCmdFuncPtr)
monpjc 0:a23e8a7c9275 1035 * These functions update pXsvfInfo->iErrorCode only on an error.
monpjc 0:a23e8a7c9275 1036 * Otherwise, the error code is left alone.
monpjc 0:a23e8a7c9275 1037 * The function returns the error code from the function.
monpjc 0:a23e8a7c9275 1038 ============================================================================*/
monpjc 0:a23e8a7c9275 1039
monpjc 0:a23e8a7c9275 1040 /*****************************************************************************
monpjc 0:a23e8a7c9275 1041 * Function: xsvfDoIllegalCmd
monpjc 0:a23e8a7c9275 1042 * Description: Function place holder for illegal/unsupported commands.
monpjc 0:a23e8a7c9275 1043 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1044 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1045 *****************************************************************************/
monpjc 0:a23e8a7c9275 1046 int xsvfDoIllegalCmd( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1047 {
monpjc 0:a23e8a7c9275 1048 XSVFDBG_PRINTF2( 0, "ERROR: Encountered unsupported command #%d (%s)\n",
monpjc 0:a23e8a7c9275 1049 ((unsigned int)(pXsvfInfo->ucCommand)),
monpjc 0:a23e8a7c9275 1050 ((pXsvfInfo->ucCommand < XLASTCMD)
monpjc 0:a23e8a7c9275 1051 ? (xsvf_pzCommandName[pXsvfInfo->ucCommand])
monpjc 0:a23e8a7c9275 1052 : "Unknown") );
monpjc 0:a23e8a7c9275 1053 pXsvfInfo->iErrorCode = XSVF_ERROR_ILLEGALCMD;
monpjc 0:a23e8a7c9275 1054 return( pXsvfInfo->iErrorCode );
monpjc 0:a23e8a7c9275 1055 }
monpjc 0:a23e8a7c9275 1056
monpjc 0:a23e8a7c9275 1057 /*****************************************************************************
monpjc 0:a23e8a7c9275 1058 * Function: xsvfDoXCOMPLETE
monpjc 0:a23e8a7c9275 1059 * Description: XCOMPLETE (no parameters)
monpjc 0:a23e8a7c9275 1060 * Update complete status for XSVF player.
monpjc 0:a23e8a7c9275 1061 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1062 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1063 *****************************************************************************/
monpjc 0:a23e8a7c9275 1064 int xsvfDoXCOMPLETE( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1065 {
monpjc 0:a23e8a7c9275 1066 pXsvfInfo->ucComplete = 1;
monpjc 0:a23e8a7c9275 1067 return( XSVF_ERROR_NONE );
monpjc 0:a23e8a7c9275 1068 }
monpjc 0:a23e8a7c9275 1069
monpjc 0:a23e8a7c9275 1070 /*****************************************************************************
monpjc 0:a23e8a7c9275 1071 * Function: xsvfDoXTDOMASK
monpjc 0:a23e8a7c9275 1072 * Description: XTDOMASK <lenVal.TdoMask[XSDRSIZE]>
monpjc 0:a23e8a7c9275 1073 * Prespecify the TDO compare mask.
monpjc 0:a23e8a7c9275 1074 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1075 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1076 *****************************************************************************/
monpjc 0:a23e8a7c9275 1077 int xsvfDoXTDOMASK( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1078 {
monpjc 0:a23e8a7c9275 1079 readVal( &(pXsvfInfo->lvTdoMask), pXsvfInfo->sShiftLengthBytes );
monpjc 0:a23e8a7c9275 1080 XSVFDBG_PRINTF( 4, " TDO Mask = ");
monpjc 0:a23e8a7c9275 1081 XSVFDBG_PRINTLENVAL( 4, &(pXsvfInfo->lvTdoMask) );
monpjc 0:a23e8a7c9275 1082 XSVFDBG_PRINTF( 4, "\n");
monpjc 0:a23e8a7c9275 1083 return( XSVF_ERROR_NONE );
monpjc 0:a23e8a7c9275 1084 }
monpjc 0:a23e8a7c9275 1085
monpjc 0:a23e8a7c9275 1086 /*****************************************************************************
monpjc 0:a23e8a7c9275 1087 * Function: xsvfDoXSIR
monpjc 0:a23e8a7c9275 1088 * Description: XSIR <(byte)shiftlen> <lenVal.TDI[shiftlen]>
monpjc 0:a23e8a7c9275 1089 * Get the instruction and shift the instruction into the TAP.
monpjc 0:a23e8a7c9275 1090 * If prespecified XRUNTEST!=0, goto RUNTEST and wait after
monpjc 0:a23e8a7c9275 1091 * the shift for XRUNTEST usec.
monpjc 0:a23e8a7c9275 1092 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1093 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1094 *****************************************************************************/
monpjc 0:a23e8a7c9275 1095 int xsvfDoXSIR( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1096 {
monpjc 0:a23e8a7c9275 1097 unsigned char ucShiftIrBits;
monpjc 0:a23e8a7c9275 1098 short sShiftIrBytes;
monpjc 0:a23e8a7c9275 1099 int iErrorCode;
monpjc 0:a23e8a7c9275 1100
monpjc 0:a23e8a7c9275 1101 /* Get the shift length and store */
monpjc 0:a23e8a7c9275 1102 readByte( &ucShiftIrBits );
monpjc 0:a23e8a7c9275 1103 sShiftIrBytes = xsvfGetAsNumBytes( ucShiftIrBits );
monpjc 0:a23e8a7c9275 1104 XSVFDBG_PRINTF1( 3, " XSIR length = %d\n",
monpjc 0:a23e8a7c9275 1105 ((unsigned int)ucShiftIrBits) );
monpjc 0:a23e8a7c9275 1106
monpjc 0:a23e8a7c9275 1107 if ( sShiftIrBytes > MAX_LEN )
monpjc 0:a23e8a7c9275 1108 {
monpjc 0:a23e8a7c9275 1109 iErrorCode = XSVF_ERROR_DATAOVERFLOW;
monpjc 0:a23e8a7c9275 1110 }
monpjc 0:a23e8a7c9275 1111 else
monpjc 0:a23e8a7c9275 1112 {
monpjc 0:a23e8a7c9275 1113 /* Get and store instruction to shift in */
monpjc 0:a23e8a7c9275 1114 readVal( &(pXsvfInfo->lvTdi), xsvfGetAsNumBytes( ucShiftIrBits ) );
monpjc 0:a23e8a7c9275 1115
monpjc 0:a23e8a7c9275 1116 /* Shift the data */
monpjc 0:a23e8a7c9275 1117 iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState), XTAPSTATE_SHIFTIR,
monpjc 0:a23e8a7c9275 1118 ucShiftIrBits, &(pXsvfInfo->lvTdi),
monpjc 0:a23e8a7c9275 1119 /*plvTdoCaptured*/0, /*plvTdoExpected*/0,
monpjc 0:a23e8a7c9275 1120 /*plvTdoMask*/0, pXsvfInfo->ucEndIR,
monpjc 0:a23e8a7c9275 1121 pXsvfInfo->lRunTestTime, /*ucMaxRepeat*/0 );
monpjc 0:a23e8a7c9275 1122 }
monpjc 0:a23e8a7c9275 1123
monpjc 0:a23e8a7c9275 1124 if ( iErrorCode != XSVF_ERROR_NONE )
monpjc 0:a23e8a7c9275 1125 {
monpjc 0:a23e8a7c9275 1126 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1127 }
monpjc 0:a23e8a7c9275 1128 return( iErrorCode );
monpjc 0:a23e8a7c9275 1129 }
monpjc 0:a23e8a7c9275 1130
monpjc 0:a23e8a7c9275 1131 /*****************************************************************************
monpjc 0:a23e8a7c9275 1132 * Function: xsvfDoXSIR2
monpjc 0:a23e8a7c9275 1133 * Description: XSIR <(2-byte)shiftlen> <lenVal.TDI[shiftlen]>
monpjc 0:a23e8a7c9275 1134 * Get the instruction and shift the instruction into the TAP.
monpjc 0:a23e8a7c9275 1135 * If prespecified XRUNTEST!=0, goto RUNTEST and wait after
monpjc 0:a23e8a7c9275 1136 * the shift for XRUNTEST usec.
monpjc 0:a23e8a7c9275 1137 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1138 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1139 *****************************************************************************/
monpjc 0:a23e8a7c9275 1140 int xsvfDoXSIR2( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1141 {
monpjc 0:a23e8a7c9275 1142 long lShiftIrBits;
monpjc 0:a23e8a7c9275 1143 short sShiftIrBytes;
monpjc 0:a23e8a7c9275 1144 int iErrorCode;
monpjc 0:a23e8a7c9275 1145
monpjc 0:a23e8a7c9275 1146 /* Get the shift length and store */
monpjc 0:a23e8a7c9275 1147 readVal( &(pXsvfInfo->lvTdi), 2 );
monpjc 0:a23e8a7c9275 1148 lShiftIrBits = value( &(pXsvfInfo->lvTdi) );
monpjc 0:a23e8a7c9275 1149 sShiftIrBytes = xsvfGetAsNumBytes( lShiftIrBits );
monpjc 0:a23e8a7c9275 1150 XSVFDBG_PRINTF1( 3, " XSIR2 length = %d\n", lShiftIrBits);
monpjc 0:a23e8a7c9275 1151
monpjc 0:a23e8a7c9275 1152 if ( sShiftIrBytes > MAX_LEN )
monpjc 0:a23e8a7c9275 1153 {
monpjc 0:a23e8a7c9275 1154 iErrorCode = XSVF_ERROR_DATAOVERFLOW;
monpjc 0:a23e8a7c9275 1155 }
monpjc 0:a23e8a7c9275 1156 else
monpjc 0:a23e8a7c9275 1157 {
monpjc 0:a23e8a7c9275 1158 /* Get and store instruction to shift in */
monpjc 0:a23e8a7c9275 1159 readVal( &(pXsvfInfo->lvTdi), xsvfGetAsNumBytes( lShiftIrBits ) );
monpjc 0:a23e8a7c9275 1160
monpjc 0:a23e8a7c9275 1161 /* Shift the data */
monpjc 0:a23e8a7c9275 1162 iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState), XTAPSTATE_SHIFTIR,
monpjc 0:a23e8a7c9275 1163 lShiftIrBits, &(pXsvfInfo->lvTdi),
monpjc 0:a23e8a7c9275 1164 /*plvTdoCaptured*/0, /*plvTdoExpected*/0,
monpjc 0:a23e8a7c9275 1165 /*plvTdoMask*/0, pXsvfInfo->ucEndIR,
monpjc 0:a23e8a7c9275 1166 pXsvfInfo->lRunTestTime, /*ucMaxRepeat*/0 );
monpjc 0:a23e8a7c9275 1167 }
monpjc 0:a23e8a7c9275 1168
monpjc 0:a23e8a7c9275 1169 if ( iErrorCode != XSVF_ERROR_NONE )
monpjc 0:a23e8a7c9275 1170 {
monpjc 0:a23e8a7c9275 1171 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1172 }
monpjc 0:a23e8a7c9275 1173 return( iErrorCode );
monpjc 0:a23e8a7c9275 1174 }
monpjc 0:a23e8a7c9275 1175
monpjc 0:a23e8a7c9275 1176 /*****************************************************************************
monpjc 0:a23e8a7c9275 1177 * Function: xsvfDoXSDR
monpjc 0:a23e8a7c9275 1178 * Description: XSDR <lenVal.TDI[XSDRSIZE]>
monpjc 0:a23e8a7c9275 1179 * Shift the given TDI data into the JTAG scan chain.
monpjc 0:a23e8a7c9275 1180 * Compare the captured TDO with the expected TDO from the
monpjc 0:a23e8a7c9275 1181 * previous XSDRTDO command using the previously specified
monpjc 0:a23e8a7c9275 1182 * XTDOMASK.
monpjc 0:a23e8a7c9275 1183 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1184 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1185 *****************************************************************************/
monpjc 0:a23e8a7c9275 1186 int xsvfDoXSDR( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1187 {
monpjc 0:a23e8a7c9275 1188 int iErrorCode;
monpjc 0:a23e8a7c9275 1189 readVal( &(pXsvfInfo->lvTdi), pXsvfInfo->sShiftLengthBytes );
monpjc 0:a23e8a7c9275 1190 /* use TDOExpected from last XSDRTDO instruction */
monpjc 0:a23e8a7c9275 1191 iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState), XTAPSTATE_SHIFTDR,
monpjc 0:a23e8a7c9275 1192 pXsvfInfo->lShiftLengthBits, &(pXsvfInfo->lvTdi),
monpjc 0:a23e8a7c9275 1193 &(pXsvfInfo->lvTdoCaptured),
monpjc 0:a23e8a7c9275 1194 &(pXsvfInfo->lvTdoExpected),
monpjc 0:a23e8a7c9275 1195 &(pXsvfInfo->lvTdoMask), pXsvfInfo->ucEndDR,
monpjc 0:a23e8a7c9275 1196 pXsvfInfo->lRunTestTime, pXsvfInfo->ucMaxRepeat );
monpjc 0:a23e8a7c9275 1197 if ( iErrorCode != XSVF_ERROR_NONE )
monpjc 0:a23e8a7c9275 1198 {
monpjc 0:a23e8a7c9275 1199 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1200 }
monpjc 0:a23e8a7c9275 1201 return( iErrorCode );
monpjc 0:a23e8a7c9275 1202 }
monpjc 0:a23e8a7c9275 1203
monpjc 0:a23e8a7c9275 1204 /*****************************************************************************
monpjc 0:a23e8a7c9275 1205 * Function: xsvfDoXRUNTEST
monpjc 0:a23e8a7c9275 1206 * Description: XRUNTEST <uint32>
monpjc 0:a23e8a7c9275 1207 * Prespecify the XRUNTEST wait time for shift operations.
monpjc 0:a23e8a7c9275 1208 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1209 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1210 *****************************************************************************/
monpjc 0:a23e8a7c9275 1211 int xsvfDoXRUNTEST( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1212 {
monpjc 0:a23e8a7c9275 1213 readVal( &(pXsvfInfo->lvTdi), 4 );
monpjc 0:a23e8a7c9275 1214 pXsvfInfo->lRunTestTime = value( &(pXsvfInfo->lvTdi) );
monpjc 0:a23e8a7c9275 1215 XSVFDBG_PRINTF1( 3, " XRUNTEST = %ld\n", pXsvfInfo->lRunTestTime );
monpjc 0:a23e8a7c9275 1216 return( XSVF_ERROR_NONE );
monpjc 0:a23e8a7c9275 1217 }
monpjc 0:a23e8a7c9275 1218
monpjc 0:a23e8a7c9275 1219 /*****************************************************************************
monpjc 0:a23e8a7c9275 1220 * Function: xsvfDoXREPEAT
monpjc 0:a23e8a7c9275 1221 * Description: XREPEAT <byte>
monpjc 0:a23e8a7c9275 1222 * Prespecify the maximum number of XC9500/XL retries.
monpjc 0:a23e8a7c9275 1223 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1224 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1225 *****************************************************************************/
monpjc 0:a23e8a7c9275 1226 int xsvfDoXREPEAT( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1227 {
monpjc 0:a23e8a7c9275 1228 readByte( &(pXsvfInfo->ucMaxRepeat) );
monpjc 0:a23e8a7c9275 1229 XSVFDBG_PRINTF1( 3, " XREPEAT = %d\n",
monpjc 0:a23e8a7c9275 1230 ((unsigned int)(pXsvfInfo->ucMaxRepeat)) );
monpjc 0:a23e8a7c9275 1231 return( XSVF_ERROR_NONE );
monpjc 0:a23e8a7c9275 1232 }
monpjc 0:a23e8a7c9275 1233
monpjc 0:a23e8a7c9275 1234 /*****************************************************************************
monpjc 0:a23e8a7c9275 1235 * Function: xsvfDoXSDRSIZE
monpjc 0:a23e8a7c9275 1236 * Description: XSDRSIZE <uint32>
monpjc 0:a23e8a7c9275 1237 * Prespecify the XRUNTEST wait time for shift operations.
monpjc 0:a23e8a7c9275 1238 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1239 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1240 *****************************************************************************/
monpjc 0:a23e8a7c9275 1241 int xsvfDoXSDRSIZE( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1242 {
monpjc 0:a23e8a7c9275 1243 int iErrorCode;
monpjc 0:a23e8a7c9275 1244 iErrorCode = XSVF_ERROR_NONE;
monpjc 0:a23e8a7c9275 1245 readVal( &(pXsvfInfo->lvTdi), 4 );
monpjc 0:a23e8a7c9275 1246 pXsvfInfo->lShiftLengthBits = value( &(pXsvfInfo->lvTdi) );
monpjc 0:a23e8a7c9275 1247 pXsvfInfo->sShiftLengthBytes= xsvfGetAsNumBytes( pXsvfInfo->lShiftLengthBits );
monpjc 0:a23e8a7c9275 1248 XSVFDBG_PRINTF1( 3, " XSDRSIZE = %ld\n", pXsvfInfo->lShiftLengthBits );
monpjc 0:a23e8a7c9275 1249 if ( pXsvfInfo->sShiftLengthBytes > MAX_LEN )
monpjc 0:a23e8a7c9275 1250 {
monpjc 0:a23e8a7c9275 1251 iErrorCode = XSVF_ERROR_DATAOVERFLOW;
monpjc 0:a23e8a7c9275 1252 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1253 }
monpjc 0:a23e8a7c9275 1254 return( iErrorCode );
monpjc 0:a23e8a7c9275 1255 }
monpjc 0:a23e8a7c9275 1256
monpjc 0:a23e8a7c9275 1257 /*****************************************************************************
monpjc 0:a23e8a7c9275 1258 * Function: xsvfDoXSDRTDO
monpjc 0:a23e8a7c9275 1259 * Description: XSDRTDO <lenVal.TDI[XSDRSIZE]> <lenVal.TDO[XSDRSIZE]>
monpjc 0:a23e8a7c9275 1260 * Get the TDI and expected TDO values. Then, shift.
monpjc 0:a23e8a7c9275 1261 * Compare the expected TDO with the captured TDO using the
monpjc 0:a23e8a7c9275 1262 * prespecified XTDOMASK.
monpjc 0:a23e8a7c9275 1263 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1264 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1265 *****************************************************************************/
monpjc 0:a23e8a7c9275 1266 int xsvfDoXSDRTDO( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1267 {
monpjc 0:a23e8a7c9275 1268 int iErrorCode;
monpjc 0:a23e8a7c9275 1269 iErrorCode = xsvfBasicXSDRTDO( &(pXsvfInfo->ucTapState),
monpjc 0:a23e8a7c9275 1270 pXsvfInfo->lShiftLengthBits,
monpjc 0:a23e8a7c9275 1271 pXsvfInfo->sShiftLengthBytes,
monpjc 0:a23e8a7c9275 1272 &(pXsvfInfo->lvTdi),
monpjc 0:a23e8a7c9275 1273 &(pXsvfInfo->lvTdoCaptured),
monpjc 0:a23e8a7c9275 1274 &(pXsvfInfo->lvTdoExpected),
monpjc 0:a23e8a7c9275 1275 &(pXsvfInfo->lvTdoMask),
monpjc 0:a23e8a7c9275 1276 pXsvfInfo->ucEndDR,
monpjc 0:a23e8a7c9275 1277 pXsvfInfo->lRunTestTime,
monpjc 0:a23e8a7c9275 1278 pXsvfInfo->ucMaxRepeat );
monpjc 0:a23e8a7c9275 1279 if ( iErrorCode != XSVF_ERROR_NONE )
monpjc 0:a23e8a7c9275 1280 {
monpjc 0:a23e8a7c9275 1281 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1282 }
monpjc 0:a23e8a7c9275 1283 return( iErrorCode );
monpjc 0:a23e8a7c9275 1284 }
monpjc 0:a23e8a7c9275 1285
monpjc 0:a23e8a7c9275 1286 /*****************************************************************************
monpjc 0:a23e8a7c9275 1287 * Function: xsvfDoXSETSDRMASKS
monpjc 0:a23e8a7c9275 1288 * Description: XSETSDRMASKS <lenVal.AddressMask[XSDRSIZE]>
monpjc 0:a23e8a7c9275 1289 * <lenVal.DataMask[XSDRSIZE]>
monpjc 0:a23e8a7c9275 1290 * Get the prespecified address and data mask for the XSDRINC
monpjc 0:a23e8a7c9275 1291 * command.
monpjc 0:a23e8a7c9275 1292 * Used for xc9500/xl compressed XSVF data.
monpjc 0:a23e8a7c9275 1293 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1294 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1295 *****************************************************************************/
monpjc 0:a23e8a7c9275 1296 #ifdef XSVF_SUPPORT_COMPRESSION
monpjc 0:a23e8a7c9275 1297 int xsvfDoXSETSDRMASKS( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1298 {
monpjc 0:a23e8a7c9275 1299 /* read the addressMask */
monpjc 0:a23e8a7c9275 1300 readVal( &(pXsvfInfo->lvAddressMask), pXsvfInfo->sShiftLengthBytes );
monpjc 0:a23e8a7c9275 1301 /* read the dataMask */
monpjc 0:a23e8a7c9275 1302 readVal( &(pXsvfInfo->lvDataMask), pXsvfInfo->sShiftLengthBytes );
monpjc 0:a23e8a7c9275 1303
monpjc 0:a23e8a7c9275 1304 XSVFDBG_PRINTF( 4, " Address Mask = " );
monpjc 0:a23e8a7c9275 1305 XSVFDBG_PRINTLENVAL( 4, &(pXsvfInfo->lvAddressMask) );
monpjc 0:a23e8a7c9275 1306 XSVFDBG_PRINTF( 4, "\n" );
monpjc 0:a23e8a7c9275 1307 XSVFDBG_PRINTF( 4, " Data Mask = " );
monpjc 0:a23e8a7c9275 1308 XSVFDBG_PRINTLENVAL( 4, &(pXsvfInfo->lvDataMask) );
monpjc 0:a23e8a7c9275 1309 XSVFDBG_PRINTF( 4, "\n" );
monpjc 0:a23e8a7c9275 1310
monpjc 0:a23e8a7c9275 1311 return( XSVF_ERROR_NONE );
monpjc 0:a23e8a7c9275 1312 }
monpjc 0:a23e8a7c9275 1313 #endif /* XSVF_SUPPORT_COMPRESSION */
monpjc 0:a23e8a7c9275 1314
monpjc 0:a23e8a7c9275 1315 /*****************************************************************************
monpjc 0:a23e8a7c9275 1316 * Function: xsvfDoXSDRINC
monpjc 0:a23e8a7c9275 1317 * Description: XSDRINC <lenVal.firstTDI[XSDRSIZE]> <byte(numTimes)>
monpjc 0:a23e8a7c9275 1318 * <lenVal.data[XSETSDRMASKS.dataMask.len]> ...
monpjc 0:a23e8a7c9275 1319 * Get the XSDRINC parameters and execute the XSDRINC command.
monpjc 0:a23e8a7c9275 1320 * XSDRINC starts by loading the first TDI shift value.
monpjc 0:a23e8a7c9275 1321 * Then, for numTimes, XSDRINC gets the next piece of data,
monpjc 0:a23e8a7c9275 1322 * replaces the bits from the starting TDI as defined by the
monpjc 0:a23e8a7c9275 1323 * XSETSDRMASKS.dataMask, adds the address mask from
monpjc 0:a23e8a7c9275 1324 * XSETSDRMASKS.addressMask, shifts the new TDI value,
monpjc 0:a23e8a7c9275 1325 * and compares the TDO to the expected TDO from the previous
monpjc 0:a23e8a7c9275 1326 * XSDRTDO command using the XTDOMASK.
monpjc 0:a23e8a7c9275 1327 * Used for xc9500/xl compressed XSVF data.
monpjc 0:a23e8a7c9275 1328 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1329 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1330 *****************************************************************************/
monpjc 0:a23e8a7c9275 1331 #ifdef XSVF_SUPPORT_COMPRESSION
monpjc 0:a23e8a7c9275 1332 int xsvfDoXSDRINC( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1333 {
monpjc 0:a23e8a7c9275 1334 int iErrorCode;
monpjc 0:a23e8a7c9275 1335 int iDataMaskLen;
monpjc 0:a23e8a7c9275 1336 unsigned char ucDataMask;
monpjc 0:a23e8a7c9275 1337 unsigned char ucNumTimes;
monpjc 0:a23e8a7c9275 1338 unsigned char i;
monpjc 0:a23e8a7c9275 1339
monpjc 0:a23e8a7c9275 1340 readVal( &(pXsvfInfo->lvTdi), pXsvfInfo->sShiftLengthBytes );
monpjc 0:a23e8a7c9275 1341 iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState), XTAPSTATE_SHIFTDR,
monpjc 0:a23e8a7c9275 1342 pXsvfInfo->lShiftLengthBits,
monpjc 0:a23e8a7c9275 1343 &(pXsvfInfo->lvTdi), &(pXsvfInfo->lvTdoCaptured),
monpjc 0:a23e8a7c9275 1344 &(pXsvfInfo->lvTdoExpected),
monpjc 0:a23e8a7c9275 1345 &(pXsvfInfo->lvTdoMask), pXsvfInfo->ucEndDR,
monpjc 0:a23e8a7c9275 1346 pXsvfInfo->lRunTestTime, pXsvfInfo->ucMaxRepeat );
monpjc 0:a23e8a7c9275 1347 if ( !iErrorCode )
monpjc 0:a23e8a7c9275 1348 {
monpjc 0:a23e8a7c9275 1349 /* Calculate number of data mask bits */
monpjc 0:a23e8a7c9275 1350 iDataMaskLen = 0;
monpjc 0:a23e8a7c9275 1351 for ( i = 0; i < pXsvfInfo->lvDataMask.len; ++i )
monpjc 0:a23e8a7c9275 1352 {
monpjc 0:a23e8a7c9275 1353 ucDataMask = pXsvfInfo->lvDataMask.val[ i ];
monpjc 0:a23e8a7c9275 1354 while ( ucDataMask )
monpjc 0:a23e8a7c9275 1355 {
monpjc 0:a23e8a7c9275 1356 iDataMaskLen += ( ucDataMask & 1 );
monpjc 0:a23e8a7c9275 1357 ucDataMask >>= 1;
monpjc 0:a23e8a7c9275 1358 }
monpjc 0:a23e8a7c9275 1359 }
monpjc 0:a23e8a7c9275 1360
monpjc 0:a23e8a7c9275 1361 /* Get the number of data pieces, i.e. number of times to shift */
monpjc 0:a23e8a7c9275 1362 readByte( &ucNumTimes );
monpjc 0:a23e8a7c9275 1363
monpjc 0:a23e8a7c9275 1364 /* For numTimes, get data, fix TDI, and shift */
monpjc 0:a23e8a7c9275 1365 for ( i = 0; !iErrorCode && ( i < ucNumTimes ); ++i )
monpjc 0:a23e8a7c9275 1366 {
monpjc 0:a23e8a7c9275 1367 readVal( &(pXsvfInfo->lvNextData),
monpjc 0:a23e8a7c9275 1368 xsvfGetAsNumBytes( iDataMaskLen ) );
monpjc 0:a23e8a7c9275 1369 xsvfDoSDRMasking( &(pXsvfInfo->lvTdi),
monpjc 0:a23e8a7c9275 1370 &(pXsvfInfo->lvNextData),
monpjc 0:a23e8a7c9275 1371 &(pXsvfInfo->lvAddressMask),
monpjc 0:a23e8a7c9275 1372 &(pXsvfInfo->lvDataMask) );
monpjc 0:a23e8a7c9275 1373 iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState),
monpjc 0:a23e8a7c9275 1374 XTAPSTATE_SHIFTDR,
monpjc 0:a23e8a7c9275 1375 pXsvfInfo->lShiftLengthBits,
monpjc 0:a23e8a7c9275 1376 &(pXsvfInfo->lvTdi),
monpjc 0:a23e8a7c9275 1377 &(pXsvfInfo->lvTdoCaptured),
monpjc 0:a23e8a7c9275 1378 &(pXsvfInfo->lvTdoExpected),
monpjc 0:a23e8a7c9275 1379 &(pXsvfInfo->lvTdoMask),
monpjc 0:a23e8a7c9275 1380 pXsvfInfo->ucEndDR,
monpjc 0:a23e8a7c9275 1381 pXsvfInfo->lRunTestTime,
monpjc 0:a23e8a7c9275 1382 pXsvfInfo->ucMaxRepeat );
monpjc 0:a23e8a7c9275 1383 }
monpjc 0:a23e8a7c9275 1384 }
monpjc 0:a23e8a7c9275 1385 if ( iErrorCode != XSVF_ERROR_NONE )
monpjc 0:a23e8a7c9275 1386 {
monpjc 0:a23e8a7c9275 1387 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1388 }
monpjc 0:a23e8a7c9275 1389 return( iErrorCode );
monpjc 0:a23e8a7c9275 1390 }
monpjc 0:a23e8a7c9275 1391 #endif /* XSVF_SUPPORT_COMPRESSION */
monpjc 0:a23e8a7c9275 1392
monpjc 0:a23e8a7c9275 1393 /*****************************************************************************
monpjc 0:a23e8a7c9275 1394 * Function: xsvfDoXSDRBCE
monpjc 0:a23e8a7c9275 1395 * Description: XSDRB/XSDRC/XSDRE <lenVal.TDI[XSDRSIZE]>
monpjc 0:a23e8a7c9275 1396 * If not already in SHIFTDR, goto SHIFTDR.
monpjc 0:a23e8a7c9275 1397 * Shift the given TDI data into the JTAG scan chain.
monpjc 0:a23e8a7c9275 1398 * Ignore TDO.
monpjc 0:a23e8a7c9275 1399 * If cmd==XSDRE, then goto ENDDR. Otherwise, stay in ShiftDR.
monpjc 0:a23e8a7c9275 1400 * XSDRB, XSDRC, and XSDRE are the same implementation.
monpjc 0:a23e8a7c9275 1401 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1402 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1403 *****************************************************************************/
monpjc 0:a23e8a7c9275 1404 int xsvfDoXSDRBCE( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1405 {
monpjc 0:a23e8a7c9275 1406 unsigned char ucEndDR;
monpjc 0:a23e8a7c9275 1407 int iErrorCode;
monpjc 0:a23e8a7c9275 1408 ucEndDR = (unsigned char)(( pXsvfInfo->ucCommand == XSDRE ) ?
monpjc 0:a23e8a7c9275 1409 pXsvfInfo->ucEndDR : XTAPSTATE_SHIFTDR);
monpjc 0:a23e8a7c9275 1410 iErrorCode = xsvfBasicXSDRTDO( &(pXsvfInfo->ucTapState),
monpjc 0:a23e8a7c9275 1411 pXsvfInfo->lShiftLengthBits,
monpjc 0:a23e8a7c9275 1412 pXsvfInfo->sShiftLengthBytes,
monpjc 0:a23e8a7c9275 1413 &(pXsvfInfo->lvTdi),
monpjc 0:a23e8a7c9275 1414 /*plvTdoCaptured*/0, /*plvTdoExpected*/0,
monpjc 0:a23e8a7c9275 1415 /*plvTdoMask*/0, ucEndDR,
monpjc 0:a23e8a7c9275 1416 /*lRunTestTime*/0, /*ucMaxRepeat*/0 );
monpjc 0:a23e8a7c9275 1417 if ( iErrorCode != XSVF_ERROR_NONE )
monpjc 0:a23e8a7c9275 1418 {
monpjc 0:a23e8a7c9275 1419 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1420 }
monpjc 0:a23e8a7c9275 1421 return( iErrorCode );
monpjc 0:a23e8a7c9275 1422 }
monpjc 0:a23e8a7c9275 1423
monpjc 0:a23e8a7c9275 1424 /*****************************************************************************
monpjc 0:a23e8a7c9275 1425 * Function: xsvfDoXSDRTDOBCE
monpjc 0:a23e8a7c9275 1426 * Description: XSDRB/XSDRC/XSDRE <lenVal.TDI[XSDRSIZE]> <lenVal.TDO[XSDRSIZE]>
monpjc 0:a23e8a7c9275 1427 * If not already in SHIFTDR, goto SHIFTDR.
monpjc 0:a23e8a7c9275 1428 * Shift the given TDI data into the JTAG scan chain.
monpjc 0:a23e8a7c9275 1429 * Compare TDO, but do NOT use XTDOMASK.
monpjc 0:a23e8a7c9275 1430 * If cmd==XSDRTDOE, then goto ENDDR. Otherwise, stay in ShiftDR.
monpjc 0:a23e8a7c9275 1431 * XSDRTDOB, XSDRTDOC, and XSDRTDOE are the same implementation.
monpjc 0:a23e8a7c9275 1432 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1433 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1434 *****************************************************************************/
monpjc 0:a23e8a7c9275 1435 int xsvfDoXSDRTDOBCE( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1436 {
monpjc 0:a23e8a7c9275 1437 unsigned char ucEndDR;
monpjc 0:a23e8a7c9275 1438 int iErrorCode;
monpjc 0:a23e8a7c9275 1439 ucEndDR = (unsigned char)(( pXsvfInfo->ucCommand == XSDRTDOE ) ?
monpjc 0:a23e8a7c9275 1440 pXsvfInfo->ucEndDR : XTAPSTATE_SHIFTDR);
monpjc 0:a23e8a7c9275 1441 iErrorCode = xsvfBasicXSDRTDO( &(pXsvfInfo->ucTapState),
monpjc 0:a23e8a7c9275 1442 pXsvfInfo->lShiftLengthBits,
monpjc 0:a23e8a7c9275 1443 pXsvfInfo->sShiftLengthBytes,
monpjc 0:a23e8a7c9275 1444 &(pXsvfInfo->lvTdi),
monpjc 0:a23e8a7c9275 1445 &(pXsvfInfo->lvTdoCaptured),
monpjc 0:a23e8a7c9275 1446 &(pXsvfInfo->lvTdoExpected),
monpjc 0:a23e8a7c9275 1447 /*plvTdoMask*/0, ucEndDR,
monpjc 0:a23e8a7c9275 1448 /*lRunTestTime*/0, /*ucMaxRepeat*/0 );
monpjc 0:a23e8a7c9275 1449 if ( iErrorCode != XSVF_ERROR_NONE )
monpjc 0:a23e8a7c9275 1450 {
monpjc 0:a23e8a7c9275 1451 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1452 }
monpjc 0:a23e8a7c9275 1453 return( iErrorCode );
monpjc 0:a23e8a7c9275 1454 }
monpjc 0:a23e8a7c9275 1455
monpjc 0:a23e8a7c9275 1456 /*****************************************************************************
monpjc 0:a23e8a7c9275 1457 * Function: xsvfDoXSTATE
monpjc 0:a23e8a7c9275 1458 * Description: XSTATE <byte>
monpjc 0:a23e8a7c9275 1459 * <byte> == XTAPSTATE;
monpjc 0:a23e8a7c9275 1460 * Get the state parameter and transition the TAP to that state.
monpjc 0:a23e8a7c9275 1461 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1462 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1463 *****************************************************************************/
monpjc 0:a23e8a7c9275 1464 int xsvfDoXSTATE( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1465 {
monpjc 0:a23e8a7c9275 1466 unsigned char ucNextState;
monpjc 0:a23e8a7c9275 1467 int iErrorCode;
monpjc 0:a23e8a7c9275 1468 readByte( &ucNextState );
monpjc 0:a23e8a7c9275 1469 iErrorCode = xsvfGotoTapState( &(pXsvfInfo->ucTapState), ucNextState );
monpjc 0:a23e8a7c9275 1470 if ( iErrorCode != XSVF_ERROR_NONE )
monpjc 0:a23e8a7c9275 1471 {
monpjc 0:a23e8a7c9275 1472 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1473 }
monpjc 0:a23e8a7c9275 1474 return( iErrorCode );
monpjc 0:a23e8a7c9275 1475 }
monpjc 0:a23e8a7c9275 1476
monpjc 0:a23e8a7c9275 1477 /*****************************************************************************
monpjc 0:a23e8a7c9275 1478 * Function: xsvfDoXENDXR
monpjc 0:a23e8a7c9275 1479 * Description: XENDIR/XENDDR <byte>
monpjc 0:a23e8a7c9275 1480 * <byte>: 0 = RUNTEST; 1 = PAUSE.
monpjc 0:a23e8a7c9275 1481 * Get the prespecified XENDIR or XENDDR.
monpjc 0:a23e8a7c9275 1482 * Both XENDIR and XENDDR use the same implementation.
monpjc 0:a23e8a7c9275 1483 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1484 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1485 *****************************************************************************/
monpjc 0:a23e8a7c9275 1486 int xsvfDoXENDXR( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1487 {
monpjc 0:a23e8a7c9275 1488 int iErrorCode;
monpjc 0:a23e8a7c9275 1489 unsigned char ucEndState;
monpjc 0:a23e8a7c9275 1490
monpjc 0:a23e8a7c9275 1491 iErrorCode = XSVF_ERROR_NONE;
monpjc 0:a23e8a7c9275 1492 readByte( &ucEndState );
monpjc 0:a23e8a7c9275 1493 if ( ( ucEndState != XENDXR_RUNTEST ) && ( ucEndState != XENDXR_PAUSE ) )
monpjc 0:a23e8a7c9275 1494 {
monpjc 0:a23e8a7c9275 1495 iErrorCode = XSVF_ERROR_ILLEGALSTATE;
monpjc 0:a23e8a7c9275 1496 }
monpjc 0:a23e8a7c9275 1497 else
monpjc 0:a23e8a7c9275 1498 {
monpjc 0:a23e8a7c9275 1499
monpjc 0:a23e8a7c9275 1500 if ( pXsvfInfo->ucCommand == XENDIR )
monpjc 0:a23e8a7c9275 1501 {
monpjc 0:a23e8a7c9275 1502 if ( ucEndState == XENDXR_RUNTEST )
monpjc 0:a23e8a7c9275 1503 {
monpjc 0:a23e8a7c9275 1504 pXsvfInfo->ucEndIR = XTAPSTATE_RUNTEST;
monpjc 0:a23e8a7c9275 1505 }
monpjc 0:a23e8a7c9275 1506 else
monpjc 0:a23e8a7c9275 1507 {
monpjc 0:a23e8a7c9275 1508 pXsvfInfo->ucEndIR = XTAPSTATE_PAUSEIR;
monpjc 0:a23e8a7c9275 1509 }
monpjc 0:a23e8a7c9275 1510 XSVFDBG_PRINTF1( 3, " ENDIR State = %s\n",
monpjc 0:a23e8a7c9275 1511 xsvf_pzTapState[ pXsvfInfo->ucEndIR ] );
monpjc 0:a23e8a7c9275 1512 }
monpjc 0:a23e8a7c9275 1513 else /* XENDDR */
monpjc 0:a23e8a7c9275 1514 {
monpjc 0:a23e8a7c9275 1515 if ( ucEndState == XENDXR_RUNTEST )
monpjc 0:a23e8a7c9275 1516 {
monpjc 0:a23e8a7c9275 1517 pXsvfInfo->ucEndDR = XTAPSTATE_RUNTEST;
monpjc 0:a23e8a7c9275 1518 }
monpjc 0:a23e8a7c9275 1519 else
monpjc 0:a23e8a7c9275 1520 {
monpjc 0:a23e8a7c9275 1521 pXsvfInfo->ucEndDR = XTAPSTATE_PAUSEDR;
monpjc 0:a23e8a7c9275 1522 }
monpjc 0:a23e8a7c9275 1523 XSVFDBG_PRINTF1( 3, " ENDDR State = %s\n",
monpjc 0:a23e8a7c9275 1524 xsvf_pzTapState[ pXsvfInfo->ucEndDR ] );
monpjc 0:a23e8a7c9275 1525 }
monpjc 0:a23e8a7c9275 1526 }
monpjc 0:a23e8a7c9275 1527
monpjc 0:a23e8a7c9275 1528 if ( iErrorCode != XSVF_ERROR_NONE )
monpjc 0:a23e8a7c9275 1529 {
monpjc 0:a23e8a7c9275 1530 pXsvfInfo->iErrorCode = iErrorCode;
monpjc 0:a23e8a7c9275 1531 }
monpjc 0:a23e8a7c9275 1532 return( iErrorCode );
monpjc 0:a23e8a7c9275 1533 }
monpjc 0:a23e8a7c9275 1534
monpjc 0:a23e8a7c9275 1535 /*****************************************************************************
monpjc 0:a23e8a7c9275 1536 * Function: xsvfDoXCOMMENT
monpjc 0:a23e8a7c9275 1537 * Description: XCOMMENT <text string ending in \0>
monpjc 0:a23e8a7c9275 1538 * <text string ending in \0> == text comment;
monpjc 0:a23e8a7c9275 1539 * Arbitrary comment embedded in the XSVF.
monpjc 0:a23e8a7c9275 1540 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1541 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1542 *****************************************************************************/
monpjc 0:a23e8a7c9275 1543 int xsvfDoXCOMMENT( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1544 {
monpjc 0:a23e8a7c9275 1545 /* Use the comment for debugging */
monpjc 0:a23e8a7c9275 1546 /* Otherwise, read through the comment to the end '\0' and ignore */
monpjc 0:a23e8a7c9275 1547 //unsigned char ucText;
monpjc 0:a23e8a7c9275 1548 /*
monpjc 0:a23e8a7c9275 1549 if ( xsvf_iDebugLevel > 0 )
monpjc 0:a23e8a7c9275 1550 {
monpjc 0:a23e8a7c9275 1551 putchar( ' ' );
monpjc 0:a23e8a7c9275 1552 }
monpjc 0:a23e8a7c9275 1553
monpjc 0:a23e8a7c9275 1554 do
monpjc 0:a23e8a7c9275 1555 {
monpjc 0:a23e8a7c9275 1556 readByte( &ucText );
monpjc 0:a23e8a7c9275 1557 if ( xsvf_iDebugLevel > 0 )
monpjc 0:a23e8a7c9275 1558 {
monpjc 0:a23e8a7c9275 1559 putchar( ucText ? ucText : '\n' );
monpjc 0:a23e8a7c9275 1560 }
monpjc 0:a23e8a7c9275 1561 } while ( ucText );
monpjc 0:a23e8a7c9275 1562 */
monpjc 0:a23e8a7c9275 1563 pXsvfInfo->iErrorCode = XSVF_ERROR_NONE;
monpjc 0:a23e8a7c9275 1564
monpjc 0:a23e8a7c9275 1565 return( pXsvfInfo->iErrorCode );
monpjc 0:a23e8a7c9275 1566 }
monpjc 0:a23e8a7c9275 1567
monpjc 0:a23e8a7c9275 1568 /*****************************************************************************
monpjc 0:a23e8a7c9275 1569 * Function: xsvfDoXWAIT
monpjc 0:a23e8a7c9275 1570 * Description: XWAIT <wait_state> <end_state> <wait_time>
monpjc 0:a23e8a7c9275 1571 * If not already in <wait_state>, then go to <wait_state>.
monpjc 0:a23e8a7c9275 1572 * Wait in <wait_state> for <wait_time> microseconds.
monpjc 0:a23e8a7c9275 1573 * Finally, if not already in <end_state>, then goto <end_state>.
monpjc 0:a23e8a7c9275 1574 * Parameters: pXsvfInfo - XSVF information pointer.
monpjc 0:a23e8a7c9275 1575 * Returns: int - 0 = success; non-zero = error.
monpjc 0:a23e8a7c9275 1576 *****************************************************************************/
monpjc 0:a23e8a7c9275 1577 int xsvfDoXWAIT( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1578 {
monpjc 0:a23e8a7c9275 1579 unsigned char ucWaitState;
monpjc 0:a23e8a7c9275 1580 unsigned char ucEndState;
monpjc 0:a23e8a7c9275 1581 long lWaitTime;
monpjc 0:a23e8a7c9275 1582
monpjc 0:a23e8a7c9275 1583 /* Get Parameters */
monpjc 0:a23e8a7c9275 1584 /* <wait_state> */
monpjc 0:a23e8a7c9275 1585 readVal( &(pXsvfInfo->lvTdi), 1 );
monpjc 0:a23e8a7c9275 1586 ucWaitState = pXsvfInfo->lvTdi.val[0];
monpjc 0:a23e8a7c9275 1587
monpjc 0:a23e8a7c9275 1588 /* <end_state> */
monpjc 0:a23e8a7c9275 1589 readVal( &(pXsvfInfo->lvTdi), 1 );
monpjc 0:a23e8a7c9275 1590 ucEndState = pXsvfInfo->lvTdi.val[0];
monpjc 0:a23e8a7c9275 1591
monpjc 0:a23e8a7c9275 1592 /* <wait_time> */
monpjc 0:a23e8a7c9275 1593 readVal( &(pXsvfInfo->lvTdi), 4 );
monpjc 0:a23e8a7c9275 1594 lWaitTime = value( &(pXsvfInfo->lvTdi) );
monpjc 0:a23e8a7c9275 1595 XSVFDBG_PRINTF2( 3, " XWAIT: state = %s; time = %ld\n",
monpjc 0:a23e8a7c9275 1596 xsvf_pzTapState[ ucWaitState ], lWaitTime );
monpjc 0:a23e8a7c9275 1597
monpjc 0:a23e8a7c9275 1598 /* If not already in <wait_state>, go to <wait_state> */
monpjc 0:a23e8a7c9275 1599 if ( pXsvfInfo->ucTapState != ucWaitState )
monpjc 0:a23e8a7c9275 1600 {
monpjc 0:a23e8a7c9275 1601 xsvfGotoTapState( &(pXsvfInfo->ucTapState), ucWaitState );
monpjc 0:a23e8a7c9275 1602 }
monpjc 0:a23e8a7c9275 1603
monpjc 0:a23e8a7c9275 1604 /* Wait for <wait_time> microseconds */
monpjc 0:a23e8a7c9275 1605 waitTime( lWaitTime );
monpjc 0:a23e8a7c9275 1606
monpjc 0:a23e8a7c9275 1607 /* If not already in <end_state>, go to <end_state> */
monpjc 0:a23e8a7c9275 1608 if ( pXsvfInfo->ucTapState != ucEndState )
monpjc 0:a23e8a7c9275 1609 {
monpjc 0:a23e8a7c9275 1610 xsvfGotoTapState( &(pXsvfInfo->ucTapState), ucEndState );
monpjc 0:a23e8a7c9275 1611 }
monpjc 0:a23e8a7c9275 1612
monpjc 0:a23e8a7c9275 1613 return( XSVF_ERROR_NONE );
monpjc 0:a23e8a7c9275 1614 }
monpjc 0:a23e8a7c9275 1615
monpjc 0:a23e8a7c9275 1616
monpjc 0:a23e8a7c9275 1617 /*============================================================================
monpjc 0:a23e8a7c9275 1618 * Execution Control Functions
monpjc 0:a23e8a7c9275 1619 ============================================================================*/
monpjc 0:a23e8a7c9275 1620
monpjc 0:a23e8a7c9275 1621 /*****************************************************************************
monpjc 0:a23e8a7c9275 1622 * Function: xsvfInitialize
monpjc 0:a23e8a7c9275 1623 * Description: Initialize the xsvf player.
monpjc 0:a23e8a7c9275 1624 * Call this before running the player to initialize the data
monpjc 0:a23e8a7c9275 1625 * in the SXsvfInfo struct.
monpjc 0:a23e8a7c9275 1626 * xsvfCleanup is called to clean up the data in SXsvfInfo
monpjc 0:a23e8a7c9275 1627 * after the XSVF is played.
monpjc 0:a23e8a7c9275 1628 * Parameters: pXsvfInfo - ptr to the XSVF information.
monpjc 0:a23e8a7c9275 1629 * Returns: int - 0 = success; otherwise error.
monpjc 0:a23e8a7c9275 1630 *****************************************************************************/
monpjc 0:a23e8a7c9275 1631 int xsvfInitialize( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1632 {
monpjc 0:a23e8a7c9275 1633 /* Initialize values */
monpjc 0:a23e8a7c9275 1634 pXsvfInfo->iErrorCode = xsvfInfoInit( pXsvfInfo );
monpjc 0:a23e8a7c9275 1635 return 0;
monpjc 0:a23e8a7c9275 1636 if ( !pXsvfInfo->iErrorCode )
monpjc 0:a23e8a7c9275 1637 {
monpjc 0:a23e8a7c9275 1638 /* Initialize the TAPs */
monpjc 0:a23e8a7c9275 1639 pXsvfInfo->iErrorCode = xsvfGotoTapState( &(pXsvfInfo->ucTapState),
monpjc 0:a23e8a7c9275 1640 XTAPSTATE_RESET );
monpjc 0:a23e8a7c9275 1641 }
monpjc 0:a23e8a7c9275 1642
monpjc 0:a23e8a7c9275 1643 return( pXsvfInfo->iErrorCode );
monpjc 0:a23e8a7c9275 1644 }
monpjc 0:a23e8a7c9275 1645
monpjc 0:a23e8a7c9275 1646 /*****************************************************************************
monpjc 0:a23e8a7c9275 1647 * Function: xsvfRun
monpjc 0:a23e8a7c9275 1648 * Description: Run the xsvf player for a single command and return.
monpjc 0:a23e8a7c9275 1649 * First, call xsvfInitialize.
monpjc 0:a23e8a7c9275 1650 * Then, repeatedly call this function until an error is detected
monpjc 0:a23e8a7c9275 1651 * or until the pXsvfInfo->ucComplete variable is non-zero.
monpjc 0:a23e8a7c9275 1652 * Finally, call xsvfCleanup to cleanup any remnants.
monpjc 0:a23e8a7c9275 1653 * Parameters: pXsvfInfo - ptr to the XSVF information.
monpjc 0:a23e8a7c9275 1654 * Returns: int - 0 = success; otherwise error.
monpjc 0:a23e8a7c9275 1655 *****************************************************************************/
monpjc 0:a23e8a7c9275 1656 int xsvfRun( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1657 {
monpjc 0:a23e8a7c9275 1658 /* Process the XSVF commands */
monpjc 0:a23e8a7c9275 1659 if ( (!pXsvfInfo->iErrorCode) && (!pXsvfInfo->ucComplete) )
monpjc 0:a23e8a7c9275 1660 {
monpjc 0:a23e8a7c9275 1661 /* read 1 byte for the instruction */
monpjc 0:a23e8a7c9275 1662 readByte( &(pXsvfInfo->ucCommand) );
monpjc 0:a23e8a7c9275 1663 ++(pXsvfInfo->lCommandCount);
monpjc 0:a23e8a7c9275 1664
monpjc 0:a23e8a7c9275 1665 if ( pXsvfInfo->ucCommand < XLASTCMD )
monpjc 0:a23e8a7c9275 1666 {
monpjc 0:a23e8a7c9275 1667 /* Execute the command. Func sets error code. */
monpjc 0:a23e8a7c9275 1668 XSVFDBG_PRINTF1( 2, " %s\n",
monpjc 0:a23e8a7c9275 1669 xsvf_pzCommandName[pXsvfInfo->ucCommand] );
monpjc 0:a23e8a7c9275 1670 /* If your compiler cannot take this form,
monpjc 0:a23e8a7c9275 1671 then convert to a switch statement */
monpjc 0:a23e8a7c9275 1672 xsvf_pfDoCmd[ pXsvfInfo->ucCommand ]( pXsvfInfo );
monpjc 0:a23e8a7c9275 1673 }
monpjc 0:a23e8a7c9275 1674 else
monpjc 0:a23e8a7c9275 1675 {
monpjc 0:a23e8a7c9275 1676 /* Illegal command value. Func sets error code. */
monpjc 0:a23e8a7c9275 1677 xsvfDoIllegalCmd( pXsvfInfo );
monpjc 0:a23e8a7c9275 1678 }
monpjc 0:a23e8a7c9275 1679 }
monpjc 0:a23e8a7c9275 1680
monpjc 0:a23e8a7c9275 1681 return( pXsvfInfo->iErrorCode );
monpjc 0:a23e8a7c9275 1682 }
monpjc 0:a23e8a7c9275 1683
monpjc 0:a23e8a7c9275 1684 /*****************************************************************************
monpjc 0:a23e8a7c9275 1685 * Function: xsvfCleanup
monpjc 0:a23e8a7c9275 1686 * Description: cleanup remnants of the xsvf player.
monpjc 0:a23e8a7c9275 1687 * Parameters: pXsvfInfo - ptr to the XSVF information.
monpjc 0:a23e8a7c9275 1688 * Returns: void.
monpjc 0:a23e8a7c9275 1689 *****************************************************************************/
monpjc 0:a23e8a7c9275 1690 void xsvfCleanup( SXsvfInfo* pXsvfInfo )
monpjc 0:a23e8a7c9275 1691 {
monpjc 0:a23e8a7c9275 1692 xsvfInfoCleanup( pXsvfInfo );
monpjc 0:a23e8a7c9275 1693 }
monpjc 0:a23e8a7c9275 1694
monpjc 0:a23e8a7c9275 1695
monpjc 0:a23e8a7c9275 1696 /*============================================================================
monpjc 0:a23e8a7c9275 1697 * xsvfExecute() - The primary entry point to the XSVF player
monpjc 0:a23e8a7c9275 1698 ============================================================================*/
monpjc 0:a23e8a7c9275 1699
monpjc 0:a23e8a7c9275 1700 /*****************************************************************************
monpjc 0:a23e8a7c9275 1701 * Function: xsvfExecute
monpjc 0:a23e8a7c9275 1702 * Description: Process, interpret, and apply the XSVF commands.
monpjc 0:a23e8a7c9275 1703 * See port.c:readByte for source of XSVF data.
monpjc 0:a23e8a7c9275 1704 * Parameters: none.
monpjc 0:a23e8a7c9275 1705 * Returns: int - Legacy result values: 1 == success; 0 == failed.
monpjc 0:a23e8a7c9275 1706 *****************************************************************************/
monpjc 0:a23e8a7c9275 1707 int xsvfExecute()
monpjc 0:a23e8a7c9275 1708 {
monpjc 0:a23e8a7c9275 1709 SXsvfInfo xsvfInfo;
monpjc 0:a23e8a7c9275 1710
monpjc 0:a23e8a7c9275 1711 pc.printf("=========================\n");
monpjc 0:a23e8a7c9275 1712
monpjc 0:a23e8a7c9275 1713 xsvfInitialize( &xsvfInfo );
monpjc 0:a23e8a7c9275 1714
monpjc 0:a23e8a7c9275 1715 pc.printf("init complete\n");
monpjc 0:a23e8a7c9275 1716 return 0;
monpjc 0:a23e8a7c9275 1717 while ( !xsvfInfo.iErrorCode && (!xsvfInfo.ucComplete) )
monpjc 0:a23e8a7c9275 1718 {
monpjc 0:a23e8a7c9275 1719 xsvfRun( &xsvfInfo );
monpjc 0:a23e8a7c9275 1720 pc.printf("loop>\n");
monpjc 0:a23e8a7c9275 1721 }
monpjc 0:a23e8a7c9275 1722
monpjc 0:a23e8a7c9275 1723 if ( xsvfInfo.iErrorCode )
monpjc 0:a23e8a7c9275 1724 {
monpjc 0:a23e8a7c9275 1725 XSVFDBG_PRINTF1( 0, "%s\n", xsvf_pzErrorName[
monpjc 0:a23e8a7c9275 1726 ( xsvfInfo.iErrorCode < XSVF_ERROR_LAST )
monpjc 0:a23e8a7c9275 1727 ? xsvfInfo.iErrorCode : XSVF_ERROR_UNKNOWN ] );
monpjc 0:a23e8a7c9275 1728 XSVFDBG_PRINTF2( 0, "ERROR at or near XSVF command #%ld. See line #%ld in the XSVF ASCII file.\n",
monpjc 0:a23e8a7c9275 1729 xsvfInfo.lCommandCount, xsvfInfo.lCommandCount );
monpjc 0:a23e8a7c9275 1730 }
monpjc 0:a23e8a7c9275 1731 else
monpjc 0:a23e8a7c9275 1732 {
monpjc 0:a23e8a7c9275 1733 XSVFDBG_PRINTF( 0, "SUCCESS - Completed XSVF execution.\n" );
monpjc 0:a23e8a7c9275 1734 }
monpjc 0:a23e8a7c9275 1735
monpjc 0:a23e8a7c9275 1736 xsvfCleanup( &xsvfInfo );
monpjc 0:a23e8a7c9275 1737
monpjc 0:a23e8a7c9275 1738 return( XSVF_ERRORCODE(xsvfInfo.iErrorCode) );
monpjc 0:a23e8a7c9275 1739 }
monpjc 0:a23e8a7c9275 1740
monpjc 0:a23e8a7c9275 1741