示例#1
0
void tdifRxStateMachine (uint32 * pEvent)
{
	*pEvent = 0;
	
	if (TCTimeElapsed(tdifFSM.lastTime) < FSM_TICKSIZE) return;
	tdifFSM.lastTime = TCTimeGet();	
	if (tdifFSM.state == TDIF_STATE_DISABLED) return;

	tdifFSM._status = pDiceTDIFRx->status;
	tdifFSM.status.reg |= tdifFSM._status.reg;
  
		
	switch (tdifFSM.state)
	{
		case TDIF_STATE_FORCE_PLL:
			if (!tdifFSM.stateVal)
			{
				tdifRxSetState (TDIF_STATE_CHECK);
			}
			else
			{
				tdifFSM.stateVal--;
			}
			break;

		case TDIF_STATE_CHECK:
			if (!tdifFSM.stateVal)
			{
				if (tdifFSM._status.bit.lock == 1) 
				{
					tdifRxSetState (TDIF_STATE_LOCKED);
					*pEvent |= EVT_TDIF_LOCK_ACQUIRED;
				}
				else
				{
					// we need to pump again or try another source
					tdifRxSetState (TDIF_STATE_FORCE_PLL);
				}
			}
			else
			{
				tdifFSM.stateVal--;
			}
			break;      
			
		case TDIF_STATE_LOCKED:
			if (tdifFSM._status.bit.no_lock == 0)
			{
				tdifRxSetState (TDIF_STATE_FORCE_PLL);
				*pEvent |= EVT_TDIF_LOCK_LOST;
			} 
			else
			{
				*pEvent |= tdifFSM._status.reg & DIRECT_EV_MASK;
			}
			break;
	}
	
}
示例#2
0
HRESULT briElapsedTimeSinceResetIndication(uint32 *elapsedTime)
{
	HRESULT		hResult = NO_ERROR;

	*elapsedTime = TCTimeElapsed(briLastResetIndication);

	return hResult;
}
示例#3
0
HRESULT briElapsedTimeSinceResetCompletion(uint32 *elapsedTime)
{
	HRESULT		hResult = NO_ERROR;

	*elapsedTime = 0;

	if (briInBusResetProgress == TRUE)
	{
		hResult = E_BRI_NEW_BUS_RESET;
	}

	*elapsedTime = TCTimeElapsed(briLastResetCompletion);

	return hResult;
}
示例#4
0
void sysPrintElapsedTime(uint32 time)
{
	char timestr[32];
	sysGetTimeStr(TCTimeElapsed(time), timestr);
	sysDebugPrintf(timestr);
}
示例#5
0
void aesRxStateMachine (uint8 events[NUM_AES])
{
	uint8 i, mask;
	uint8 * pEvents = events;
	BOOL bLocked;
	uAESRX_ERROR mstrError;
		
	memset (events, 0, NUM_AES);
	
	if (TCTimeElapsed(aesFSM.lastTime) < FSM_TICKSIZE) return;
	aesFSM.lastTime = TCTimeGet();	
	if (aesFSM.state == AES_STATE_DISABLED) return;

	mstrError = pDiceAESRx->error;
	for (i = 0 ; i < NUM_AES; i++) 
	{
		aesFSM._rxError[i].reg = pDiceAESRx->rxError[i].reg; // read and clear sticky bits
		if (i == aesFSM.rxMaster)
		{
			// read the master overrun underrun
			aesFSM._rxError[i].bit.o_run = mstrError.bit.o_run;
			aesFSM._rxError[i].bit.u_run = mstrError.bit.u_run;
		}
		aesFSM.rxError[i].reg |= aesFSM._rxError[i].reg; // accumulate sticky bits
	}
	
	
	switch (aesFSM.state)
	{
		case AES_STATE_FORCE_PLL:
			if (!aesFSM.stateVal)
				aesRxSetState (AES_STATE_CHECK);
			else
				aesFSM.stateVal--;
			break;
    
		case AES_STATE_CHECK:
			if (!aesFSM.stateVal)
			{
				if (aesFSM._rxError[aesFSM.rxMaster].bit.lock == 1) 
				{
					aesRxSetState (AES_STATE_LOCKED);
					break;
				}
			    
				// we need to pump again or try another source
				if (aesFSM.rxSelMaster < NUM_AES)
				{
					aesRxSetState (AES_STATE_FORCE_PLL);
				}
				else
				{
					aesFSM.rxMaster++;
					if (aesFSM.rxMaster >= NUM_AES) aesFSM.rxMaster = 0;
					pDiceAESRx->setup.bit.master_clock = aesFSM.rxMaster;
					aesRxSetState (AES_STATE_FORCE_PLL);
				}
			}
			else
			{
				aesFSM.stateVal--;
			}
			break;      
      
		case AES_STATE_LOCKED:
			if (aesFSM._rxError[aesFSM.rxMaster].bit.no_lock == 1)
			{
				aesRxSetState (AES_STATE_FORCE_PLL);
			}
			break;
	}
	// collect lock status events and other events if locked
	mask = 0x1;
	for (i = 0 ; i < NUM_AES; i++) 
	{
		if (i == aesFSM.rxMaster)
			bLocked = (aesFSM.state == AES_STATE_LOCKED);
		else
			bLocked = (aesFSM.state == AES_STATE_LOCKED) && ((aesFSM._rxError[i].reg & 0x03) == 0x01);
		
		// now check if we need to notify
		if (bLocked && !(aesFSM.lockmask & mask))
		{
			*pEvents = EVT_AES1_LOCK_ACQUIRED;
			aesFSM.lockmask |= mask;
		}
		else if (!bLocked && (aesFSM.lockmask & mask))
		{
			*pEvents = EVT_AES1_LOCK_LOST;
			aesFSM.lockmask &= ~mask;
		}
		if (bLocked)
		{
			*pEvents |= aesFSM._rxError[i].reg & DIRECT_EV_MASK;
		}
		mask <<= 1;
		pEvents++;
	}
}