📄 micro.c
字号:
else
{
xsvfTmsTransition( 1 );
*pucTapState = XTAPSTATE_EXIT1IR;
}
break;
case XTAPSTATE_SHIFTIR:
xsvfTmsTransition( 1 );
*pucTapState = XTAPSTATE_EXIT1IR;
break;
case XTAPSTATE_EXIT1IR:
if ( ucTargetState == XTAPSTATE_PAUSEIR )
{
xsvfTmsTransition( 0 );
*pucTapState = XTAPSTATE_PAUSEIR;
}
else
{
xsvfTmsTransition( 1 );
*pucTapState = XTAPSTATE_UPDATEIR;
}
break;
case XTAPSTATE_PAUSEIR:
xsvfTmsTransition( 1 );
*pucTapState = XTAPSTATE_EXIT2IR;
break;
case XTAPSTATE_EXIT2IR:
if ( ucTargetState == XTAPSTATE_SHIFTIR )
{
xsvfTmsTransition( 0 );
*pucTapState = XTAPSTATE_SHIFTIR;
}
else
{
xsvfTmsTransition( 1 );
*pucTapState = XTAPSTATE_UPDATEIR;
}
break;
case XTAPSTATE_UPDATEIR:
if ( ucTargetState == XTAPSTATE_RUNTEST )
{
xsvfTmsTransition( 0 );
*pucTapState = XTAPSTATE_RUNTEST;
}
else
{
xsvfTmsTransition( 1 );
*pucTapState = XTAPSTATE_SELECTDR;
}
break;
default:
iErrorCode = XSVF_ERROR_ILLEGALSTATE;
*pucTapState = ucTargetState; /* Exit while loop */
break;
}
XSVFDBG_PRINTF1( 3, " TAP State = %s\n",
xsvf_pzTapState[ *pucTapState ] );
}
}
return( iErrorCode );
}
/*****************************************************************************
* Function: xsvfShiftOnly
* Description: Assumes that starting TAP state is SHIFT-DR or SHIFT-IR.
* Shift the given TDI data into the JTAG scan chain.
* Optionally, save the TDO data shifted out of the scan chain.
* Last shift cycle is special: capture last TDO, set last TDI,
* but does not pulse TCK. Caller must pulse TCK and optionally
* set TMS=1 to exit shift state.
* Parameters: lNumBits - number of bits to shift.
* plvTdi - ptr to lenval for TDI data.
* plvTdoCaptured - ptr to lenval for storing captured TDO data.
* iExitShift - 1=exit at end of shift; 0=stay in Shift-DR.
* Returns: void.
*****************************************************************************/
void xsvfShiftOnly( long lNumBits,
lenVal* plvTdi,
lenVal* plvTdoCaptured,
int iExitShift )
{
unsigned char* pucTdi;
unsigned char* pucTdo;
unsigned char ucTdiByte;
unsigned char ucTdoByte;
unsigned char ucTdoBit;
int i;
/* assert( ( ( lNumBits + 7 ) / 8 ) == plvTdi->len ); */
/* Initialize TDO storage len == TDI len */
pucTdo = 0;
if ( plvTdoCaptured )
{
plvTdoCaptured->len = plvTdi->len;
pucTdo = plvTdoCaptured->val + plvTdi->len;
}
/* Shift LSB first. val[N-1] == LSB. val[0] == MSB. */
pucTdi = plvTdi->val + plvTdi->len;
while ( lNumBits )
{
/* Process on a byte-basis */
ucTdiByte = (*(--pucTdi));
ucTdoByte = 0;
for ( i = 0; ( lNumBits && ( i < 8 ) ); ++i )
{
--lNumBits;
if ( iExitShift && !lNumBits )
{
/* Exit Shift-DR state */
setPort( TMS, 1 );
}
/* Set the new TDI value */
setPort( TDI, (short)(ucTdiByte & 1) );
ucTdiByte >>= 1;
/* Set TCK low */
setPort( TCK, 0 );
if ( pucTdo )
{
/* Save the TDO value */
ucTdoBit = readTDOBit();
ucTdoBit = readTDOBit();
ucTdoByte |= ( ucTdoBit << i );
}
/* Set TCK high */
setPort( TCK, 1 );
}
/* Save the TDO byte value */
if ( pucTdo )
{
(*(--pucTdo)) = ucTdoByte;
}
}
}
/*****************************************************************************
* Function: xsvfShift
* Description: Goes to the given starting TAP state.
* Calls xsvfShiftOnly to shift in the given TDI data and
* optionally capture the TDO data.
* Compares the TDO captured data against the TDO expected
* data.
* If a data mismatch occurs, then executes the exception
* handling loop upto ucMaxRepeat times.
* Parameters: pucTapState - Ptr to current TAP state.
* ucStartState - Starting shift state: Shift-DR or Shift-IR.
* lNumBits - number of bits to shift.
* plvTdi - ptr to lenval for TDI data.
* plvTdoCaptured - ptr to lenval for storing TDO data.
* plvTdoExpected - ptr to expected TDO data.
* plvTdoMask - ptr to TDO mask.
* ucEndState - state in which to end the shift.
* lRunTestTime - amount of time to wait after the shift.
* ucMaxRepeat - Maximum number of retries on TDO mismatch.
* Returns: int - 0 = success; otherwise TDO mismatch.
* Notes: XC9500XL-only Optimization:
* Skip the waitTime() if plvTdoMask->val[0:plvTdoMask->len-1]
* is NOT all zeros and sMatch==1.
*****************************************************************************/
int xsvfShift( unsigned char* pucTapState,
unsigned char ucStartState,
long lNumBits,
lenVal* plvTdi,
lenVal* plvTdoCaptured,
lenVal* plvTdoExpected,
lenVal* plvTdoMask,
unsigned char ucEndState,
long lRunTestTime,
unsigned char ucMaxRepeat )
{
int iErrorCode;
int iMismatch;
unsigned char ucRepeat;
int iExitShift;
iErrorCode = XSVF_ERROR_NONE;
iMismatch = 0;
ucRepeat = 0;
iExitShift = ( ucStartState != ucEndState );
XSVFDBG_PRINTF1( 3, " Shift Length = %ld\n", lNumBits );
XSVFDBG_PRINTF( 4, " TDI = ");
XSVFDBG_PRINTLENVAL( 4, plvTdi );
XSVFDBG_PRINTF( 4, "\n");
XSVFDBG_PRINTF( 4, " TDO Expected = ");
XSVFDBG_PRINTLENVAL( 4, plvTdoExpected );
XSVFDBG_PRINTF( 4, "\n");
if ( !lNumBits )
{
/* Compatibility with XSVF2.00: XSDR 0 = no shift, but wait in RTI */
if ( lRunTestTime )
{
/* Wait for prespecified XRUNTEST time */
xsvfGotoTapState( pucTapState, XTAPSTATE_RUNTEST );
XSVFDBG_PRINTF1( 3, " Wait = %ld usec\n", lRunTestTime );
waitTime( lRunTestTime );
}
}
else
{
do
{
/* Goto Shift-DR or Shift-IR */
xsvfGotoTapState( pucTapState, ucStartState );
/* Shift TDI and capture TDO */
xsvfShiftOnly( lNumBits, plvTdi, plvTdoCaptured, iExitShift );
if ( plvTdoExpected )
{
/* Compare TDO data to expected TDO data */
iMismatch = !EqualLenVal( plvTdoExpected,
plvTdoCaptured,
plvTdoMask );
}
if ( iExitShift )
{
/* Update TAP state: Shift->Exit */
++(*pucTapState);
XSVFDBG_PRINTF1( 3, " TAP State = %s\n",
xsvf_pzTapState[ *pucTapState ] );
if ( iMismatch && lRunTestTime && ( ucRepeat < ucMaxRepeat ) )
{
XSVFDBG_PRINTF( 4, " TDO Expected = ");
XSVFDBG_PRINTLENVAL( 4, plvTdoExpected );
XSVFDBG_PRINTF( 4, "\n");
XSVFDBG_PRINTF( 4, " TDO Captured = ");
XSVFDBG_PRINTLENVAL( 4, plvTdoCaptured );
XSVFDBG_PRINTF( 4, "\n");
XSVFDBG_PRINTF( 4, " TDO Mask = ");
XSVFDBG_PRINTLENVAL( 4, plvTdoMask );
XSVFDBG_PRINTF( 4, "\n");
XSVFDBG_PRINTF1( 3, " Retry #%d\n", ( ucRepeat + 1 ) );
/* Do exception handling retry - ShiftDR only */
xsvfGotoTapState( pucTapState, XTAPSTATE_PAUSEDR );
/* Shift 1 extra bit */
xsvfGotoTapState( pucTapState, XTAPSTATE_SHIFTDR );
/* Increment RUNTEST time by an additional 25% */
lRunTestTime += ( lRunTestTime >> 2 );
}
else
{
/* Do normal exit from Shift-XR */
xsvfGotoTapState( pucTapState, ucEndState );
}
if ( lRunTestTime )
{
/* Wait for prespecified XRUNTEST time */
xsvfGotoTapState( pucTapState, XTAPSTATE_RUNTEST );
XSVFDBG_PRINTF1( 3, " Wait = %ld usec\n", lRunTestTime );
waitTime( lRunTestTime );
}
}
} while ( iMismatch && ( ucRepeat++ < ucMaxRepeat ) );
}
if ( iMismatch )
{
XSVFDBG_PRINTF( 1, " TDO Expected = ");
XSVFDBG_PRINTLENVAL( 1, plvTdoExpected );
XSVFDBG_PRINTF( 1, "\n");
XSVFDBG_PRINTF( 1, " TDO Captured = ");
XSVFDBG_PRINTLENVAL( 1, plvTdoCaptured );
XSVFDBG_PRINTF( 1, "\n");
XSVFDBG_PRINTF( 1, " TDO Mask = ");
XSVFDBG_PRINTLENVAL( 1, plvTdoMask );
XSVFDBG_PRINTF( 1, "\n");
if ( ucMaxRepeat && ( ucRepeat > ucMaxRepeat ) )
{
iErrorCode = XSVF_ERROR_MAXRETRIES;
}
else
{
iErrorCode = XSVF_ERROR_TDOMISMATCH;
}
}
return( iErrorCode );
}
/*****************************************************************************
* Function: xsvfBasicXSDRTDO
* Description: Get the XSDRTDO parameters and execute the XSDRTDO command.
* This is the common function for all XSDRTDO commands.
* Parameters: pucTapState - Current TAP state.
* lShiftLengthBits - number of bits to shift.
* sShiftLengthBytes - number of bytes to read.
* plvTdi - ptr to lenval for TDI data.
* lvTdoCaptured - ptr to lenval for storing TDO data.
* iEndState - state in which to end the shift.
* lRunTestTime - amount of time to wait after the shift.
* ucMaxRepeat - maximum xc9500/xl retries.
* Returns: int - 0 = success; otherwise TDO mismatch.
*****************************************************************************/
int xsvfBasicXSDRTDO( unsigned char* pucTapState,
long lShiftLengthBits,
short sShiftLengthBytes,
lenVal* plvTdi,
lenVal* plvTdoCaptured,
lenVal* plvTdoExpected,
lenVal* plvTdoMask,
unsigned char ucEndState,
long lRunTestTime,
unsigned char ucMaxRepeat )
{
readVal( plvTdi, sShiftLengthBytes );
if ( plvTdoExpected )
{
readVal( plvTdoExpected, sShiftLengthBytes );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -