Пример #1
0
/**
*
* Stop the watchdog timer.
*
* @param	InstancePtr is a pointer to the XScuWdt instance.
*
* @return	None.
*
* @note		None.
*
******************************************************************************/
void XScuWdt_Stop(XScuWdt *InstancePtr)
{
	u32 Register;

	Xil_AssertVoid(InstancePtr != NULL);
	Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);

	/*
	 * Read the contents of the Control register.
	 */
	Register = XScuWdt_ReadReg(InstancePtr->Config.BaseAddr,
				  XSCUWDT_CONTROL_OFFSET);

	/*
	 * Clear the 'watchdog enable' bit in the register.
	 */
	Register &= ~XSCUWDT_CONTROL_WD_ENABLE_MASK;

	/*
	 * Update the Control register with the new value.
	 */
	XScuWdt_WriteReg(InstancePtr->Config.BaseAddr,
			XSCUWDT_CONTROL_OFFSET, Register);

	/*
	 * Indicate that the device is stopped.
	 */
	InstancePtr->IsStarted = 0;
}
Пример #2
0
/**
*
* This function tests the functioning of the Scu Private WDT driver and hardware
* in Timer mode using interrupts.
*
* After one expiration of the timeout interval, an interrupt is generated and
* the Event flag bit is set in the watchdog interrupt status register.
*
* @param	IntcInstancePtr is a pointer to the instance of the XScuGic
*		driver.
* @param	WdtInstancePtr is a pointer to the instance of XScuWdt driver.
* @param	WdtDeviceId is the Device ID of the XScuWdt device.
* @param	WdtIntrId is the Interrupt Id of the XScuWdt device.
*
* @return	XST_SUCCESS if successful, otherwise XST_FAILURE.
*
* @note		None.
*
******************************************************************************/
int ScuWdtIntrExample(XScuGic *IntcInstancePtr, XScuWdt * WdtInstancePtr,
                      u16 WdtDeviceId, u16 WdtIntrId)
{
    int Status;
    u32 Timebase = 0;
    u32 ExpiredTimeDelta = 0;
    XScuWdt_Config *ConfigPtr;

    /*
     * Initialize the ScuWdt driver.
     */
    ConfigPtr = XScuWdt_LookupConfig(WdtDeviceId);

    /*
     * This is where the virtual address would be used, this example
     * uses physical address.
     */
    Status = XScuWdt_CfgInitialize(WdtInstancePtr, ConfigPtr,
                                   ConfigPtr->BaseAddr);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    /*
     * Perform a self-test to ensure that the hardware was built correctly.
     */
    Status = XScuWdt_SelfTest(WdtInstancePtr);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    /*
     * Put the watchdog timer in timer mode.
     */
    XScuWdt_SetTimerMode(WdtInstancePtr);

    /*
     * Load the watchdog counter register.
     */
    XScuWdt_LoadWdt(WdtInstancePtr, WDT_LOAD_VALUE);

    /*
     * Start the ScuWdt device.
     */
    XScuWdt_Start(WdtInstancePtr);

    /*
     * Determine how long it takes for the watchdog timer to expire,
     * for later processing.
     */
    while (1) {
        if (!(XScuWdt_IsTimerExpired(WdtInstancePtr))) {
            ExpiredTimeDelta++;
        } else {
            break;
        }
    }

    /*
     * Stop the timer to set up the device in interrupt mode.
     */
    XScuWdt_Stop(WdtInstancePtr);

    /*
     * Connect the device to interrupt subsystem so that interrupts
     * can occur.
     */
    Status = WdtSetupIntrSystem(IntcInstancePtr, WdtInstancePtr, WdtIntrId);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    /*
     * Reload the watchdog counter register.
     */
    XScuWdt_RestartWdt(WdtInstancePtr);

    /*
     * Start the ScuWdt device.
     */
    HandlerCalled = 0;
    XScuWdt_Start(WdtInstancePtr);

    /*
     * Verify that the watchdog timer does timeout when not restarted
     * all the time, wait more than the amount of time it took for it
     * to expire in the previous test.
     */
    while (1) {
        /*
         * If the handler is called, the test passed
         */
        if ((HandlerCalled != 0)) {
            XScuWdt_WriteReg(WdtInstancePtr->Config.BaseAddr,
                             XSCUWDT_ISR_OFFSET,
                             XSCUWDT_ISR_EVENT_FLAG_MASK);
            break;
        }
    }

    /*
     * Reload the watchdog counter to allow the next test to run normally.
     */
    XScuWdt_RestartWdt(WdtInstancePtr);

    HandlerCalled = 0;

    /*
     * Verify that the watchdog timer does not timeout when restarted
     * all the time, wait more than the amount of time it took for it
     * to expire in the previous test.
     */
    while (1) {
        /*
         * Reload the ScuWdt each pass through the loop.
         */
        XScuWdt_RestartWdt(WdtInstancePtr);

        /*
         * If more time has gone past than it took for it to expire
         * when not restarted in the previous test, then stop as the
         * restarting worked.
         */
        Timebase++;
        if (Timebase > ExpiredTimeDelta + ExpiredTimeDelta) {
            break;
        }

        /*
         * If the watchdog timer expired and/or handler called, then the
         * test failed.
         */
        if ((XScuWdt_IsTimerExpired(WdtInstancePtr)) ||
                (HandlerCalled != 0)) {
            /*
             * Disable and disconnect the interrupt system.
             */
            WdtDisableIntrSystem(IntcInstancePtr, WdtIntrId);
            return XST_FAILURE;
        }
    }

    /*
     * Disable and disconnect the interrupt system.
     */
    WdtDisableIntrSystem(IntcInstancePtr, WdtIntrId);

    return XST_SUCCESS;
}