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