micro.c

来自「适合KS8695X」· C语言 代码 · 共 1,848 行 · 第 1/5 页

C
1,848
字号
	"DRSELECT",     /* 0x02 */
	"DRCAPTURE",    /* 0x03 */
	"DRSHIFT",      /* 0x04 */
	"DREXIT1",      /* 0x05 */
	"DRPAUSE",      /* 0x06 */
	"DREXIT2",      /* 0x07 */
	"DRUPDATE",     /* 0x08 */
	"IRSELECT",     /* 0x09 */
	"IRCAPTURE",    /* 0x0A */
	"IRSHIFT",      /* 0x0B */
	"IREXIT1",      /* 0x0C */
	"IRPAUSE",      /* 0x0D */
	"IREXIT2",      /* 0x0E */
	"IRUPDATE"      /* 0x0F */
};
#endif  /* DEBUG_MODE */

/*#ifdef DEBUG_MODE	*/
/*    FILE* in;   /XXX* Legacy DEBUG_MODE file pointer */
int xsvf_iDebugLevel;
/*#endif /XXX* DEBUG_MODE */

/*============================================================================
 * Utility Functions
 ============================================================================*/

/*****************************************************************************
 * Function:     xsvfPrintLenVal
 * Description:  Print the lenval value in hex.
 * Parameters:   plv     - ptr to lenval.
 * Returns:      void.
 *****************************************************************************/
#ifdef  DEBUG_MODE
void xsvfPrintLenVal( lenVal *plv )
{
	int i;

	if ( plv )
	{
		printf( "0x" );
		for ( i = 0; i < plv->len; ++i )
		{
			printf( "%02x", ((unsigned int)(plv->val[ i ])) );
		}
	}
}
#endif  /* DEBUG_MODE */


/*****************************************************************************
 * Function:     xsvfInfoInit
 * Description:  Initialize the xsvfInfo data.
 * Parameters:   pXsvfInfo   - ptr to the XSVF info structure.
 * Returns:      int         - 0 = success; otherwise error.
 *****************************************************************************/
int xsvfInfoInit( SXsvfInfo* pXsvfInfo )
{
	XSVFDBG_PRINTF1( 4, "    sizeof( SXsvfInfo ) = %d bytes\n",
			 sizeof( SXsvfInfo ) );

	pXsvfInfo->ucComplete       = 0;
	pXsvfInfo->ucCommand        = XCOMPLETE;
	pXsvfInfo->lCommandCount    = 0;
	pXsvfInfo->iErrorCode       = XSVF_ERROR_NONE;
	pXsvfInfo->ucMaxRepeat      = 0;
	pXsvfInfo->ucTapState       = XTAPSTATE_RESET;
	pXsvfInfo->ucEndIR          = XTAPSTATE_RUNTEST;
	pXsvfInfo->ucEndDR          = XTAPSTATE_RUNTEST;
	pXsvfInfo->lShiftLengthBits = 0L;
	pXsvfInfo->sShiftLengthBytes= 0;
	pXsvfInfo->lRunTestTime     = 0L;

	return( 0 );
}

/*****************************************************************************
 * Function:     xsvfInfoCleanup
 * Description:  Cleanup the xsvfInfo data.
 * Parameters:   pXsvfInfo   - ptr to the XSVF info structure.
 * Returns:      void.
 *****************************************************************************/
void xsvfInfoCleanup( SXsvfInfo* pXsvfInfo )
{
}

/*****************************************************************************
 * Function:     xsvfGetAsNumBytes
 * Description:  Calculate the number of bytes the given number of bits
 *               consumes.
 * Parameters:   lNumBits    - the number of bits.
 * Returns:      short       - the number of bytes to store the number of bits.
 *****************************************************************************/
short xsvfGetAsNumBytes( long lNumBits )
{
	return( (short)( ( lNumBits + 7L ) / 8L ) );
}

/*****************************************************************************
 * Function:     xsvfTmsTransition
 * Description:  Apply TMS and transition TAP controller by applying one TCK
 *               cycle.
 * Parameters:   sTms    - new TMS value.
 * Returns:      void.
 *****************************************************************************/
void xsvfTmsTransition( short sTms )
{
	setPort( TMS, sTms );
	setPort( TCK, 0 );
	setPort( TCK, 1 );
}

/*****************************************************************************
 * Function:     xsvfGotoTapState
 * Description:  From the current TAP state, go to the named TAP state.
 *               A target state of RESET ALWAYS causes TMS reset sequence.
 *               All SVF standard stable state paths are supported.
 *               All state transitions are supported except for the following
 *               which cause an XSVF_ERROR_ILLEGALSTATE:
 *                   - Target==DREXIT2;  Start!=DRPAUSE
 *                   - Target==IREXIT2;  Start!=IRPAUSE
 * Parameters:   pucTapState     - Current TAP state; returns final TAP state.
 *               ucTargetState   - New target TAP state.
 * Returns:      int             - 0 = success; otherwise error.
 *****************************************************************************/
int xsvfGotoTapState( unsigned char*   pucTapState,
		      unsigned char    ucTargetState )
{
	int i;
	int iErrorCode;

	iErrorCode  = XSVF_ERROR_NONE;
	if ( ucTargetState == XTAPSTATE_RESET )
	{
		/* If RESET, always perform TMS reset sequence to reset/sync TAPs */
		xsvfTmsTransition( 1 );
		for ( i = 0; i < 5; ++i )
		{
			setPort( TCK, 0 );
			setPort( TCK, 1 );
		}
		*pucTapState    = XTAPSTATE_RESET;
		XSVFDBG_PRINTF( 3, "   TMS Reset Sequence -> Test-Logic-Reset\n" );
		XSVFDBG_PRINTF1( 3, "   TAP State = %s\n",
				 xsvf_pzTapState[ *pucTapState ] );
	} else if ( ( ucTargetState != *pucTapState ) &&
		  ( ( ( ucTargetState == XTAPSTATE_EXIT2DR ) && ( *pucTapState != XTAPSTATE_PAUSEDR ) ) ||
		    ( ( ucTargetState == XTAPSTATE_EXIT2IR ) && ( *pucTapState != XTAPSTATE_PAUSEIR ) ) ) )
	{
		/* Trap illegal TAP state path specification */
		iErrorCode      = XSVF_ERROR_ILLEGALSTATE;
	} else {
		if ( ucTargetState == *pucTapState )
		{
			/* Already in target state.  Do nothing except when in DRPAUSE
			   or in IRPAUSE to comply with SVF standard */
			if ( ucTargetState == XTAPSTATE_PAUSEDR )
			{
				xsvfTmsTransition( 1 );
				*pucTapState    = XTAPSTATE_EXIT2DR;
				XSVFDBG_PRINTF1( 3, "   TAP State = %s\n",
						 xsvf_pzTapState[ *pucTapState ] );
			}
			else if ( ucTargetState == XTAPSTATE_PAUSEIR )
			{
				xsvfTmsTransition( 1 );
				*pucTapState    = XTAPSTATE_EXIT2IR;
				XSVFDBG_PRINTF1( 3, "   TAP State = %s\n",
						 xsvf_pzTapState[ *pucTapState ] );
			}
		}

		/* Perform TAP state transitions to get to the target state */
		while ( ucTargetState != *pucTapState )
		{
			switch ( *pucTapState )
			{
			case XTAPSTATE_RESET:
				xsvfTmsTransition( 0 );
				*pucTapState    = XTAPSTATE_RUNTEST;
				break;
			case XTAPSTATE_RUNTEST:
				xsvfTmsTransition( 1 );
				*pucTapState    = XTAPSTATE_SELECTDR;
				break;
			case XTAPSTATE_SELECTDR:
				if ( ucTargetState >= XTAPSTATE_IRSTATES )
				{
					xsvfTmsTransition( 1 );
					*pucTapState    = XTAPSTATE_SELECTIR;
				}
				else
				{
					xsvfTmsTransition( 0 );
					*pucTapState    = XTAPSTATE_CAPTUREDR;
				}
				break;
			case XTAPSTATE_CAPTUREDR:
				if ( ucTargetState == XTAPSTATE_SHIFTDR )
				{
					xsvfTmsTransition( 0 );
					*pucTapState    = XTAPSTATE_SHIFTDR;
				}
				else
				{
					xsvfTmsTransition( 1 );
					*pucTapState    = XTAPSTATE_EXIT1DR;
				}
				break;
			case XTAPSTATE_SHIFTDR:
				xsvfTmsTransition( 1 );
				*pucTapState    = XTAPSTATE_EXIT1DR;
				break;
			case XTAPSTATE_EXIT1DR:
				if ( ucTargetState == XTAPSTATE_PAUSEDR )
				{
					xsvfTmsTransition( 0 );
					*pucTapState    = XTAPSTATE_PAUSEDR;
				}
				else
				{
					xsvfTmsTransition( 1 );
					*pucTapState    = XTAPSTATE_UPDATEDR;
				}
				break;
			case XTAPSTATE_PAUSEDR:
				xsvfTmsTransition( 1 );
				*pucTapState    = XTAPSTATE_EXIT2DR;
				break;
			case XTAPSTATE_EXIT2DR:
				if ( ucTargetState == XTAPSTATE_SHIFTDR )
				{
					xsvfTmsTransition( 0 );
					*pucTapState    = XTAPSTATE_SHIFTDR;
				}
				else
				{
					xsvfTmsTransition( 1 );
					*pucTapState    = XTAPSTATE_UPDATEDR;
				}
				break;
			case XTAPSTATE_UPDATEDR:
				if ( ucTargetState == XTAPSTATE_RUNTEST )
				{
					xsvfTmsTransition( 0 );
					*pucTapState    = XTAPSTATE_RUNTEST;
				}
				else
				{
					xsvfTmsTransition( 1 );
					*pucTapState    = XTAPSTATE_SELECTDR;
				}
				break;
			case XTAPSTATE_SELECTIR:
				xsvfTmsTransition( 0 );
				*pucTapState    = XTAPSTATE_CAPTUREIR;
				break;
			case XTAPSTATE_CAPTUREIR:
				if ( ucTargetState == XTAPSTATE_SHIFTIR )
				{
					xsvfTmsTransition( 0 );
					*pucTapState    = XTAPSTATE_SHIFTIR;
				}
				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 )
		{

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?