/**
*
* Enables the specified options for the specified timer counter. This function
* sets the options without regard to the current options of the driver. To
* prevent a loss of the current options, the user should call
* XTmrCtr_GetOptions() prior to this function and modify the retrieved options
* to pass into this function to prevent loss of the current options.
*
* @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).
* @param	Options contains the desired options to be set or cleared.
*		Setting the option to '1' enables the option, clearing the to
*		'0' disables the option. The options are bit masks such that
*		multiple options may be set or cleared. The options are
*		described in xtmrctr.h.
*
* @return	None.
*
* @note		None.
*
******************************************************************************/
void XTmrCtr_SetOptions(XTmrCtr * InstancePtr, u8 TmrCtrNumber, u32 Options)
{
	u32 CounterControlReg = 0;
	u32 Index;

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

	/*
	 * Loop through the Options table, turning the enable on or off
	 * depending on whether the bit is set in the incoming Options flag.
	 */

	for (Index = 0; Index < XTC_NUM_OPTIONS; Index++) {
		if (Options & OptionsTable[Index].Option) {

			/*
			 * Turn the option on
			 */
			CounterControlReg |= OptionsTable[Index].Mask;
		}
		else {
			/*
			 * Turn the option off
			 */
			CounterControlReg &= ~OptionsTable[Index].Mask;
		}
	}

	/*
	 * Write out the updated value to the actual register
	 */
	XTmrCtr_mWriteReg(InstancePtr->BaseAddress, TmrCtrNumber,
			  XTC_TCSR_OFFSET, CounterControlReg);
}
Esempio 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;
    }
}