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