/**
*
* Get the options for the specified timer counter.
*
* @param	InstancePtr is a pointer to the XTmrCtr instance.
* @param	TmrCtrNumber is the timer counter of the device to operate on
*		Each device may contain multiple timer counters. The timer
*		number is a zero based number with a range of
*		0 - (XTC_DEVICE_TIMER_COUNT - 1).
*
* @return
*
* The currently set options. An option which is set to a '1' is enabled and
* set to a '0' is disabled. The options are bit masks such that multiple
* options may be set or cleared. The options are described in xtmrctr.h.
*
* @note		None.
*
******************************************************************************/
u32 XTmrCtr_GetOptions(XTmrCtr * InstancePtr, u8 TmrCtrNumber)
{

	u32 Options = 0;
	u32 CounterControlReg;
	u32 Index;

	XASSERT_NONVOID(InstancePtr != NULL);
	XASSERT_NONVOID(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT);
	XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);

	/*
	 * Read the current contents of the control status register to allow
	 * the current options to be determined
	 */
	CounterControlReg = XTimerCtr_mReadReg(InstancePtr->BaseAddress,
					       TmrCtrNumber, XTC_TCSR_OFFSET);
	/*
	 * Loop through the Options table, turning the enable on or off
	 * depending on whether the bit is set in the current register settings.
	 */
	for (Index = 0; Index < XTC_NUM_OPTIONS; Index++) {
		if (CounterControlReg & OptionsTable[Index].Mask) {
			Options |= OptionsTable[Index].Option;	/* turn it on */
		}
		else {
			Options &= ~OptionsTable[Index].Option;	/* turn it off */
		}
	}

	return Options;
}
Ejemplo n.º 2
0
/**
*
* Runs a self-test on the driver/device. This test verifies that the specified
* timer counter of the device can be enabled and increments.
*
* @param    InstancePtr is a pointer to the XTmrCtr instance to be worked on.
* @param    TmrCtrNumber is the timer counter of the device to operate on. Each
*           device may contain multiple timer counters. The timer number is a
*           zero based number with a range of 0 - (XTC_DEVICE_TIMER_COUNT - 1).
*
* @return
*
* XST_SUCCESS if self-test was successful, or XST_FAILURE if the timer is not
* incrementing.
*
* @note
*
* This is a destructive test using the provided timer. The current settings
* of the timer are returned to the initialized values and all settings at the
* time this function is called are overwritten.
*
******************************************************************************/
XStatus XTmrCtr_SelfTest(XTmrCtr *InstancePtr, Xuint8 TmrCtrNumber)
{
    Xuint32 TimerCount1 = 0;
    Xuint32 TimerCount2 = 0;
    Xuint16 Count = 0;

    XASSERT_NONVOID(InstancePtr != XNULL);
    XASSERT_NONVOID(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT);
    XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY);

    /*
     * set the Capture register to 0
     */

    XTmrCtr_mWriteReg(InstancePtr->BaseAddress, TmrCtrNumber,
                      XTC_TLR_OFFSET, 0);

    /*
     * reset the timer and the interrupt
     */

    XTmrCtr_mWriteReg(InstancePtr->BaseAddress, TmrCtrNumber,
                      XTC_TCSR_OFFSET,
                      XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK);

    /*
     * set the control/status register to enable timer
     */
    XTmrCtr_mWriteReg(InstancePtr->BaseAddress, TmrCtrNumber,
                      XTC_TCSR_OFFSET, XTC_CSR_ENABLE_TMR_MASK);

    /*
     * read the timer
     */
    TimerCount1 = XTimerCtr_mReadReg(InstancePtr->BaseAddress,
                                     TmrCtrNumber, XTC_TCR_OFFSET);
    /*
     * make sure timer is incrementing if the Count rolls over to zero
     * and the timer still has not incremented an error is returned
     */

    do
    {
        TimerCount2 = XTimerCtr_mReadReg(InstancePtr->BaseAddress,
                                        TmrCtrNumber, XTC_TCR_OFFSET);
        Count++;
    }
    while ((TimerCount1 == TimerCount2) && (Count != 0));

    /*
     * reset the timer and the interrupt
     */

    XTmrCtr_mWriteReg(InstancePtr->BaseAddress, TmrCtrNumber,
                      XTC_TCSR_OFFSET,
                      XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK);

    /*
     * set the control/status register to 0 to complete initialization
     * this disables the timer completely and allows it to be used again
     */

    XTmrCtr_mWriteReg(InstancePtr->BaseAddress, TmrCtrNumber,
                      XTC_TCSR_OFFSET, 0);

    if (TimerCount1 == TimerCount2)
    {
        return XST_FAILURE;
    }
    else
    {
        return XST_SUCCESS;
    }
}