micro.c
来自「适合KS8695X」· C语言 代码 · 共 1,848 行 · 第 1/5 页
C
1,848 行
iErrorCode = XSVF_ERROR_DATAOVERFLOW;
}
else
{
/* Get and store instruction to shift in */
readVal( &(pXsvfInfo->lvTdi), xsvfGetAsNumBytes( ucShiftIrBits ) );
/* Shift the data */
iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState), XTAPSTATE_SHIFTIR,
ucShiftIrBits, &(pXsvfInfo->lvTdi),
/*plvTdoCaptured*/0, /*plvTdoExpected*/0,
/*plvTdoMask*/0, pXsvfInfo->ucEndIR,
pXsvfInfo->lRunTestTime, /*ucMaxRepeat*/0 );
}
if ( iErrorCode != XSVF_ERROR_NONE )
{
pXsvfInfo->iErrorCode = iErrorCode;
}
return( iErrorCode );
}
/*****************************************************************************
* Function: xsvfDoXSIR2
* Description: XSIR <(2-byte)shiftlen> <lenVal.TDI[shiftlen]>
* Get the instruction and shift the instruction into the TAP.
* If prespecified XRUNTEST!=0, goto RUNTEST and wait after
* the shift for XRUNTEST usec.
* Parameters: pXsvfInfo - XSVF information pointer.
* Returns: int - 0 = success; non-zero = error.
*****************************************************************************/
int xsvfDoXSIR2( SXsvfInfo* pXsvfInfo )
{
long lShiftIrBits;
short sShiftIrBytes;
int iErrorCode;
/* Get the shift length and store */
readVal( &(pXsvfInfo->lvTdi), 2 );
lShiftIrBits = value( &(pXsvfInfo->lvTdi) );
sShiftIrBytes = xsvfGetAsNumBytes( lShiftIrBits );
XSVFDBG_PRINTF1( 3, " XSIR2 length = %d\n", (int)lShiftIrBits);
if ( sShiftIrBytes > MAX_LEN )
{
iErrorCode = XSVF_ERROR_DATAOVERFLOW;
}
else
{
/* Get and store instruction to shift in */
readVal( &(pXsvfInfo->lvTdi), xsvfGetAsNumBytes( lShiftIrBits ) );
/* Shift the data */
iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState), XTAPSTATE_SHIFTIR,
lShiftIrBits, &(pXsvfInfo->lvTdi),
/*plvTdoCaptured*/0, /*plvTdoExpected*/0,
/*plvTdoMask*/0, pXsvfInfo->ucEndIR,
pXsvfInfo->lRunTestTime, /*ucMaxRepeat*/0 );
}
if ( iErrorCode != XSVF_ERROR_NONE )
{
pXsvfInfo->iErrorCode = iErrorCode;
}
return( iErrorCode );
}
/*****************************************************************************
* Function: xsvfDoXSDR
* Description: XSDR <lenVal.TDI[XSDRSIZE]>
* Shift the given TDI data into the JTAG scan chain.
* Compare the captured TDO with the expected TDO from the
* previous XSDRTDO command using the previously specified
* XTDOMASK.
* Parameters: pXsvfInfo - XSVF information pointer.
* Returns: int - 0 = success; non-zero = error.
*****************************************************************************/
int xsvfDoXSDR( SXsvfInfo* pXsvfInfo )
{
int iErrorCode;
readVal( &(pXsvfInfo->lvTdi), pXsvfInfo->sShiftLengthBytes );
/* use TDOExpected from last XSDRTDO instruction */
iErrorCode = xsvfShift( &(pXsvfInfo->ucTapState), XTAPSTATE_SHIFTDR,
pXsvfInfo->lShiftLengthBits, &(pXsvfInfo->lvTdi),
&(pXsvfInfo->lvTdoCaptured),
&(pXsvfInfo->lvTdoExpected),
&(pXsvfInfo->lvTdoMask), pXsvfInfo->ucEndDR,
pXsvfInfo->lRunTestTime, pXsvfInfo->ucMaxRepeat );
if ( iErrorCode != XSVF_ERROR_NONE )
{
pXsvfInfo->iErrorCode = iErrorCode;
}
return( iErrorCode );
}
/*****************************************************************************
* Function: xsvfDoXRUNTEST
* Description: XRUNTEST <uint32>
* Prespecify the XRUNTEST wait time for shift operations.
* Parameters: pXsvfInfo - XSVF information pointer.
* Returns: int - 0 = success; non-zero = error.
*****************************************************************************/
int xsvfDoXRUNTEST( SXsvfInfo* pXsvfInfo )
{
readVal( &(pXsvfInfo->lvTdi), 4 );
pXsvfInfo->lRunTestTime = value( &(pXsvfInfo->lvTdi) );
XSVFDBG_PRINTF1( 3, " XRUNTEST = %ld\n", pXsvfInfo->lRunTestTime );
return( XSVF_ERROR_NONE );
}
/*****************************************************************************
* Function: xsvfDoXREPEAT
* Description: XREPEAT <byte>
* Prespecify the maximum number of XC9500/XL retries.
* Parameters: pXsvfInfo - XSVF information pointer.
* Returns: int - 0 = success; non-zero = error.
*****************************************************************************/
int xsvfDoXREPEAT( SXsvfInfo* pXsvfInfo )
{
readByte( &(pXsvfInfo->ucMaxRepeat) );
XSVFDBG_PRINTF1( 3, " XREPEAT = %d\n",
((unsigned int)(pXsvfInfo->ucMaxRepeat)) );
return( XSVF_ERROR_NONE );
}
/*****************************************************************************
* Function: xsvfDoXSDRSIZE
* Description: XSDRSIZE <uint32>
* Prespecify the XRUNTEST wait time for shift operations.
* Parameters: pXsvfInfo - XSVF information pointer.
* Returns: int - 0 = success; non-zero = error.
*****************************************************************************/
int xsvfDoXSDRSIZE( SXsvfInfo* pXsvfInfo )
{
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 );
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_COMPRESSION
int 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_COMPRESSION
int 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 );
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 );
}
}
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 );
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 );
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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?