トランジスタ技術2011年9月号「mbed30分クッキング」のプログラムです。
Dependencies: mbed TextLCD SDFileSystem
mylib/micro.c@0:42e9eb506e88, 2011-08-08 (annotated)
- Committer:
- shintamainjp
- Date:
- Mon Aug 08 10:33:50 2011 +0000
- Revision:
- 0:42e9eb506e88
Initial version.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |