/** * * This function returns the IDCODE of the target device. * * @param BaseAddress is the base address of the HwIcap instance. * @param IdCode is the IDCODE of the part this code is running on. * * @return XST_SUCCESS if successful, otherwise XST_FAILURE * * @note None * ******************************************************************************/ u32 HwIcapLowLevelExample(u32 BaseAddress, u32 *IdCode) { u32 Index; u32 Retries; /* * Write command sequence to the FIFO */ for (Index = 0; Index < HWICAP_EXAMPLE_BITSTREAM_LENGTH; Index++) { XHwIcap_WriteReg(BaseAddress, XHI_WF_OFFSET, ReadId[Index]); } /* * Start the transfer of the data from the FIFO to the ICAP device. */ XHwIcap_WriteReg(BaseAddress, XHI_CR_OFFSET, XHI_CR_WRITE_MASK); /* * Poll for done, which indicates end of transfer */ Retries = 0; while ((XHwIcap_ReadReg(BaseAddress, XHI_SR_OFFSET) & XHI_SR_DONE_MASK) != XHI_SR_DONE_MASK) { Retries++; if (Retries > XHI_MAX_RETRIES) { /* * Waited to long. Exit with error. */ printf("\r\nHwIcapLowLevelExample failed- retries \ failure. \r\n\r\n"); return XST_FAILURE; } }
/** * * Run a self-test on the driver/device. The test * - Writes to the Interrupt Enable Register and reads it back * for comparison. * * @param InstancePtr is a pointer to the XHwIcap instance. * * @return * - XST_SUCCESS if the value read from the register * is the same as the value written. * - XST_FAILURE otherwise * * @note None. * ******************************************************************************/ int XHwIcap_SelfTest(XHwIcap *InstancePtr) { int Status = XST_SUCCESS; u32 IeRegister; u32 DgieRegister; /* * Assert the argument */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* * Save a copy of the Global Interrupt Enable Register and Interrupt * Enable Register before writing them so that they can be restored. */ DgieRegister = XHwIcap_ReadReg(InstancePtr->HwIcapConfig.BaseAddress, XHI_GIER_OFFSET); IeRegister = XHwIcap_IntrGetEnabled(InstancePtr); /* * Disable the Global Interrupt */ XHwIcap_IntrGlobalDisable(InstancePtr); /* * Disable/Enable the interrupts and then verify that the register * is read back correct. */ XHwIcap_IntrDisable(InstancePtr, XHI_IPIXR_ALL_MASK); if (XHwIcap_IntrGetEnabled(InstancePtr) != 0x0) { Status = XST_FAILURE; } XHwIcap_IntrEnable(InstancePtr, (XHI_IPIXR_WEMPTY_MASK | XHI_IPIXR_RDP_MASK)); if (XHwIcap_IntrGetEnabled(InstancePtr) != (XHI_IPIXR_WEMPTY_MASK | XHI_IPIXR_RDP_MASK)) { Status |= XST_FAILURE; } /* * Restore the Interrupt Enable Register to the value before the * test. */ XHwIcap_IntrDisable(InstancePtr, XHI_IPIXR_ALL_MASK); if (IeRegister != 0) { XHwIcap_IntrEnable(InstancePtr, IeRegister); } /* * Restore the Global Interrupt Enable Register to the value * before the test. */ XHwIcap_WriteReg(InstancePtr->HwIcapConfig.BaseAddress, XHI_GIER_OFFSET, DgieRegister); if (Status != XST_SUCCESS) { return XST_FAILURE; } return XST_SUCCESS; }