/** * * This function runs a self-test on the driver and hardware device. This self * test performs a local loopback and verifies data can be sent and received. * * The time for this test is proportional to the baud rate that has been set * prior to calling this function. * * The mode and control registers are restored before return. * * @param InstPtr is a pointer to the XDmaPs instance * * @return * * - XST_SUCCESS if the test was successful * - XST_FAILURE if the test failed * * @note * * This function can hang if the hardware is not functioning properly. * ******************************************************************************/ int XDmaPs_SelfTest(XDmaPs *InstPtr) { u32 BaseAddr = InstPtr->Config.BaseAddress; int i; if (XDmaPs_ReadReg(BaseAddr, XDMAPS_DBGSTATUS_OFFSET) & XDMAPS_DBGSTATUS_BUSY) return XST_FAILURE; for (i = 0; i < XDMAPS_CHANNELS_PER_DEV; i++) { if (XDmaPs_ReadReg(BaseAddr, XDmaPs_CSn_OFFSET(i))) return XST_FAILURE; } return XST_SUCCESS; }
/** * This function perform the reset sequence to the given dmaps interface by * configuring the appropriate control bits in the dmaps specifc registers * the dmaps reset squence involves the following steps * Disable all the interuupts * Clear the pending interrupts * Kill all the active channel threads * Kill the manager thread * * @param BaseAddress of the interface * * @return N/A * * @note * This function will not modify the slcr registers that are relavant for * dmaps controller ******************************************************************************/ void XDmaPs_ResetHw(u32 BaseAddress) { u32 DbgInst; u32 WaitCount = 0; u32 ChanIndex; /* Disable all the interrupts */ XDmaPs_WriteReg(BaseAddress, XDMAPS_INTEN_OFFSET, 0x00); /* Clear the interrupts */ XDmaPs_WriteReg(BaseAddress, XDMAPS_INTCLR_OFFSET, XDMAPS_INTCLR_ALL_MASK); /* Kill the dma channel threads */ for (ChanIndex=0; ChanIndex < XDMAPS_CHANNELS_PER_DEV; ChanIndex++) { while ((XDmaPs_ReadReg(BaseAddress, XDMAPS_DBGSTATUS_OFFSET) & XDMAPS_DBGSTATUS_BUSY) && (WaitCount < XDMAPS_MAX_WAIT)) WaitCount++; DbgInst = XDmaPs_DBGINST0(0, 0x01, ChanIndex, 1); XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGINST0_OFFSET, DbgInst); XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGINST1_OFFSET, 0x0); XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGCMD_OFFSET, 0x0); } /* Kill the manager thread */ DbgInst = XDmaPs_DBGINST0(0, 0x01, 0, 0); XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGINST0_OFFSET, DbgInst); XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGINST1_OFFSET, 0x0); XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGCMD_OFFSET, 0x0); }