/** * * 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; }
/** * * 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; } }