⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xdevcfg.c

📁 自学ZedBoard:使用IP通过ARM PS访问FPGA(源代码)
💻 C
📖 第 1 页 / 共 2 页
字号:
	 * 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 + -