| /****************************************************************************** |
| * |
| * Author: Xilinx, Inc. |
| * |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License as published by the |
| * Free Software Foundation; either version 2 of the License, or (at your |
| * option) any later version. |
| * |
| * |
| * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A |
| * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS |
| * ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD, |
| * XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE |
| * FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING |
| * ANY THIRD PARTY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. |
| * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO |
| * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY |
| * WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM |
| * CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND |
| * FITNESS FOR A PARTICULAR PURPOSE. |
| * |
| * |
| * Xilinx hardware products are not intended for use in life support |
| * appliances, devices, or systems. Use in such applications is |
| * expressly prohibited. |
| * |
| * |
| * (c) Copyright 2002-2004 Xilinx Inc. |
| * All rights reserved. |
| * |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program; if not, write to the Free Software Foundation, Inc., |
| * 675 Mass Ave, Cambridge, MA 02139, USA. |
| * |
| * FILENAME: |
| * |
| * xdma_channel.c |
| * |
| * DESCRIPTION: |
| * |
| * This file contains the DMA channel component. This component supports |
| * a distributed DMA design in which each device can have it's own dedicated |
| * DMA channel, as opposed to a centralized DMA design. This component |
| * performs processing for DMA on all devices. |
| * |
| * See xdma_channel.h for more information about this component. |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| |
| /***************************** Include Files *********************************/ |
| |
| #include "xdma_channel.h" |
| #include "xbasic_types.h" |
| #include "xio.h" |
| |
| /************************** Constant Definitions *****************************/ |
| |
| /**************************** Type Definitions *******************************/ |
| |
| /***************** Macros (Inline Functions) Definitions *********************/ |
| |
| /************************** Function Prototypes ******************************/ |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_Initialize |
| * |
| * DESCRIPTION: |
| * |
| * This function initializes a DMA channel. This function must be called |
| * prior to using a DMA channel. Initialization of a channel includes setting |
| * up the registers base address, and resetting the channel such that it's in a |
| * known state. Interrupts for the channel are disabled when the channel is |
| * reset. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * BaseAddress contains the base address of the registers for the DMA channel. |
| * |
| * RETURN VALUE: |
| * |
| * XST_SUCCESS indicating initialization was successful. |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| XStatus |
| XDmaChannel_Initialize(XDmaChannel * InstancePtr, u32 BaseAddress) |
| { |
| /* assert to verify input arguments, don't assert base address */ |
| |
| XASSERT_NONVOID(InstancePtr != NULL); |
| |
| /* setup the base address of the registers for the DMA channel such |
| * that register accesses can be done |
| */ |
| InstancePtr->RegBaseAddress = BaseAddress; |
| |
| /* initialize the scatter gather list such that it indicates it has not |
| * been created yet and the DMA channel is ready to use (initialized) |
| */ |
| InstancePtr->GetPtr = NULL; |
| InstancePtr->PutPtr = NULL; |
| InstancePtr->CommitPtr = NULL; |
| InstancePtr->LastPtr = NULL; |
| |
| InstancePtr->TotalDescriptorCount = 0; |
| InstancePtr->ActiveDescriptorCount = 0; |
| InstancePtr->IsReady = XCOMPONENT_IS_READY; |
| |
| /* initialize the version of the component |
| */ |
| XVersion_FromString(&InstancePtr->Version, "1.00a"); |
| |
| /* reset the DMA channel such that it's in a known state and ready |
| * and indicate the initialization occured with no errors, note that |
| * the is ready variable must be set before this call or reset will assert |
| */ |
| XDmaChannel_Reset(InstancePtr); |
| |
| return XST_SUCCESS; |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_IsReady |
| * |
| * DESCRIPTION: |
| * |
| * This function determines if a DMA channel component has been successfully |
| * initialized such that it's ready to use. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * RETURN VALUE: |
| * |
| * TRUE if the DMA channel component is ready, FALSE otherwise. |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| u32 |
| XDmaChannel_IsReady(XDmaChannel * InstancePtr) |
| { |
| /* assert to verify input arguments used by the base component */ |
| |
| XASSERT_NONVOID(InstancePtr != NULL); |
| |
| return InstancePtr->IsReady == XCOMPONENT_IS_READY; |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_GetVersion |
| * |
| * DESCRIPTION: |
| * |
| * This function gets the software version for the specified DMA channel |
| * component. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * RETURN VALUE: |
| * |
| * A pointer to the software version of the specified DMA channel. |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| XVersion * |
| XDmaChannel_GetVersion(XDmaChannel * InstancePtr) |
| { |
| /* assert to verify input arguments */ |
| |
| XASSERT_NONVOID(InstancePtr != NULL); |
| XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* return a pointer to the version of the DMA channel */ |
| |
| return &InstancePtr->Version; |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_SelfTest |
| * |
| * DESCRIPTION: |
| * |
| * This function performs a self test on the specified DMA channel. This self |
| * test is destructive as the DMA channel is reset and a register default is |
| * verified. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr is a pointer to the DMA channel to be operated on. |
| * |
| * RETURN VALUE: |
| * |
| * XST_SUCCESS is returned if the self test is successful, or one of the |
| * following errors. |
| * |
| * XST_DMA_RESET_REGISTER_ERROR Indicates the control register value |
| * after a reset was not correct |
| * |
| * NOTES: |
| * |
| * This test does not performs a DMA transfer to test the channel because the |
| * DMA hardware will not currently allow a non-local memory transfer to non-local |
| * memory (memory copy), but only allows a non-local memory to or from the device |
| * memory (typically a FIFO). |
| * |
| ******************************************************************************/ |
| |
| #define XDC_CONTROL_REG_RESET_MASK 0x98000000UL /* control reg reset value */ |
| |
| XStatus |
| XDmaChannel_SelfTest(XDmaChannel * InstancePtr) |
| { |
| u32 ControlReg; |
| |
| /* assert to verify input arguments */ |
| |
| XASSERT_NONVOID(InstancePtr != NULL); |
| XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* reset the DMA channel such that it's in a known state before the test |
| * it resets to no interrupts enabled, the desired state for the test |
| */ |
| XDmaChannel_Reset(InstancePtr); |
| |
| /* this should be the first test to help prevent a lock up with the polling |
| * loop that occurs later in the test, check the reset value of the DMA |
| * control register to make sure it's correct, return with an error if not |
| */ |
| ControlReg = XDmaChannel_GetControl(InstancePtr); |
| if (ControlReg != XDC_CONTROL_REG_RESET_MASK) { |
| return XST_DMA_RESET_REGISTER_ERROR; |
| } |
| |
| return XST_SUCCESS; |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_Reset |
| * |
| * DESCRIPTION: |
| * |
| * This function resets the DMA channel. This is a destructive operation such |
| * that it should not be done while a channel is being used. If the DMA channel |
| * is transferring data into other blocks, such as a FIFO, it may be necessary |
| * to reset other blocks. This function does not modify the contents of a |
| * scatter gather list for a DMA channel such that the user is responsible for |
| * getting buffer descriptors from the list if necessary. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * RETURN VALUE: |
| * |
| * None. |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| void |
| XDmaChannel_Reset(XDmaChannel * InstancePtr) |
| { |
| /* assert to verify input arguments */ |
| |
| XASSERT_VOID(InstancePtr != NULL); |
| XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* reset the DMA channel such that it's in a known state, the reset |
| * register is self clearing such that it only has to be set |
| */ |
| XIo_Out32(InstancePtr->RegBaseAddress + XDC_RST_REG_OFFSET, |
| XDC_RESET_MASK); |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_GetControl |
| * |
| * DESCRIPTION: |
| * |
| * This function gets the control register contents of the DMA channel. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * RETURN VALUE: |
| * |
| * The control register contents of the DMA channel. One or more of the |
| * following values may be contained the register. Each of the values are |
| * unique bit masks. |
| * |
| * XDC_DMACR_SOURCE_INCR_MASK Increment the source address |
| * XDC_DMACR_DEST_INCR_MASK Increment the destination address |
| * XDC_DMACR_SOURCE_LOCAL_MASK Local source address |
| * XDC_DMACR_DEST_LOCAL_MASK Local destination address |
| * XDC_DMACR_SG_ENABLE_MASK Scatter gather enable |
| * XDC_DMACR_GEN_BD_INTR_MASK Individual buffer descriptor interrupt |
| * XDC_DMACR_LAST_BD_MASK Last buffer descriptor in a packet |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| u32 |
| XDmaChannel_GetControl(XDmaChannel * InstancePtr) |
| { |
| /* assert to verify input arguments */ |
| |
| XASSERT_NONVOID(InstancePtr != NULL); |
| XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* return the contents of the DMA control register */ |
| |
| return XIo_In32(InstancePtr->RegBaseAddress + XDC_DMAC_REG_OFFSET); |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_SetControl |
| * |
| * DESCRIPTION: |
| * |
| * This function sets the control register of the specified DMA channel. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * Control contains the value to be written to the control register of the DMA |
| * channel. One or more of the following values may be contained the register. |
| * Each of the values are unique bit masks such that they may be ORed together |
| * to enable multiple bits or inverted and ANDed to disable multiple bits. |
| * |
| * XDC_DMACR_SOURCE_INCR_MASK Increment the source address |
| * XDC_DMACR_DEST_INCR_MASK Increment the destination address |
| * XDC_DMACR_SOURCE_LOCAL_MASK Local source address |
| * XDC_DMACR_DEST_LOCAL_MASK Local destination address |
| * XDC_DMACR_SG_ENABLE_MASK Scatter gather enable |
| * XDC_DMACR_GEN_BD_INTR_MASK Individual buffer descriptor interrupt |
| * XDC_DMACR_LAST_BD_MASK Last buffer descriptor in a packet |
| * |
| * RETURN VALUE: |
| * |
| * None. |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| void |
| XDmaChannel_SetControl(XDmaChannel * InstancePtr, u32 Control) |
| { |
| /* assert to verify input arguments except the control which can't be |
| * asserted since all values are valid |
| */ |
| XASSERT_VOID(InstancePtr != NULL); |
| XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* set the DMA control register to the specified value */ |
| |
| XIo_Out32(InstancePtr->RegBaseAddress + XDC_DMAC_REG_OFFSET, Control); |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_GetStatus |
| * |
| * DESCRIPTION: |
| * |
| * This function gets the status register contents of the DMA channel. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * RETURN VALUE: |
| * |
| * The status register contents of the DMA channel. One or more of the |
| * following values may be contained the register. Each of the values are |
| * unique bit masks. |
| * |
| * XDC_DMASR_BUSY_MASK The DMA channel is busy |
| * XDC_DMASR_BUS_ERROR_MASK A bus error occurred |
| * XDC_DMASR_BUS_TIMEOUT_MASK A bus timeout occurred |
| * XDC_DMASR_LAST_BD_MASK The last buffer descriptor of a packet |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| u32 |
| XDmaChannel_GetStatus(XDmaChannel * InstancePtr) |
| { |
| /* assert to verify input arguments */ |
| |
| XASSERT_NONVOID(InstancePtr != NULL); |
| XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* return the contents of the DMA status register */ |
| |
| return XIo_In32(InstancePtr->RegBaseAddress + XDC_DMAS_REG_OFFSET); |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_SetIntrStatus |
| * |
| * DESCRIPTION: |
| * |
| * This function sets the interrupt status register of the specified DMA channel. |
| * Setting any bit of the interrupt status register will clear the bit to |
| * indicate the interrupt processing has been completed. The definitions of each |
| * bit in the register match the definition of the bits in the interrupt enable |
| * register. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * Status contains the value to be written to the status register of the DMA |
| * channel. One or more of the following values may be contained the register. |
| * Each of the values are unique bit masks such that they may be ORed together |
| * to enable multiple bits or inverted and ANDed to disable multiple bits. |
| * |
| * XDC_IXR_DMA_DONE_MASK The dma operation is done |
| * XDC_IXR_DMA_ERROR_MASK The dma operation had an error |
| * XDC_IXR_PKT_DONE_MASK A packet is complete |
| * XDC_IXR_PKT_THRESHOLD_MASK The packet count threshold reached |
| * XDC_IXR_PKT_WAIT_BOUND_MASK The packet wait bound reached |
| * XDC_IXR_SG_DISABLE_ACK_MASK The scatter gather disable completed |
| * XDC_IXR_BD_MASK A buffer descriptor is done |
| * |
| * RETURN VALUE: |
| * |
| * None. |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| void |
| XDmaChannel_SetIntrStatus(XDmaChannel * InstancePtr, u32 Status) |
| { |
| /* assert to verify input arguments except the status which can't be |
| * asserted since all values are valid |
| */ |
| XASSERT_VOID(InstancePtr != NULL); |
| XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* set the interrupt status register with the specified value such that |
| * all bits which are set in the register are cleared effectively clearing |
| * any active interrupts |
| */ |
| XIo_Out32(InstancePtr->RegBaseAddress + XDC_IS_REG_OFFSET, Status); |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_GetIntrStatus |
| * |
| * DESCRIPTION: |
| * |
| * This function gets the interrupt status register of the specified DMA channel. |
| * The interrupt status register indicates which interrupts are active |
| * for the DMA channel. If an interrupt is active, the status register must be |
| * set (written) with the bit set for each interrupt which has been processed |
| * in order to clear the interrupts. The definitions of each bit in the register |
| * match the definition of the bits in the interrupt enable register. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * RETURN VALUE: |
| * |
| * The interrupt status register contents of the specified DMA channel. |
| * One or more of the following values may be contained the register. |
| * Each of the values are unique bit masks. |
| * |
| * XDC_IXR_DMA_DONE_MASK The dma operation is done |
| * XDC_IXR_DMA_ERROR_MASK The dma operation had an error |
| * XDC_IXR_PKT_DONE_MASK A packet is complete |
| * XDC_IXR_PKT_THRESHOLD_MASK The packet count threshold reached |
| * XDC_IXR_PKT_WAIT_BOUND_MASK The packet wait bound reached |
| * XDC_IXR_SG_DISABLE_ACK_MASK The scatter gather disable completed |
| * XDC_IXR_SG_END_MASK Current descriptor was the end of the list |
| * XDC_IXR_BD_MASK A buffer descriptor is done |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| u32 |
| XDmaChannel_GetIntrStatus(XDmaChannel * InstancePtr) |
| { |
| /* assert to verify input arguments */ |
| |
| XASSERT_NONVOID(InstancePtr != NULL); |
| XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* return the contents of the interrupt status register */ |
| |
| return XIo_In32(InstancePtr->RegBaseAddress + XDC_IS_REG_OFFSET); |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_SetIntrEnable |
| * |
| * DESCRIPTION: |
| * |
| * This function sets the interrupt enable register of the specified DMA |
| * channel. The interrupt enable register contains bits which enable |
| * individual interrupts for the DMA channel. The definitions of each bit |
| * in the register match the definition of the bits in the interrupt status |
| * register. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * Enable contains the interrupt enable register contents to be written |
| * in the DMA channel. One or more of the following values may be contained |
| * the register. Each of the values are unique bit masks such that they may be |
| * ORed together to enable multiple bits or inverted and ANDed to disable |
| * multiple bits. |
| * |
| * XDC_IXR_DMA_DONE_MASK The dma operation is done |
| * XDC_IXR_DMA_ERROR_MASK The dma operation had an error |
| * XDC_IXR_PKT_DONE_MASK A packet is complete |
| * XDC_IXR_PKT_THRESHOLD_MASK The packet count threshold reached |
| * XDC_IXR_PKT_WAIT_BOUND_MASK The packet wait bound reached |
| * XDC_IXR_SG_DISABLE_ACK_MASK The scatter gather disable completed |
| * XDC_IXR_SG_END_MASK Current descriptor was the end of the list |
| * XDC_IXR_BD_MASK A buffer descriptor is done |
| * |
| * RETURN VALUE: |
| * |
| * None. |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| void |
| XDmaChannel_SetIntrEnable(XDmaChannel * InstancePtr, u32 Enable) |
| { |
| /* assert to verify input arguments except the enable which can't be |
| * asserted since all values are valid |
| */ |
| XASSERT_VOID(InstancePtr != NULL); |
| XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* set the interrupt enable register to the specified value */ |
| |
| XIo_Out32(InstancePtr->RegBaseAddress + XDC_IE_REG_OFFSET, Enable); |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_GetIntrEnable |
| * |
| * DESCRIPTION: |
| * |
| * This function gets the interrupt enable of the DMA channel. The |
| * interrupt enable contains flags which enable individual interrupts for the |
| * DMA channel. The definitions of each bit in the register match the definition |
| * of the bits in the interrupt status register. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * RETURN VALUE: |
| * |
| * The interrupt enable of the DMA channel. One or more of the following values |
| * may be contained the register. Each of the values are unique bit masks. |
| * |
| * XDC_IXR_DMA_DONE_MASK The dma operation is done |
| * XDC_IXR_DMA_ERROR_MASK The dma operation had an error |
| * XDC_IXR_PKT_DONE_MASK A packet is complete |
| * XDC_IXR_PKT_THRESHOLD_MASK The packet count threshold reached |
| * XDC_IXR_PKT_WAIT_BOUND_MASK The packet wait bound reached |
| * XDC_IXR_SG_DISABLE_ACK_MASK The scatter gather disable completed |
| * XDC_IXR_BD_MASK A buffer descriptor is done |
| * |
| * NOTES: |
| * |
| * None. |
| * |
| ******************************************************************************/ |
| u32 |
| XDmaChannel_GetIntrEnable(XDmaChannel * InstancePtr) |
| { |
| /* assert to verify input arguments */ |
| |
| XASSERT_NONVOID(InstancePtr != NULL); |
| XASSERT_NONVOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* return the contents of the interrupt enable register */ |
| |
| return XIo_In32(InstancePtr->RegBaseAddress + XDC_IE_REG_OFFSET); |
| } |
| |
| /****************************************************************************** |
| * |
| * FUNCTION: |
| * |
| * XDmaChannel_Transfer |
| * |
| * DESCRIPTION: |
| * |
| * This function starts the DMA channel transferring data from a memory source |
| * to a memory destination. This function only starts the operation and returns |
| * before the operation may be complete. If the interrupt is enabled, an |
| * interrupt will be generated when the operation is complete, otherwise it is |
| * necessary to poll the channel status to determine when it's complete. It is |
| * the responsibility of the caller to determine when the operation is complete |
| * by handling the generated interrupt or polling the status. It is also the |
| * responsibility of the caller to ensure that the DMA channel is not busy with |
| * another transfer before calling this function. |
| * |
| * ARGUMENTS: |
| * |
| * InstancePtr contains a pointer to the DMA channel to operate on. |
| * |
| * SourcePtr contains a pointer to the source memory where the data is to |
| * be tranferred from and must be 32 bit aligned. |
| * |
| * DestinationPtr contains a pointer to the destination memory where the data |
| * is to be transferred and must be 32 bit aligned. |
| * |
| * ByteCount contains the number of bytes to transfer during the DMA operation. |
| * |
| * RETURN VALUE: |
| * |
| * None. |
| * |
| * NOTES: |
| * |
| * The DMA h/w will not currently allow a non-local memory transfer to non-local |
| * memory (memory copy), but only allows a non-local memory to or from the device |
| * memory (typically a FIFO). |
| * |
| * It is the responsibility of the caller to ensure that the cache is |
| * flushed and invalidated both before and after the DMA operation completes |
| * if the memory pointed to is cached. The caller must also ensure that the |
| * pointers contain a physical address rather than a virtual address |
| * if address translation is being used. |
| * |
| ******************************************************************************/ |
| void |
| XDmaChannel_Transfer(XDmaChannel * InstancePtr, |
| u32 * SourcePtr, u32 * DestinationPtr, u32 ByteCount) |
| { |
| /* assert to verify input arguments and the alignment of any arguments |
| * which have expected alignments |
| */ |
| XASSERT_VOID(InstancePtr != NULL); |
| XASSERT_VOID(SourcePtr != NULL); |
| XASSERT_VOID(((u32) SourcePtr & 3) == 0); |
| XASSERT_VOID(DestinationPtr != NULL); |
| XASSERT_VOID(((u32) DestinationPtr & 3) == 0); |
| XASSERT_VOID(ByteCount != 0); |
| XASSERT_VOID(InstancePtr->IsReady == XCOMPONENT_IS_READY); |
| |
| /* setup the source and destination address registers for the transfer */ |
| |
| XIo_Out32(InstancePtr->RegBaseAddress + XDC_SA_REG_OFFSET, |
| (u32) SourcePtr); |
| |
| XIo_Out32(InstancePtr->RegBaseAddress + XDC_DA_REG_OFFSET, |
| (u32) DestinationPtr); |
| |
| /* start the DMA transfer to copy from the source buffer to the |
| * destination buffer by writing the length to the length register |
| */ |
| XIo_Out32(InstancePtr->RegBaseAddress + XDC_LEN_REG_OFFSET, ByteCount); |
| } |