⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 micro_dynamic_target_for_4_virtex.c

📁 Xilinx Jtag Configuration source code, Support *.xsvf file
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -