📄 micro_dynamic_target_for_4_virtex.c
字号:
int iErrorCode; iErrorCode = XSVF_ERROR_NONE; readVal( &(pXsvfInfo->lvTdi), 4 ); pXsvfInfo->lShiftLengthBits = value( &(pXsvfInfo->lvTdi) ); pXsvfInfo->sShiftLengthBytes= xsvfGetAsNumBytes( pXsvfInfo->lShiftLengthBits ); XSVFDBG_PRINTF1( 3, " XSDRSIZE = %ld\n", pXsvfInfo->lShiftLengthBits ); if ( pXsvfInfo->sShiftLengthBytes > MAX_LEN ) { iErrorCode = XSVF_ERROR_DATAOVERFLOW; pXsvfInfo->iErrorCode = iErrorCode; } return( iErrorCode );}/****************************************************************************** Function: xsvfDoXSDRTDO* Description: XSDRTDO <lenVal.TDI[XSDRSIZE]> <lenVal.TDO[XSDRSIZE]>* Get the TDI and expected TDO values. Then, shift.* Compare the expected TDO with the captured TDO using the* prespecified XTDOMASK.* Parameters: pXsvfInfo - XSVF information pointer.* Returns: int - 0 = success; non-zero = error.*****************************************************************************/int xsvfDoXSDRTDO( SXsvfInfo* pXsvfInfo ){ int iErrorCode; iErrorCode = xsvfBasicXSDRTDO( &(pXsvfInfo->ucTapState), pXsvfInfo->lShiftLengthBits, pXsvfInfo->sShiftLengthBytes, &(pXsvfInfo->lvTdi), &(pXsvfInfo->lvTdoCaptured), &(pXsvfInfo->lvTdoExpected), &(pXsvfInfo->lvTdoMask), pXsvfInfo->ucEndDR, pXsvfInfo->lRunTestTime, pXsvfInfo->ucMaxRepeat, pXsvfInfo->iHdr, pXsvfInfo->iTdr ); if ( iErrorCode != XSVF_ERROR_NONE ) { pXsvfInfo->iErrorCode = iErrorCode; } return( iErrorCode );}/****************************************************************************** Function: xsvfDoXSETSDRMASKS* Description: XSETSDRMASKS <lenVal.AddressMask[XSDRSIZE]>* <lenVal.DataMask[XSDRSIZE]>* Get the prespecified address and data mask for the XSDRINC* command.* Used for xc9500/xl compressed XSVF data.* Parameters: pXsvfInfo - XSVF information pointer.* Returns: int - 0 = success; non-zero = error.*****************************************************************************/#ifdef XSVF_SUPPORT_COMPRESSIONint xsvfDoXSETSDRMASKS( SXsvfInfo* pXsvfInfo ){ /* read the addressMask */ readVal( &(pXsvfInfo->lvAddressMask), pXsvfInfo->sShiftLengthBytes ); /* read the dataMask */ readVal( &(pXsvfInfo->lvDataMask), pXsvfInfo->sShiftLengthBytes ); XSVFDBG_PRINTF( 4, " Address Mask = " ); XSVFDBG_PRINTLENVAL( 4, &(pXsvfInfo->lvAddressMask) ); XSVFDBG_PRINTF( 4, "\n" ); XSVFDBG_PRINTF( 4, " Data Mask = " ); XSVFDBG_PRINTLENVAL( 4, &(pXsvfInfo->lvDataMask) ); XSVFDBG_PRINTF( 4, "\n" ); return( XSVF_ERROR_NONE );}#endif /* XSVF_SUPPORT_COMPRESSION *//****************************************************************************** Function: xsvfDoXSDRINC* Description: XSDRINC <lenVal.firstTDI[XSDRSIZE]> <byte(numTimes)>* <lenVal.data[XSETSDRMASKS.dataMask.len]> ...* Get the XSDRINC parameters and execute the XSDRINC command.* XSDRINC starts by loading the first TDI shift value.* Then, for numTimes, XSDRINC gets the next piece of data,* replaces the bits from the starting TDI as defined by the* XSETSDRMASKS.dataMask, adds the address mask from* XSETSDRMASKS.addressMask, shifts the new TDI value,* and compares the TDO to the expected TDO from the previous* XSDRTDO command using the XTDOMASK.* Used for xc9500/xl compressed XSVF data.* Parameters: pXsvfInfo - XSVF information pointer.* Returns: int - 0 = success; non-zero = error.*****************************************************************************/#ifdef XSVF_SUPPORT_COMPRESSIONint xsvfDoXSDRINC( SXsvfInfo* pXsvfInfo ){ int iErrorCode; int iDataMaskLen; unsigned char ucDataMask; unsigned char ucNumTimes; unsigned char i; readVal( &(pXsvfInfo->lvTdi), pXsvfInfo->sShiftLengthBytes ); iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState), XTAPSTATE_SHIFTDR, pXsvfInfo->lShiftLengthBits, &(pXsvfInfo->lvTdi), &(pXsvfInfo->lvTdoCaptured), &(pXsvfInfo->lvTdoExpected), &(pXsvfInfo->lvTdoMask), pXsvfInfo->ucEndDR, pXsvfInfo->lRunTestTime, pXsvfInfo->ucMaxRepeat, pXsvfInfo->iHdr, pXsvfInfo->iTdr ); if ( !iErrorCode ) { /* Calculate number of data mask bits */ iDataMaskLen = 0; for ( i = 0; i < pXsvfInfo->lvDataMask.len; ++i ) { ucDataMask = pXsvfInfo->lvDataMask.val[ i ]; while ( ucDataMask ) { iDataMaskLen += ( ucDataMask & 1 ); ucDataMask >>= 1; } } /* Get the number of data pieces, i.e. number of times to shift */ readByte( &ucNumTimes ); /* For numTimes, get data, fix TDI, and shift */ for ( i = 0; !iErrorCode && ( i < ucNumTimes ); ++i ) { readVal( &(pXsvfInfo->lvNextData), xsvfGetAsNumBytes( iDataMaskLen ) ); xsvfDoSDRMasking( &(pXsvfInfo->lvTdi), &(pXsvfInfo->lvNextData), &(pXsvfInfo->lvAddressMask), &(pXsvfInfo->lvDataMask) ); iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState), XTAPSTATE_SHIFTDR, pXsvfInfo->lShiftLengthBits, &(pXsvfInfo->lvTdi), &(pXsvfInfo->lvTdoCaptured), &(pXsvfInfo->lvTdoExpected), &(pXsvfInfo->lvTdoMask), pXsvfInfo->ucEndDR, pXsvfInfo->lRunTestTime, pXsvfInfo->ucMaxRepeat, pXsvfInfo->iHdr, pXsvfInfo->iTdr ); } } if ( iErrorCode != XSVF_ERROR_NONE ) { pXsvfInfo->iErrorCode = iErrorCode; } return( iErrorCode );}#endif /* XSVF_SUPPORT_COMPRESSION *//****************************************************************************** Function: xsvfDoXSDRBCE* Description: XSDRB/XSDRC/XSDRE <lenVal.TDI[XSDRSIZE]>* If not already in SHIFTDR, goto SHIFTDR.* Shift the given TDI data into the JTAG scan chain.* Ignore TDO.* If cmd==XSDRE, then goto ENDDR. Otherwise, stay in ShiftDR.* XSDRB, XSDRC, and XSDRE are the same implementation.* Parameters: pXsvfInfo - XSVF information pointer.* Returns: int - 0 = success; non-zero = error.*****************************************************************************/int xsvfDoXSDRBCE( SXsvfInfo* pXsvfInfo ){ unsigned char ucEndDR; int iErrorCode; ucEndDR = (unsigned char)(( pXsvfInfo->ucCommand == XSDRE ) ? pXsvfInfo->ucEndDR : XTAPSTATE_SHIFTDR); iErrorCode = xsvfBasicXSDRTDO( &(pXsvfInfo->ucTapState), pXsvfInfo->lShiftLengthBits, pXsvfInfo->sShiftLengthBytes, &(pXsvfInfo->lvTdi), /*plvTdoCaptured*/0, /*plvTdoExpected*/0, /*plvTdoMask*/0, ucEndDR, /*lRunTestTime*/0, /*ucMaxRepeat*/0, ((pXsvfInfo->ucTapState==XTAPSTATE_SHIFTDR)? 0:(pXsvfInfo->iHdrFpga)), ((ucEndDR==XTAPSTATE_SHIFTDR)? 0:(pXsvfInfo->iTdr)) ); if ( iErrorCode != XSVF_ERROR_NONE ) { pXsvfInfo->iErrorCode = iErrorCode; } return( iErrorCode );}/****************************************************************************** Function: xsvfDoXSDRTDOBCE* Description: XSDRB/XSDRC/XSDRE <lenVal.TDI[XSDRSIZE]> <lenVal.TDO[XSDRSIZE]>* If not already in SHIFTDR, goto SHIFTDR.* Shift the given TDI data into the JTAG scan chain.* Compare TDO, but do NOT use XTDOMASK.* If cmd==XSDRTDOE, then goto ENDDR. Otherwise, stay in ShiftDR.* XSDRTDOB, XSDRTDOC, and XSDRTDOE are the same implementation.* Parameters: pXsvfInfo - XSVF information pointer.* Returns: int - 0 = success; non-zero = error.*****************************************************************************/int xsvfDoXSDRTDOBCE( SXsvfInfo* pXsvfInfo ){ unsigned char ucEndDR; int iErrorCode; ucEndDR = (unsigned char)(( pXsvfInfo->ucCommand == XSDRTDOE ) ? pXsvfInfo->ucEndDR : XTAPSTATE_SHIFTDR); iErrorCode = xsvfBasicXSDRTDO( &(pXsvfInfo->ucTapState), pXsvfInfo->lShiftLengthBits, pXsvfInfo->sShiftLengthBytes, &(pXsvfInfo->lvTdi), &(pXsvfInfo->lvTdoCaptured), &(pXsvfInfo->lvTdoExpected), /*plvTdoMask*/0, ucEndDR, /*lRunTestTime*/0, /*ucMaxRepeat*/0, ((pXsvfInfo->ucTapState==XTAPSTATE_SHIFTDR)? 0:(pXsvfInfo->iHdrFpga)), ((ucEndDR==XTAPSTATE_SHIFTDR)? 0:(pXsvfInfo->iTdr)) ); if ( iErrorCode != XSVF_ERROR_NONE ) { pXsvfInfo->iErrorCode = iErrorCode; } return( iErrorCode );}/****************************************************************************** Function: xsvfDoXSTATE* Description: XSTATE <byte>* <byte> == XTAPSTATE;* Get the state parameter and transition the TAP to that state.* Parameters: pXsvfInfo - XSVF information pointer.* Returns: int - 0 = success; non-zero = error.*****************************************************************************/int xsvfDoXSTATE( SXsvfInfo* pXsvfInfo ){ unsigned char ucNextState; int iErrorCode; readByte( &ucNextState ); iErrorCode = xsvfGotoTapState( &(pXsvfInfo->ucTapState), ucNextState ); if ( iErrorCode != XSVF_ERROR_NONE ) { pXsvfInfo->iErrorCode = iErrorCode; } return( iErrorCode );}/****************************************************************************** Function: xsvfDoXENDXR* Description: XENDIR/XENDDR <byte>* <byte>: 0 = RUNTEST; 1 = PAUSE.* Get the prespecified XENDIR or XENDDR.* Both XENDIR and XENDDR use the same implementation.* Parameters: pXsvfInfo - XSVF information pointer.* Returns: int - 0 = success; non-zero = error.*****************************************************************************/int xsvfDoXENDXR( SXsvfInfo* pXsvfInfo ){ int iErrorCode; unsigned char ucEndState; iErrorCode = XSVF_ERROR_NONE; readByte( &ucEndState ); if ( ( ucEndState != XENDXR_RUNTEST ) && ( ucEndState != XENDXR_PAUSE ) ) { iErrorCode = XSVF_ERROR_ILLEGALSTATE; } else { if ( pXsvfInfo->ucCommand == XENDIR ) { if ( ucEndState == XENDXR_RUNTEST ) { pXsvfInfo->ucEndIR = XTAPSTATE_RUNTEST; } else { pXsvfInfo->ucEndIR = XTAPSTATE_PAUSEIR; } XSVFDBG_PRINTF1( 3, " ENDIR State = %s\n", xsvf_pzTapState[ pXsvfInfo->ucEndIR ] ); } else /* XENDDR */ { if ( ucEndState == XENDXR_RUNTEST ) { pXsvfInfo->ucEndDR = XTAPSTATE_RUNTEST; } else { pXsvfInfo->ucEndDR = XTAPSTATE_PAUSEDR; } XSVFDBG_PRINTF1( 3, " ENDDR State = %s\n", xsvf_pzTapState[ pXsvfInfo->ucEndDR ] ); } } if ( iErrorCode != XSVF_ERROR_NONE ) { pXsvfInfo->iErrorCode = iErrorCode; } return( iErrorCode );}/****************************************************************************** Function: xsvfDoXCOMMENT* Description: XCOMMENT <text string ending in \0>* <text string ending in \0> == text comment;* Arbitrary comment embedded in the XSVF.* Parameters: pXsvfInfo - XSVF information pointer.* Returns: int - 0 = success; non-zero = error.*****************************************************************************/int xsvfDoXCOMMENT( SXsvfInfo* pXsvfInfo ){ /* Use the comment for debugging */ /* Otherwise, read through the comment to the end '\0' and ignore */ unsigned char ucText; if ( xsvf_iDebugLevel > 0 ) { putchar( ' ' ); } do { readByte( &ucTex
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -