📄 xdevcfg.c
字号:
* Assert the arguments. */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* * Read the Status Register and return the value. */ return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_STATUS_OFFSET);}/****************************************************************************//**** The function sets the contents of the ROM Shadow Control Register.** @param InstancePtr is a pointer to the XDcfg instance.* @param Data is the 32 bit data to be written to the Register.** @return None.** @note This register is can only be written and is used to control the* RAM shadow of 32 bit 4K page ROM pages in user mode******************************************************************************/void XDcfg_SetRomShadowRegister(XDcfg *InstancePtr, u32 Data){ /* * Assert the arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_ROM_SHADOW_OFFSET, Data);}/****************************************************************************//**** The function reads the contents of the Software ID Register.** @param InstancePtr is a pointer to the XDcfg instance.** @return 32 Bit boot software ID.** @note This register is locked for write once the system enters* usermode. Hence API for reading the register only is provided.******************************************************************************/u32 XDcfg_GetSoftwareIdRegister(XDcfg *InstancePtr){ /* * Assert the arguments. */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* * Read the Software ID Register and return the value. */ return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_SW_ID_OFFSET);}/****************************************************************************//**** The function sets the bit mask for the feature in Miscellaneous Control* Register.** @param InstancePtr is a pointer to the XDcfg instance.* @param Mask is the bit-mask of the feature to be set.** @return None.** @note None******************************************************************************/void XDcfg_SetMiscControlRegister(XDcfg *InstancePtr, u32 Mask){ u32 RegData; /* * Assert the arguments. */ Xil_AssertVoid(InstancePtr != NULL); Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); RegData = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_MCTRL_OFFSET); XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_MCTRL_OFFSET, (RegData | Mask));}/****************************************************************************//**** The function reads the contents of the Miscellaneous Control Register.** @param InstancePtr is a pointer to the XDcfg instance.** @return 32 Bit boot software ID.** @note This register is locked for write once the system enters* usermode. Hence API to reading the register only is provided.******************************************************************************/u32 XDcfg_GetMiscControlRegister(XDcfg *InstancePtr){ /* * Assert the arguments. */ Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* * Read the Miscellaneous Control Register and return the value. */ return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_MCTRL_OFFSET);}/******************************************************************************//**** This function checks if DMA command queue is full.** @param InstancePtr is a pointer to the XDcfg instance.** @return XST_SUCCESS is the DMA is busy* XST_FAILURE if the DMA is idle** @note The DMA queue has a depth of two.*****************************************************************************/u32 XDcfg_IsDmaBusy(XDcfg *InstancePtr){ u32 RegData; Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); /* Read the PCAP status register for DMA status */ RegData = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_STATUS_OFFSET); if ((RegData & XDCFG_STATUS_DMA_CMD_Q_F_MASK) == XDCFG_STATUS_DMA_CMD_Q_F_MASK){ return XST_SUCCESS; } return XST_FAILURE;}/******************************************************************************//**** This function initiates the DMA transfer.** @param InstancePtr is a pointer to the XDcfg instance.* @param SourcePtr contains a pointer to the source memory where the data* is to be transferred from.* @param SrcWordLength is the number of words (32 bit) to be transferred* for the source transfer.* @param DestPtr contains a pointer to the destination memory* where the data is to be transferred to.* @param DestWordLength is the number of words (32 bit) to be transferred* for the Destination transfer.** @return None.** @note It is the responsibility of the caller function to ensure that* correct values are passed to this function.** The 2 LSBs of the SourcePtr (Source)/ DestPtr (Destination)* address when equal to 2抌01 indicates the last DMA command of* an overall transfer.*****************************************************************************/void XDcfg_InitiateDma(XDcfg *InstancePtr, u32 SourcePtr, u32 DestPtr, u32 SrcWordLength, u32 DestWordLength){ XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_DMA_SRC_ADDR_OFFSET, SourcePtr); XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_DMA_DEST_ADDR_OFFSET, DestPtr); XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_DMA_SRC_LEN_OFFSET, SrcWordLength); XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_DMA_DEST_LEN_OFFSET, DestWordLength);}/******************************************************************************//**** This function Implements the DMA Read Command. This command is used to* transfer the image data from FPGA to the external memory.** @param InstancePtr is a pointer to the XDcfg instance.* @param SourcePtr contains a pointer to the source memory where the data* is to be transferred from.* @param SrcWordLength is the number of words (32 bit) to be transferred* for the source transfer.* @param DestPtr contains a pointer to the destination memory* where the data is to be transferred to.* @param DestWordLength is the number of words (32 bit) to be transferred* for the Destination transfer.** @return - XST_INVALID_PARAM if source address/length is invalid.* - XST_SUCCESS if DMA transfer initiated properly.** @note None.*****************************************************************************/static u32 XDcfg_PcapReadback(XDcfg *InstancePtr, u32 SourcePtr, u32 SrcWordLength, u32 DestPtr, u32 DestWordLength){ u32 IntrReg; /* * Send READ Frame command to FPGA */ XDcfg_InitiateDma(InstancePtr, SourcePtr, XDCFG_DMA_INVALID_ADDRESS, SrcWordLength, 0); /* * Store the enabled interrrupts to enable beofre the actual read * transfer is initiated and Disable all the interrupts temporarily. */ IntrReg = XDcfg_IntrGetEnabled(InstancePtr); XDcfg_IntrDisable(InstancePtr, XDCFG_IXR_ALL_MASK); /* * Wait till you get the DMA done for the read command sent */ while ((XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_INT_STS_OFFSET) & XDCFG_IXR_D_P_DONE_MASK) == XDCFG_IXR_D_P_DONE_MASK); /* * Enable the previously stored Interrupts . */ XDcfg_IntrEnable(InstancePtr, IntrReg); /* * Initiate the DMA write command. */ XDcfg_InitiateDma(InstancePtr, XDCFG_DMA_INVALID_ADDRESS, (u32)DestPtr, 0, DestWordLength); return XST_SUCCESS;}/****************************************************************************//**** This function starts the DMA transfer. This function only starts the* operation and returns before the operation may be completed.* If the interrupt is enabled, an interrupt will be generated when the* operation is completed, otherwise it is necessary to poll the Status register* to determine when it is completed. It is the responsibility of the caller to* determine when the operation is completed by handling the generated interrupt* or polling the Status Register.** @param InstancePtr is a pointer to the XDcfg instance.* @param SourcePtr contains a pointer to the source memory where the data* is to be transferred from.* @param SrcWordLength is the number of words (32 bit) to be transferred* for the source transfer.* @param DestPtr contains a pointer to the destination memory* where the data is to be transferred to.* @param DestWordLength is the number of words (32 bit) to be transferred* for the Destination transfer.* @param TransferType contains the type of PCAP transfer being requested.* The definitions can be found in the xdevcfg.h file.* @return* - XST_SUCCESS.if DMA transfer initiated successfully* - XST_DEVICE_BUSY if DMA is busy* - XST_INVALID_PARAM if invalid Source / Destination address* is sent or an invalid Source / Destination length is* sent** @note It is the responsibility of the caller to ensure that the cache* is flushed and invalidated both before the DMA operation is* started and after the DMA operation completes if the memory* pointed to is cached. The caller must also ensure that the* pointers contain physical address rather than a virtual address* if address translation is being used.** The 2 LSBs of the SourcePtr (Source)/ DestPtr (Destination)* address when equal to 2抌01 indicates the last DMA command of* an overall transfer.******************************************************************************/u32 XDcfg_Transfer(XDcfg *InstancePtr, void *SourcePtr, u32 SrcWordLength, void *DestPtr, u32 DestWordLength, u32 TransferType){ u32 CtrlReg; Xil_AssertNonvoid(InstancePtr != NULL); Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); if (XDcfg_IsDmaBusy(InstancePtr) == XST_SUCCESS) { return XST_DEVICE_BUSY; } /* * Check whether the fabric is in initialized state */ if ((XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_STATUS_OFFSET) & XDCFG_STATUS_PCFG_INIT_MASK) == 0){ return XST_FAILURE; } if ((TransferType == XDCFG_SECURE_PCAP_WRITE) || (TransferType == XDCFG_NON_SECURE_PCAP_WRITE)) { /* Check for valid source pointer and length */ if ((!SourcePtr) || (SrcWordLength == 0)) { return XST_INVALID_PARAM; } if (TransferType == XDCFG_NON_SECURE_PCAP_WRITE){ /* * Disable AES engine */ CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_CTRL_OFFSET); XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, (CtrlReg & ~XDCFG_CTRL_PCFG_AES_EN_MASK)); } if (TransferType == XDCFG_SECURE_PCAP_WRITE) { /* * Enable AES engine * AES engine handles only 8 bit data every clock cycle. * Hence, Encrypted PCAP data which is 32 bit data can * only be sent in every 4 clock cycles. Set the control * register QUARTER_PCAP_RATE_EN bit to achieve this * operation. */ XDcfg_SetControlRegister(InstancePtr, (XDCFG_CTRL_PCFG_AES_EN_MASK | XDCFG_CTRL_PCAP_RATE_EN_MASK)); } XDcfg_InitiateDma(InstancePtr, (u32)SourcePtr, (u32)DestPtr, SrcWordLength, DestWordLength); } if (TransferType == XDCFG_PCAP_READBACK) { if ((!DestPtr) || (DestWordLength == 0)) { return XST_INVALID_PARAM; } /* * For PCAP readback of FPGA configuration register or memory, * the read command is first sent (written) to the FPGA fabric * which responds by returning the required read data. Read data * from the FPGA is captured if pcap_radata_v is active.A DMA * read transfer is required to obtain the readback command, * which is then sent to the FPGA, followed by a DMA write * transfer to support this mode of operation. */ return XDcfg_PcapReadback(InstancePtr, (u32)SourcePtr, SrcWordLength, (u32)DestPtr, DestWordLength); } if ((TransferType == XDCFG_CONCURRENT_SECURE_READ_WRITE) || (TransferType == XDCFG_CONCURRENT_NONSEC_READ_WRITE)) { if ((!SourcePtr) || (SrcWordLength == 0) || (!DestPtr) || (DestWordLength == 0)) { return XST_INVALID_PARAM; } if (TransferType == XDCFG_CONCURRENT_NONSEC_READ_WRITE){ /* * Disable AES engine */ CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_CTRL_OFFSET); XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, (CtrlReg & ~XDCFG_CTRL_PCFG_AES_EN_MASK)); } if (TransferType == XDCFG_CONCURRENT_SECURE_READ_WRITE) { /* * Enable AES engine */ XDcfg_SetControlRegister(InstancePtr, (XDCFG_CTRL_PCFG_AES_EN_MASK | XDCFG_CTRL_PCAP_RATE_EN_MASK)); } XDcfg_InitiateDma(InstancePtr, (u32)SourcePtr, SrcWordLength, (u32)DestPtr, DestWordLength); } return XST_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -