トランジスタ技術2011年9月号「mbed30分クッキング」のプログラムです。

Dependencies:   mbed TextLCD SDFileSystem

Committer:
shintamainjp
Date:
Mon Aug 08 10:33:50 2011 +0000
Revision:
0:42e9eb506e88
Initial version.

Who changed what in which revision?

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