📄 micro_dynamic_target_for_4_virtex.c
字号:
/****************************************************************************** file: micro.c* abstract: This file contains the function, xsvfExecute(),* call for interpreting the XSVF commands.* Usage: Call xsvfExecute() to process XSVF data.* The XSVF data is retrieved by readByte() in ports.c* Remove the main function if you already have one.* Options: XSVF_SUPPORT_COMPRESSION* This define supports the XC9500/XL compression scheme.* This define adds support for XSDRINC and XSETSDRMASKS.* XSVF_SUPPORT_ERRORCODES* This define causes the xsvfExecute function to return* an error code for specific errors. See error codes below.* If this is not defined, the return value defaults to the* legacy values for backward compatibility:* 1 = success; 0 = failure.* Debugging: DEBUG_MODE (Legacy name)* Define DEBUG_MODE to compile with debugging features.* Both micro.c and ports.c must be compiled with the DEBUG_MODE* defined to enable the standalone main implementation in* micro.c that reads XSVF from a file.* History: v2.00 - Original XSVF implementation.* v4.04 - Added delay at end of XSIR for XC18v00 support.* Added new commands for CoolRunner support:* XSTATE, XENDIR, XENDDR* v4.05 - Cleanup micro.c but leave ports.c intact.* v4.05.01- Added support for defining dynamic device targets.* v4.06 - Fix xsvfGotoTapState for retry transition.* v4.07 - Update example waitTime implementations for* compatibility with Virtex-II.* v4.10 - Add new XSIR2 command that supports a 2-byte* IR-length parameter for IR shifts > 255 bits.* v4.11 - No change. Update version to match SVF2XSVF xlator.* v4.14 - Added XCOMMENT.* v5.00 - Improve XSTATE support.* Added XWAIT.* v5.01 - make sure that TCK is low during RUNTEST wait for* XC18V00/XCF00 support. Only change is in PORTS.C* waitTime() function for implementations that do NOT* pulse TCK during the waitTime.* v5.01.03 - Fix trailer shift sequence in xsvfShift.*****************************************************************************//*============================================================================* #pragmas============================================================================*/#ifdef _MSC_VER #pragma warning( disable : 4100 )#endif /* _MSC_VER *//*============================================================================* #include files============================================================================*/#ifdef DEBUG_MODE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h>#endif /* DEBUG_MODE */#include "micro.h"#include "lenval.h"#include "ports.h"/*============================================================================* XSVF #define============================================================================*/#define XSVF_VERSION "5.01.03"/****************************************************************************** Define: XSVF_SUPPORT_COMPRESSION* Description: Define this to support the XC9500/XL XSVF data compression* scheme.* Code size can be reduced by NOT supporting this feature.* However, you must use the -nc (no compress) option when* translating SVF to XSVF using the SVF2XSVF translator.* Corresponding, uncompressed XSVF may be larger.*****************************************************************************/#ifndef XSVF_SUPPORT_COMPRESSION #define XSVF_SUPPORT_COMPRESSION 1#endif/****************************************************************************** Define: XSVF_SUPPORT_ERRORCODES* Description: Define this to support the new XSVF error codes.* (The original XSVF player just returned 1 for success and* 0 for an unspecified failure.)*****************************************************************************/#ifndef XSVF_SUPPORT_ERRORCODES #define XSVF_SUPPORT_ERRORCODES 1#endif#ifdef XSVF_SUPPORT_ERRORCODES #define XSVF_ERRORCODE(errorCode) errorCode#else /* Use legacy error code */ #define XSVF_ERRORCODE(errorCode) ((errorCode==XSVF_ERROR_NONE)?1:0)#endif /* XSVF_SUPPORT_ERRORCODES *//****************************************************************************** Define: XSVF_MAIN* Description: Define this to compile with a main function for standalone* debugging.*****************************************************************************/#ifndef XSVF_MAIN #ifdef DEBUG_MODE #define XSVF_MAIN 1 #endif /* DEBUG_MODE */#endif /* XSVF_MAIN *//*============================================================================* DEBUG_MODE #define============================================================================*/#ifdef DEBUG_MODE #define XSVFDBG_PRINTF(iDebugLevel,pzFormat) \ { if ( xsvf_iDebugLevel >= iDebugLevel ) \ printf( pzFormat ); } #define XSVFDBG_PRINTF1(iDebugLevel,pzFormat,arg1) \ { if ( xsvf_iDebugLevel >= iDebugLevel ) \ printf( pzFormat, arg1 ); } #define XSVFDBG_PRINTF2(iDebugLevel,pzFormat,arg1,arg2) \ { if ( xsvf_iDebugLevel >= iDebugLevel ) \ printf( pzFormat, arg1, arg2 ); } #define XSVFDBG_PRINTF3(iDebugLevel,pzFormat,arg1,arg2,arg3) \ { if ( xsvf_iDebugLevel >= iDebugLevel ) \ printf( pzFormat, arg1, arg2, arg3 ); } #define XSVFDBG_PRINTLENVAL(iDebugLevel,plenVal) \ { if ( xsvf_iDebugLevel >= iDebugLevel ) \ xsvfPrintLenVal(plenVal); }#else /* !DEBUG_MODE */ #define XSVFDBG_PRINTF(iDebugLevel,pzFormat) #define XSVFDBG_PRINTF1(iDebugLevel,pzFormat,arg1) #define XSVFDBG_PRINTF2(iDebugLevel,pzFormat,arg1,arg2) #define XSVFDBG_PRINTF3(iDebugLevel,pzFormat,arg1,arg2,arg3) #define XSVFDBG_PRINTLENVAL(iDebugLevel,plenVal)#endif /* DEBUG_MODE *//*============================================================================* XSVF Type Declarations============================================================================*//****************************************************************************** Struct: SXsvfInfo* Description: This structure contains all of the data used during the* execution of the XSVF. Some data is persistent, predefined* information (e.g. lRunTestTime). The bulk of this struct's* size is due to the lenVal structs (defined in lenval.h)* which contain buffers for the active shift data. The MAX_LEN* #define in lenval.h defines the size of these buffers.* These buffers must be large enough to store the longest* shift data in your XSVF file. For example:* MAX_LEN >= ( longest_shift_data_in_bits / 8 )* Because the lenVal struct dominates the space usage of this* struct, the rough size of this struct is:* sizeof( SXsvfInfo ) ~= MAX_LEN * 7 (number of lenVals)* xsvfInitialize() contains initialization code for the data* in this struct.* xsvfCleanup() contains cleanup code for the data in this* struct.*****************************************************************************/typedef struct tagSXsvfInfo{ /* XSVF status information */ unsigned char ucComplete; /* 0 = running; 1 = complete */ unsigned char ucCommand; /* Current XSVF command byte */ long lCommandCount; /* Number of commands processed */ int iErrorCode; /* An error code. 0 = no error. */ /* TAP state/sequencing information */ unsigned char ucTapState; /* Current TAP state */ unsigned char ucEndIR; /* ENDIR TAP state (See SVF) */ unsigned char ucEndDR; /* ENDDR TAP state (See SVF) */ /* RUNTEST information */ unsigned char ucMaxRepeat; /* Max repeat loops (for xc9500/xl) */ long lRunTestTime; /* Pre-specified RUNTEST time (usec) */ /* Shift Data Info and Buffers */ long lShiftLengthBits; /* Len. current shift data in bits */ short sShiftLengthBytes; /* Len. current shift data in bytes */ lenVal lvTdi; /* Current TDI shift data */ lenVal lvTdoExpected; /* Expected TDO shift data */ lenVal lvTdoCaptured; /* Captured TDO shift data */ lenVal lvTdoMask; /* TDO mask: 0=dontcare; 1=compare */#ifdef XSVF_SUPPORT_COMPRESSION /* XSDRINC Data Buffers */ lenVal lvAddressMask; /* Address mask for XSDRINC */ lenVal lvDataMask; /* Data mask for XSDRINC */ lenVal lvNextData; /* Next data for XSDRINC */#endif /* XSVF_SUPPORT_COMPRESSION */ int iHir; /* # IR header bits */ int iTir; /* # IR trailer bits */ int iHdr; /* # DR header bits */ int iTdr; /* # DR trailer bits */ int iHdrFpga; /* # DR header bits for FPGA */} SXsvfInfo;/* Declare pointer to functions that perform XSVF commands */typedef int (*TXsvfDoCmdFuncPtr)( SXsvfInfo* );/*============================================================================* XSVF Command Bytes============================================================================*//* encodings of xsvf instructions */#define XCOMPLETE 0#define XTDOMASK 1#define XSIR 2#define XSDR 3#define XRUNTEST 4/* Reserved 5 *//* Reserved 6 */#define XREPEAT 7#define XSDRSIZE 8#define XSDRTDO 9#define XSETSDRMASKS 10#define XSDRINC 11#define XSDRB 12#define XSDRC 13#define XSDRE 14#define XSDRTDOB 15#define XSDRTDOC 16#define XSDRTDOE 17#define XSTATE 18 /* 4.00 */#define XENDIR 19 /* 4.04 */#define XENDDR 20 /* 4.04 */#define XSIR2 21 /* 4.10 */#define XCOMMENT 22 /* 4.14 */#define XWAIT 23 /* 5.00 *//* Insert new commands here *//* and add corresponding xsvfDoCmd function to xsvf_pfDoCmd below. */#define XLASTCMD 24 /* Last command marker *//*============================================================================* XSVF Command Parameter Values============================================================================*/#define XSTATE_RESET 0 /* 4.00 parameter for XSTATE */#define XSTATE_RUNTEST 1 /* 4.00 parameter for XSTATE */#define XENDXR_RUNTEST 0 /* 4.04 parameter for XENDIR/DR */#define XENDXR_PAUSE 1 /* 4.04 parameter for XENDIR/DR *//* TAP states */#define XTAPSTATE_RESET 0x00#define XTAPSTATE_RUNTEST 0x01 /* a.k.a. IDLE */#define XTAPSTATE_SELECTDR 0x02#define XTAPSTATE_CAPTUREDR 0x03#define XTAPSTATE_SHIFTDR 0x04#define XTAPSTATE_EXIT1DR 0x05#define XTAPSTATE_PAUSEDR 0x06#define XTAPSTATE_EXIT2DR 0x07#define XTAPSTATE_UPDATEDR 0x08#define XTAPSTATE_IRSTATES 0x09 /* All IR states begin here */#define XTAPSTATE_SELECTIR 0x09#define XTAPSTATE_CAPTUREIR 0x0A#define XTAPSTATE_SHIFTIR 0x0B#define XTAPSTATE_EXIT1IR 0x0C#define XTAPSTATE_PAUSEIR 0x0D#define XTAPSTATE_EXIT2IR 0x0E#define XTAPSTATE_UPDATEIR 0x0F/*============================================================================* XSVF Function Prototypes============================================================================*/int xsvfDoIllegalCmd( SXsvfInfo* pXsvfInfo ); /* Illegal command function */int xsvfDoXCOMPLETE( SXsvfInfo* pXsvfInfo );int xsvfDoXTDOMASK( SXsvfInfo* pXsvfInfo );int xsvfDoXSIR( SXsvfInfo* pXsvfInfo );int xsvfDoXSIR2( SXsvfInfo* pXsvfInfo );int xsvfDoXSDR( SXsvfInfo* pXsvfInfo );int xsvfDoXRUNTEST( SXsvfInfo* pXsvfInfo );int xsvfDoXREPEAT( SXsvfInfo* pXsvfInfo );int xsvfDoXSDRSIZE( SXsvfInfo* pXsvfInfo );int xsvfDoXSDRTDO( SXsvfInfo* pXsvfInfo );int xsvfDoXSETSDRMASKS( SXsvfInfo* pXsvfInfo );int xsvfDoXSDRINC( SXsvfInfo* pXsvfInfo );int xsvfDoXSDRBCE( SXsvfInfo* pXsvfInfo );int xsvfDoXSDRTDOBCE( SXsvfInfo* pXsvfInfo );int xsvfDoXSTATE( SXsvfInfo* pXsvfInfo );int xsvfDoXENDXR( SXsvfInfo* pXsvfInfo );int xsvfDoXCOMMENT( SXsvfInfo* pXsvfInfo );int xsvfDoXWAIT( SXsvfInfo* pXsvfInfo );/* Insert new command functions here *//*============================================================================* XSVF Global Variables============================================================================*//* Array of XSVF command functions. Must follow command byte value order! *//* If your compiler cannot take this form, then convert to a switch statement*/TXsvfDoCmdFuncPtr xsvf_pfDoCmd[] ={ xsvfDoXCOMPLETE, /* 0 */ xsvfDoXTDOMASK, /* 1 */ xsvfDoXSIR, /* 2 */ xsvfDoXSDR, /* 3 */ xsvfDoXRUNTEST, /* 4 */ xsvfDoIllegalCmd, /* 5 */ xsvfDoIllegalCmd, /* 6 */ xsvfDoXREPEAT, /* 7 */ xsvfDoXSDRSIZE, /* 8 */ xsvfDoXSDRTDO, /* 9 */#ifdef XSVF_SUPPORT_COMPRESSION xsvfDoXSETSDRMASKS, /* 10 */ xsvfDoXSDRINC, /* 11 */#else xsvfDoIllegalCmd, /* 10 */ xsvfDoIllegalCmd, /* 11 */#endif /* XSVF_SUPPORT_COMPRESSION */ xsvfDoXSDRBCE, /* 12 */ xsvfDoXSDRBCE, /* 13 */ xsvfDoXSDRBCE, /* 14 */ xsvfDoXSDRTDOBCE, /* 15 */ xsvfDoXSDRTDOBCE, /* 16 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -