/** * * Run a self-test on the interrupt controller driver/device. This is a * destructive test. * * This involves forcing interrupts into the controller (if possible, given * the IO Module configuration) and verifying that they are recognized and can * be acknowledged. * * @param InstancePtr is a pointer to the XIOModule instance to be * worked on. * * @return * - XST_SUCCESS if self-test is successful. * - XST_INTC_FAIL_SELFTEST if the Interrupt controller * fails the self-test. It will fail the self test if the * device has previously been started in real mode. * * @note None. * ******************************************************************************/ int XIOModule_Intc_SelfTest(XIOModule * InstancePtr) { u32 CurrentISR; u32 Temp; /* * Assert the arguments */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* * Acknowledge all pending interrupts by reading the interrupt status * register and writing the value to the acknowledge register */ Temp = XIomodule_In32(InstancePtr->BaseAddress + XIN_ISR_OFFSET); XIomodule_Out32(InstancePtr->BaseAddress + XIN_IAR_OFFSET, Temp); /* * Verify that there are no interrupts by reading the interrupt status */ CurrentISR = XIomodule_In32(InstancePtr->BaseAddress + XIN_ISR_OFFSET); /* * ISR for internal interrupts should be zero after all interrupts * are acknowledged. Skip checking external interrupts, since they may * occur at any time. */ if ((CurrentISR & 0xffff) != 0) { return XST_INTC_FAIL_SELFTEST; } return XST_SUCCESS; }
/** * Read 32-bit word from the IO Bus memory mapped IO * * @param InstancePtr is a pointer to an XIOModule instance to be * worked on. * @param ByteOffset is a byte offset from the beginning of the * IO Bus address area * * @return Value read from the IO Bus - 32-bit word * *****************************************************************************/ u32 XIOModule_IoReadWord(XIOModule * InstancePtr, u32 ByteOffset) { XASSERT_NONVOID(InstancePtr != NULL); XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); return XIomodule_In32((InstancePtr->IoBaseAddress + ByteOffset)); }
/** * Read 32-bit word from the IO Bus memory mapped IO * * @param InstancePtr is a pointer to an XIOModule instance to be * worked on. * @param ByteOffset is a byte offset from the beginning of the * IO Bus address area * * @return Value read from the IO Bus - 32-bit word * *****************************************************************************/ u32 XIOModule_IoReadWord(XIOModule * InstancePtr, u32 ByteOffset) { Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); return XIomodule_In32((InstancePtr->IoBaseAddress + ByteOffset)); }