xmclib/XMCLib/inc/xmc_dma.h
2024-10-17 17:09:59 +02:00

1269 lines
48 KiB
C

/**
* @file xmc_dma.h
* @date 2016-10-28
*
* @cond
*********************************************************************************************************************
* XMClib v2.1.16 - XMC Peripheral Driver Library
*
* Copyright (c) 2015-2017, Infineon Technologies AG
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,are permitted provided that the
* following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
*
* Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* To improve the quality of the software, users are encouraged to share modifications, enhancements or bug fixes with
* Infineon Technologies AG dave@infineon.com).
*********************************************************************************************************************
*
* Change History
* --------------
*
* 2015-02-20:
* - Initial <br>
*
* 2015-06-20:
* - Add the declarations for the following APIs: <br>
* XMC_DMA_DisableRequestLine, XMC_DMA_ClearRequestLine, <br>
* XMC_DMA_CH_ClearSourcePeripheralRequest, <br>
* XMC_DMA_CH_ClearDestinationPeripheralRequest <br>
* - Documentation updates <br>
* - Removed version macros and declaration of GetDriverVersion API <br>
*
* 2016-10-28:
* - Fix documentation on maximum block size
*
* @endcond
*/
#ifndef XMC_DMA_H
#define XMC_DMA_H
/*******************************************************************************
* HEADER FILES
*******************************************************************************/
#include "xmc_common.h"
#if defined (GPDMA0)
#include "xmc_dma_map.h"
/**
* @addtogroup XMClib XMC Peripheral Library
* @{
*/
/**
* @addtogroup DMA
* @brief General purpose DMA (GPDMA) driver for the XMC4000 microcontroller family
*
* The GPDMA is a highly configurable DMA controller that allows high-speed data transfers
* between peripherals and memories. Complex data transfers can be done with minimal
* intervention of the processor, making CPU available for other operations.
*
* GPDMA provides extensive support for XMC microcontroller peripherals like A/D, D/A
* converters and timers. Data transfers through communication interfaces (USIC) using the
* GPDMA increase efficiency and parallelism for real-time applications.
*
* The DMA low level driver provides functions to configure and initialize the GPDMA
* hardware peripheral.
* @{
*/
/*******************************************************************************
* MACROS
*******************************************************************************/
#if defined (GPDMA0)
#define XMC_DMA0 ((XMC_DMA_t *)GPDMA0_CH0_BASE) /**< DMA module 0 */
#define XMC_DMA0_NUM_CHANNELS 8
#endif
#if defined (GPDMA1)
#define XMC_DMA1 ((XMC_DMA_t *)GPDMA1_CH0_BASE) /**< DMA module 1, only available in XMC45xx series */
#define XMC_DMA1_NUM_CHANNELS 4
#endif
/*******************************************************************************
* ENUMS
*******************************************************************************/
/**
* DMA transfer types
*/
typedef enum XMC_DMA_CH_TRANSFER_TYPE
{
XMC_DMA_CH_TRANSFER_TYPE_SINGLE_BLOCK, /**< Single block */
XMC_DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_CONTIGUOUS_DSTADR_RELOAD, /**< Multi-block: src address contiguous, dst address reload */
XMC_DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_CONTIGUOUS, /**< Multi-block: src address reload, dst address contiguous */
XMC_DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_RELOAD, /**< Multi-block: src address reload, dst address reload */
XMC_DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_CONTIGUOUS_DSTADR_LINKED, /**< Multi-block: src address contiguous, dst address linked */
XMC_DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_RELOAD_DSTADR_LINKED, /**< Multi-block: src address reload, dst address linked */
XMC_DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_CONTIGUOUS, /**< Multi-block: src address linked, dst address contiguous */
XMC_DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_RELOAD, /**< Multi-block: src address linked, dst address reload */
XMC_DMA_CH_TRANSFER_TYPE_MULTI_BLOCK_SRCADR_LINKED_DSTADR_LINKED /**< Multi-block: src address linked, dst address linked */
} XMC_DMA_CH_TRANSFER_TYPE_t;
/**
* DMA transfer flow modes
*/
typedef enum XMC_DMA_CH_TRANSFER_FLOW
{
XMC_DMA_CH_TRANSFER_FLOW_M2M_DMA = 0x0UL, /**< Memory to memory (DMA flow controller) */
XMC_DMA_CH_TRANSFER_FLOW_M2P_DMA = 0x1UL, /**< Memory to peripheral (DMA flow controller) */
XMC_DMA_CH_TRANSFER_FLOW_P2M_DMA = 0x2UL, /**< Peripheral to memory (DMA flow controller) */
XMC_DMA_CH_TRANSFER_FLOW_P2P_DMA = 0x3UL, /**< Peripheral to peripheral (DMA flow controller) */
XMC_DMA_CH_TRANSFER_FLOW_P2M_PER = 0x4UL, /**< Peripheral to memory (Peripheral flow controller) */
XMC_DMA_CH_TRANSFER_FLOW_P2P_SRCPER = 0x5UL, /**< Peripheral to peripheral (Source peripheral flow controller) */
XMC_DMA_CH_TRANSFER_FLOW_M2P_PER = 0x6UL, /**< Memory to peripheral (Peripheral flow controller) */
XMC_DMA_CH_TRANSFER_FLOW_P2P_DSTPER = 0x7UL /**< Peripheral to peripheral (Destination peripheral flow controller) */
} XMC_DMA_CH_TRANSFER_FLOW_t;
/**
* Valid burst length values
*/
typedef enum XMC_DMA_CH_BURST_LENGTH
{
XMC_DMA_CH_BURST_LENGTH_1 = 0x0UL, /**< Burst length: 1 word */
XMC_DMA_CH_BURST_LENGTH_4 = 0x1UL, /**< Burst length: 4 words */
XMC_DMA_CH_BURST_LENGTH_8 = 0x2UL /**< Burst length: 8 words */
} XMC_DMA_CH_BURST_LENGTH_t;
/**
* Valid transfer width values
*/
typedef enum XMC_DMA_CH_TRANSFER_WIDTH
{
XMC_DMA_CH_TRANSFER_WIDTH_8 = 0x0UL, /**< 8-bit transfer width */
XMC_DMA_CH_TRANSFER_WIDTH_16 = 0x1UL, /**< 16-bit transfer width */
XMC_DMA_CH_TRANSFER_WIDTH_32 = 0x2UL /**< 32-bit transfer width */
} XMC_DMA_CH_TRANSFER_WIDTH_t;
/**
* DMA address count mode
*/
typedef enum XMC_DMA_CH_ADDRESS_COUNT_MODE
{
XMC_DMA_CH_ADDRESS_COUNT_MODE_INCREMENT = 0x0UL, /**< Address count mode: increment */
XMC_DMA_CH_ADDRESS_COUNT_MODE_DECREMENT = 0x1UL, /**< Address count mode: decrement */
XMC_DMA_CH_ADDRESS_COUNT_MODE_NO_CHANGE = 0x2UL /**< Address count mode: no change */
} XMC_DMA_CH_ADDRESS_COUNT_MODE_t;
/**
* DMA channel priorities
*/
typedef enum XMC_DMA_CH_PRIORITY
{
XMC_DMA_CH_PRIORITY_0 = 0x0UL << GPDMA0_CH_CFGL_CH_PRIOR_Pos, /**< DMA channel priority 0 (low) */
XMC_DMA_CH_PRIORITY_1 = 0x1UL << GPDMA0_CH_CFGL_CH_PRIOR_Pos, /**< DMA channel priority 1 */
XMC_DMA_CH_PRIORITY_2 = 0x2UL << GPDMA0_CH_CFGL_CH_PRIOR_Pos, /**< DMA channel priority 2 */
XMC_DMA_CH_PRIORITY_3 = 0x3UL << GPDMA0_CH_CFGL_CH_PRIOR_Pos, /**< DMA channel priority 3 */
XMC_DMA_CH_PRIORITY_4 = 0x4UL << GPDMA0_CH_CFGL_CH_PRIOR_Pos, /**< DMA channel priority 4 */
XMC_DMA_CH_PRIORITY_5 = 0x5UL << GPDMA0_CH_CFGL_CH_PRIOR_Pos, /**< DMA channel priority 5 */
XMC_DMA_CH_PRIORITY_6 = 0x6UL << GPDMA0_CH_CFGL_CH_PRIOR_Pos, /**< DMA channel priority 6 */
XMC_DMA_CH_PRIORITY_7 = 0x7UL << GPDMA0_CH_CFGL_CH_PRIOR_Pos /**< DMA channel priority 7 (high) */
} XMC_DMA_CH_PRIORITY_t;
/**
* Source handshake interface
*/
typedef enum XMC_DMA_CH_SRC_HANDSHAKING
{
XMC_DMA_CH_SRC_HANDSHAKING_HARDWARE = 0x0UL << GPDMA0_CH_CFGL_HS_SEL_SRC_Pos, /**< Source: hardware handshake */
XMC_DMA_CH_SRC_HANDSHAKING_SOFTWARE = 0x1UL << GPDMA0_CH_CFGL_HS_SEL_SRC_Pos /**< Source: software handshake */
} XMC_DMA_CH_SRC_HANDSHAKING_t;
/**
* Destination handshake interface
*/
typedef enum XMC_DMA_CH_DST_HANDSHAKING
{
XMC_DMA_CH_DST_HANDSHAKING_HARDWARE = 0x0UL << GPDMA0_CH_CFGL_HS_SEL_DST_Pos, /**< Destination: hardware handshake */
XMC_DMA_CH_DST_HANDSHAKING_SOFTWARE = 0x1UL << GPDMA0_CH_CFGL_HS_SEL_DST_Pos /**< Destination: software handshake */
} XMC_DMA_CH_DST_HANDSHAKING_t;
/**
* DMA hardware handshaking interface
* Hardware handshaking available only if DMA is flow controller
*/
typedef enum XMC_DMA_CH_HARDWARE_HANDSHAKING_IF
{
XMC_DMA_CH_HARDWARE_HANDSHAKING_IF_0 = 0x0UL, /**< Hardware handshaking interface 0 */
XMC_DMA_CH_HARDWARE_HANDSHAKING_IF_1 = 0x1UL, /**< Hardware handshaking interface 1 */
XMC_DMA_CH_HARDWARE_HANDSHAKING_IF_2 = 0x2UL, /**< Hardware handshaking interface 2 */
XMC_DMA_CH_HARDWARE_HANDSHAKING_IF_3 = 0x3UL, /**< Hardware handshaking interface 3 */
XMC_DMA_CH_HARDWARE_HANDSHAKING_IF_4 = 0x4UL, /**< Hardware handshaking interface 4 */
XMC_DMA_CH_HARDWARE_HANDSHAKING_IF_5 = 0x5UL, /**< Hardware handshaking interface 5 */
XMC_DMA_CH_HARDWARE_HANDSHAKING_IF_6 = 0x6UL, /**< Hardware handshaking interface 6 */
XMC_DMA_CH_HARDWARE_HANDSHAKING_IF_7 = 0x7UL /**< Hardware handshaking interface 7 */
} XMC_DMA_CH_HARDWARE_HANDSHAKING_IF_t;
/**
* DMA events
*/
typedef enum XMC_DMA_CH_EVENT
{
XMC_DMA_CH_EVENT_TRANSFER_COMPLETE = 0x1UL, /**< Transfer complete event */
XMC_DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE = 0x2UL, /**< Block transfer complete event */
XMC_DMA_CH_EVENT_SRC_TRANSACTION_COMPLETE = 0x4UL, /**< Source transaction complete event */
XMC_DMA_CH_EVENT_DST_TRANSACTION_COMPLETE = 0x8UL, /**< Destination transaction complete event */
XMC_DMA_CH_EVENT_ERROR = 0x10UL /**< DMA error event */
} XMC_DMA_CH_EVENT_t;
/**
* Transaction types
*/
typedef enum XMC_DMA_CH_TRANSACTION_TYPE
{
XMC_DMA_CH_TRANSACTION_TYPE_SINGLE, /**< Single DMA transaction */
XMC_DMA_CH_TRANSACTION_TYPE_BURST /**< Burst transaction */
} XMC_DMA_CH_TRANSACTION_TYPE_t;
/**
* DMA channel status values
*/
typedef enum XMC_DMA_CH_STATUS
{
XMC_DMA_CH_STATUS_OK, /**< DMA status OK */
XMC_DMA_CH_STATUS_ERROR, /**< DMA status error */
XMC_DMA_CH_STATUS_BUSY /**< DMA is busy */
} XMC_DMA_CH_STATUS_t;
/*******************************************************************************
* DATA STRUCTURES
*******************************************************************************/
/**
* DMA channel configuration structure <br>
*
* The structure represents a collection of all hardware registers used
* to configure the DMA channel. It is contained within the ::XMC_DMA_t
* structure. It's registers can be used to configure DMA transfer details
* like source address, destination address, block size, incrementation
* modes and the like.
*/
typedef struct {
__IO uint32_t SAR;
__I uint32_t RESERVED0;
__IO uint32_t DAR;
__I uint32_t RESERVED1;
__IO uint32_t LLP;
__I uint32_t RESERVED2;
__IO uint32_t CTLL;
__IO uint32_t CTLH;
__IO uint32_t SSTAT;
__I uint32_t RESERVED3;
__IO uint32_t DSTAT;
__I uint32_t RESERVED4;
__IO uint32_t SSTATAR;
__I uint32_t RESERVED5;
__IO uint32_t DSTATAR;
__I uint32_t RESERVED6;
__IO uint32_t CFGL;
__IO uint32_t CFGH;
__IO uint32_t SGR;
__I uint32_t RESERVED7;
__IO uint32_t DSR;
__I uint32_t RESERVED8;
} GPDMA_CH_t;
/**
* DMA device structure <br>
*
* The structure represents a collection of all hardware registers used
* to configure the GPDMA peripheral on the XMC4000 series of microcontrollers.
* The registers can be accessed with ::XMC_DMA0 and ::XMC_DMA1.
*/
typedef struct {
GPDMA_CH_t CH[8];
__IO uint32_t RAWCHEV[10];
__I uint32_t STATUSCHEV[10];
__IO uint32_t MASKCHEV[10];
__O uint32_t CLEARCHEV[10];
__I uint32_t STATUSGLEV;
__I uint32_t RESERVED20;
__IO uint32_t REQSRCREG;
__I uint32_t RESERVED21;
__IO uint32_t REQDSTREG;
__I uint32_t RESERVED22;
__IO uint32_t SGLREQSRCREG;
__I uint32_t RESERVED23;
__IO uint32_t SGLREQDSTREG;
__I uint32_t RESERVED24;
__IO uint32_t LSTSRCREG;
__I uint32_t RESERVED25;
__IO uint32_t LSTDSTREG;
__I uint32_t RESERVED26;
__IO uint32_t DMACFGREG;
__I uint32_t RESERVED27;
__IO uint32_t CHENREG;
__I uint32_t RESERVED28;
__I uint32_t ID;
__I uint32_t RESERVED29[19];
__I uint32_t TYPE;
__I uint32_t VERSION;
} XMC_DMA_t;
/* Anonymous structure/union guard start */
#if defined (__CC_ARM)
#pragma push
#pragma anon_unions
#elif defined (__TASKING__)
#pragma warning 586
#endif
/**
* DMA channel linked list item.
* Note: Needs to be word aligned
*/
typedef struct XMC_DMA_LLI
{
uint32_t src_addr; /**< Source address */
uint32_t dst_addr; /**< Destination address */
struct XMC_DMA_LLI *llp; /**< Linked list pointer of type XMC_DMA_LLI_t */
union
{
struct
{
uint32_t enable_interrupt: 1; /**< Enable interrupts? */
uint32_t dst_transfer_width: 3; /**< Destination transfer width */
uint32_t src_transfer_width: 3; /**< Source transfer width */
uint32_t dst_address_count_mode: 2; /**< Destination address count mode */
uint32_t src_address_count_mode: 2; /**< Source address count mode */
uint32_t dst_burst_length: 3; /**< Destination burst length */
uint32_t src_burst_length: 3; /**< Source burst length */
uint32_t enable_src_gather: 1; /**< Enable source gather? */
uint32_t enable_dst_scatter: 1; /**< Enable destination scatter? */
uint32_t : 1; /**< Reserved bits */
uint32_t transfer_flow: 3; /**< DMA transfer flow */
uint32_t : 4; /**< Reserved bits */
uint32_t enable_dst_linked_list: 1; /**< Enable destination linked list? */
uint32_t enable_src_linked_list: 1; /**< Enable source linked list? */
uint32_t : 3; /**< Reserved bits */
};
uint32_t control;
};
uint32_t block_size; /**< Transfer block size */
uint32_t src_status; /**< Source status */
uint32_t dst_status; /**< Destination status */
} XMC_DMA_LLI_t;
typedef XMC_DMA_LLI_t **XMC_DMA_LIST_t; /**< Type definition for a linked list pointer */
/**
* DMA channel configuration structure
*/
typedef struct XMC_DMA_CH_CONFIG
{
union
{
uint32_t control;
struct
{
uint32_t enable_interrupt: 1; /**< Enable interrupts? */
uint32_t dst_transfer_width: 3; /**< Destination transfer width */
uint32_t src_transfer_width: 3; /**< Source transfer width */
uint32_t dst_address_count_mode: 2; /**< Destination address count mode */
uint32_t src_address_count_mode: 2; /**< Source address count mode */
uint32_t dst_burst_length: 3; /**< Destination burst length */
uint32_t src_burst_length: 3; /**< Source burst length */
uint32_t enable_src_gather: 1; /**< Enable source gather? */
uint32_t enable_dst_scatter: 1; /**< Enable destination scatter? */
uint32_t : 1;
uint32_t transfer_flow: 3; /**< DMA transfer flow */
uint32_t : 9;
};
};
uint32_t src_addr; /**< Source address */
uint32_t dst_addr; /**< Destination address */
XMC_DMA_LLI_t *linked_list_pointer; /**< Linked list pointer */
union
{
uint32_t src_gather_control;
struct
{
uint32_t src_gather_interval: 20; /**< Source gather interval */
uint32_t src_gather_count: 12; /**< Source gather count */
};
};
union
{
uint32_t dst_scatter_control;
struct
{
uint32_t dst_scatter_interval: 20; /**< Destination scatter interval */
uint32_t dst_scatter_count: 12; /**< Destination scatter count */
};
};
uint16_t block_size; /**< Block size for DMA controlled transfers [max. 4095]*/
XMC_DMA_CH_TRANSFER_TYPE_t transfer_type; /**< DMA transfer type */
XMC_DMA_CH_PRIORITY_t priority; /**< DMA channel priority */
XMC_DMA_CH_SRC_HANDSHAKING_t src_handshaking; /**< DMA source handshaking interface */
uint8_t src_peripheral_request; /**< Source peripheral request */
XMC_DMA_CH_DST_HANDSHAKING_t dst_handshaking; /**< DMA destination handshaking interface */
uint8_t dst_peripheral_request; /**< Destination peripheral request */
} XMC_DMA_CH_CONFIG_t;
/* Anonymous structure/union guard end */
#if defined (__CC_ARM)
#pragma pop
#elif defined (__TASKING__)
#pragma warning restore
#endif
/**
* DMA channel event handler
*/
typedef void (*XMC_DMA_CH_EVENT_HANDLER_t)(XMC_DMA_CH_EVENT_t event);
/*******************************************************************************
* API PROTOTYPES
*******************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return None
*
* \par<b>Description: </b><br>
* Initialize the GPDMA peripheral <br>
*
* \par
* The function initializes a prioritized list of DMA channels and enables the GPDMA
* peripheral.
*/
void XMC_DMA_Init(XMC_DMA_t *const dma);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return None
*
* \par<b>Description: </b><br>
* Enable the GPDMA peripheral <br>
*
* \par
* The function de-asserts the GPDMA peripheral reset. In addition, it un-gates the
* GPDMA0 peripheral clock for all XMC4000 series of microcontrollers with an exception
* of the XMC4500 microcontroller. The XMC4500 doesn't support gating.
*/
void XMC_DMA_Enable(XMC_DMA_t *const dma);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return None
*
* \par<b>Description: </b><br>
* Disable the GPDMA peripheral <br>
*
* \par
* The function asserts the GPDMA peripheral reset. In addition, it gates the GPDMA0
* peripheral clock for all XMC4000 series of microcontrollers with an exception of
* the XMC4500 microcontroller. The XMC4500 doesn't support gating.
*/
void XMC_DMA_Disable(XMC_DMA_t *const dma);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return bool
*
* \par<b>Description: </b><br>
* Check if the GPDMA peripheral is enabled <br>
*
* \par
* For the XMC4500 microcontroller, the function checks if the GPDMA module is asserted
* and returns "false" if it is. In addition, it also checks if the clock is gated
* for the other XMC4000 series of microcontrollers. It returns "true" if the peripheral
* is enabled.
*/
bool XMC_DMA_IsEnabled(const XMC_DMA_t *const dma);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return uint32_t DMA event status
*
* \par<b>Description: </b><br>
* Get DMA event status <br>
*
* \par
* The function returns the collective (global) status of GPDMA events. The following
* lists the various DMA events and their corresponding enumeration. The return value
* of this function may then be masked with any one of the following enumerations to
* obtain the status of individual DMA events. <br>
*
* \par
* Transfer complete -> ::XMC_DMA_CH_EVENT_TRANSFER_COMPLETE <br>
* Block transfer complete -> ::XMC_DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE <br>
* Source transaction complete -> ::XMC_DMA_CH_EVENT_SRC_TRANSACTION_COMPLETE <br>
* Destination transaction complete -> ::XMC_DMA_CH_EVENT_DST_TRANSACTION_COMPLETE <br>
* DMA error event -> ::XMC_DMA_CH_EVENT_ERROR <br>
*/
__STATIC_INLINE uint32_t XMC_DMA_GetEventStatus(XMC_DMA_t *const dma)
{
return (dma->STATUSGLEV);
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return uint32_t DMA transfer complete status
*
* \par<b>Description: </b><br>
* Get transfer complete status <br>
*
* \par
* The function returns GPDMA transfer complete interrupt status. <br>
*/
__STATIC_INLINE uint32_t XMC_DMA_GetChannelsTransferCompleteStatus(XMC_DMA_t *const dma)
{
return (dma->STATUSCHEV[0]);
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return uint32_t DMA block complete status
*
* \par<b>Description: </b><br>
* Get block transfer complete status <br>
*
* \par
* The function returns GPDMA block transfer complete interrupt status. <br>
*/
__STATIC_INLINE uint32_t XMC_DMA_GetChannelsBlockCompleteStatus(XMC_DMA_t *const dma)
{
return (dma->STATUSCHEV[2]);
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return uint32_t DMA event status
*
* \par<b>Description: </b><br>
* Get source transaction complete status <br>
*
* \par
* The function returns the source transaction complete interrupt status. <br>
*
* \par<b>Note: </b><br>
* If the source peripheral is memory, the source transaction complete interrupt is
* ignored.
*/
__STATIC_INLINE uint32_t XMC_DMA_GetChannelsSourceTransactionCompleteStatus(XMC_DMA_t *const dma)
{
return (dma->STATUSCHEV[4]);
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return uint32_t DMA event status
*
* \par<b>Description: </b><br>
* Get destination transaction complete status <br>
*
* \par
* The function returns the destination transaction complete interrupt status <br>
*
* \par<b>Note: </b><br>
* If the destination peripheral is memory, the destination transaction complete
* interrupt is ignored.
*/
__STATIC_INLINE uint32_t XMC_DMA_GetChannelsDestinationTransactionCompleteStatus(XMC_DMA_t *const dma)
{
return (dma->STATUSCHEV[6]);
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return uint32_t DMA error event status
*
* \par<b>Description: </b><br>
* Get DMA error event status <br>
*
* \par
* The function returns error interrupt status. <br>
*/
__STATIC_INLINE uint32_t XMC_DMA_GetChannelsErrorStatus(XMC_DMA_t *const dma)
{
return (dma->STATUSCHEV[8]);
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param line Which DLR (DMA line router) line should the function use?
* @param peripheral Which hardware peripheral is the GPDMA communicating with?
* @return None
*
* \par<b>Description: </b><br>
* Enable request line <br>
*
* \par
* The function enables a DLR (DMA line router) line and selects a service request
* source, resulting in the trigger of a DMA transfer. <br>
*
* \par<b>Note: </b><br>
* The DLR is used for a DMA transfer typically involving a peripheral; For example,
* the ADC peripheral may use the DLR in hardware handshaking mode to transfer
* ADC conversion values to a destination memory block.
*/
void XMC_DMA_EnableRequestLine(XMC_DMA_t *const dma, uint8_t line, uint8_t peripheral);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param line Which DLR (DMA line router) line should the function use?
* @return None
*
* \par<b>Description: </b><br>
* Disable request line <br>
*
* \par
* The function disables a DLR (DMA line router) line by clearing appropriate bits
* in the LNEN register. <br>
*/
void XMC_DMA_DisableRequestLine(XMC_DMA_t *const dma, uint8_t line);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param line Which DLR (DMA line router) line should the function use?
* @return None
*
* \par<b>Description: </b><br>
* Clear request line <br>
*
* \par
* The function clears a DLR (DMA line router) request line. <br>
*/
void XMC_DMA_ClearRequestLine(XMC_DMA_t *const dma, uint8_t line);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param line The line for which the overrun status is requested
* @return bool "true" if overrun occured, "false" otherwise
*
* \par<b>Description: </b><br>
* Get overrun status of a DLR line <br>
*
* \par
* The DLR module's OVERSTAT register keeps track of DMA service request overruns.
* Should an overrun occur, the bit corresponding to the used DLR line is set. The
* function simply reads this status and returns "true" if an overrun is detected
* It returns "false" if an overrun isn't registered.
*/
bool XMC_DMA_GetOverrunStatus(XMC_DMA_t *const dma, const uint8_t line);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param line The line for which the overrun status must be cleared
* @return None
*
* \par<b>Description: </b><br>
* Clear overrun status of a DLR line <br>
*
* \par
* The function clears the overrun status of a line by setting the corresponding
* line bit in the DLR's OVERCLR register.
*/
void XMC_DMA_ClearOverrunStatus(XMC_DMA_t *const dma, const uint8_t line);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The GPDMA channel (number) which needs to be initialized
* @param config A constant pointer to ::XMC_DMA_CH_CONFIG_t, pointing to a const
* channel configuration
* @return XMC_DMA_CH_STATUS_t Initialization status
*
* \par<b>Description: </b><br>
* Initialize a GPDMA channel with provided channel configuration <br>
*
* \par
* The function sets up the following channel configuration parameters for a GPDMA
* channel (specified by the parameter channel): <br>
* 1) Source and destination addresses (and linked list address if requested) <br>
* 2) Source and destination handshaking interface (hardware or software?) <br>
* 3) Scatter/gather configuration <br>
* 4) Source and destination peripheral request (DMA is the flow controller) <br>
* 5) Transfer flow and type <br>
*
* \par
* The function returns one of the following values: <br>
* 1) In case the DMA channel is not enabled: ::XMC_DMA_CH_STATUS_BUSY <br>
* 2) If the GPDMA module itself is not enabled: ::XMC_DMA_CH_STATUS_ERROR <br>
* 3) If the configuration was successful: ::XMC_DMA_CH_STATUS_OK <br>
*
* \par
* Once the initialization is successful, calling ::XMC_DMA_CH_Enable() will trigger
* a GPDMA transfer.
*/
XMC_DMA_CH_STATUS_t XMC_DMA_CH_Init(XMC_DMA_t *const dma, const uint8_t channel, const XMC_DMA_CH_CONFIG_t *const config);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel should be enabled?
* @return None
*
* \par<b>Description: </b><br>
* Enable a GPDMA channel <br>
*
* \par
* The function sets the GPDMA's CHENREG register to enable a DMA channel. Please
* ensure that the GPDMA module itself is enabled before calling this function.
* See ::XMC_DMA_Enable() for details.
*/
__STATIC_INLINE void XMC_DMA_CH_Enable(XMC_DMA_t *const dma, const uint8_t channel)
{
dma->CHENREG = (uint32_t)(0x101UL << channel);
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel should be disabled?
* @return None
*
* \par<b>Description: </b><br>
* Disable a GPDMA channel <br>
*
* \par
* The function resets the GPDMA's CHENREG register to disable a DMA channel.
*/
void XMC_DMA_CH_Disable(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel should be disabled?
* @return bool
*
* \par<b>Description: </b><br>
* Check if a GPDMA channel is enabled <br>
*
* \par
* The function reads the GPDMA's CHENREG register to check if a DMA channel is
* enabled or not. The function returns "true" is the requested channel is enabled,
* "false" otherwise.
*/
bool XMC_DMA_CH_IsEnabled(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel should suspend transfer?
* @return None
*
* \par<b>Description: </b><br>
* Suspend a GPDMA channel transfer <br>
*
* \par
* The function sets the CH_SUSP bit of the GPDMA's GFGL register to initiate a
* DMA transfer suspend. The function may be called after enabling the DMA channel.
* Please see ::XMC_DMA_CH_Enable() for more information.
*
* \par<b>Related API: </b><br>
* ::XMC_DMA_CH_Resume() <br>
*/
void XMC_DMA_CH_Suspend(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel should resume transfer?
* @return None
*
* \par<b>Description: </b><br>
* Resume a GPDMA channel <br>
*
* \par
* The function clears the CH_SUSP bit of the GPDMA's GFGL register to resume a
* DMA transfer. The function may be called after enabling the DMA channel. Please
* see ::XMC_DMA_CH_Enable() for more information.
*
* \par<b>Related API: </b><br>
* ::XMC_DMA_CH_Suspend() <br>
*/
void XMC_DMA_CH_Resume(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel A DMA channel
* @param addr source address
* @return None
*
* \par<b>Description: </b><br>
* This function sets the source address of the specified channel <br>
*
* \par
* The function may be called after enabling the DMA channel. Please
* see ::XMC_DMA_CH_Enable() for more information.
*
* \par<b>Related API: </b><br>
* ::XMC_DMA_CH_SetDestinationAddress() <br>
*/
__STATIC_INLINE void XMC_DMA_CH_SetSourceAddress(XMC_DMA_t *const dma, const uint8_t channel, uint32_t addr)
{
dma->CH[channel].SAR = addr;
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel A DMA channel
* @param addr destination address
* @return None
*
* \par<b>Description: </b><br>
* This function sets the destination address of the specified channel <br>
*
* \par
* The function may be called after enabling the DMA channel. Please
* see ::XMC_DMA_CH_Enable() for more information.
*
* \par<b>Related API: </b><br>
* ::XMC_DMA_CH_SetSourceAddress() <br>
*/
__STATIC_INLINE void XMC_DMA_CH_SetDestinationAddress(XMC_DMA_t *const dma, const uint8_t channel, uint32_t addr)
{
dma->CH[channel].DAR = addr;
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel A DMA channel
* @param block_size Transfer size [1-2048]
* @return None
*
* \par<b>Description: </b><br>
* This function sets the block size of a transfer<br>
*
* \par
* The function may be called after enabling the DMA channel. Please
* see ::XMC_DMA_CH_Enable() for more information.
*
*/
__STATIC_INLINE void XMC_DMA_CH_SetBlockSize(XMC_DMA_t *const dma, const uint8_t channel, uint32_t block_size)
{
dma->CH[channel].CTLH = block_size;
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel A DMA channel
* @param ll_ptr linked list pointer
* @return None
*
* \par<b>Description: </b><br>
* This function sets the linked list pointer<br>
*
* \par
* The function may be called after enabling the DMA channel. Please
* see ::XMC_DMA_CH_Enable() for more information.
*
*/
__STATIC_INLINE void XMC_DMA_CH_SetLinkedListPointer(XMC_DMA_t *const dma, const uint8_t channel, XMC_DMA_LLI_t *ll_ptr)
{
dma->CH[channel].LLP = (uint32_t)ll_ptr;
}
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel should be checked for a suspended transfer?
* @return bool
*
* \par<b>Description: </b><br>
* Check if a GPDMA <br>
*
* \par
* The function reads the CH_SUSP bit of the GPDMA's GFGL register to check if a
* DMA transfer for the requested channel has been suspended. The function returns
* "true" if it detects a transfer suspension or "false" if it doesn't.
*
* \par<b>Related API: </b><br>
* ::XMC_DMA_CH_Suspend(), ::XMC_DMA_CH_Resume() <br>
*/
bool XMC_DMA_CH_IsSuspended(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The channel for which the event(s) need(s) to be enabled
* @param event A valid GPDMA event (::XMC_DMA_CH_EVENT_t) or a valid combination
* of logically OR'd GPDMA events
* @return None
*
* \par<b>Description: </b><br>
* Enable GPDMA event(s) <br>
*
* \par
* The following events are supported by the GPDMA peripheral: <br>
* 1) Transfer complete event <br>
* 2) Block transfer complete event <br>
* 3) Source transaction complete event <br>
* 4) Destination transaction complete event <br>
* 5) DMA error event <br>
*
* \par
* The function can be used to enable one (or more) of the aforementioned events.
* Once the events have been enabled, ::XMC_DMA_CH_SetEventHandler() API can be
* used to set a callback function.
*/
void XMC_DMA_CH_EnableEvent(XMC_DMA_t *const dma, const uint8_t channel, const uint32_t event);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The channel for which the event(s) need(s) to be disabled
* @param event A valid GPDMA event (::XMC_DMA_CH_EVENT_t) or a valid combination
* of logically OR'd GPDMA events
* @return None
*
* \par<b>Description: </b><br>
* Disable GPDMA event(s) <br>
*
* \par
* The following events are supported by the GPDMA peripheral: <br>
* 1) Transfer complete event <br>
* 2) Block transfer complete event <br>
* 3) Source transaction complete event <br>
* 4) Destination transaction complete event <br>
* 5) DMA error event <br>
*
* \par
* The function can be used to disable one (or more) of the aforementioned events.
*/
void XMC_DMA_CH_DisableEvent(XMC_DMA_t *const dma, const uint8_t channel, const uint32_t event);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The channel for which the event(s) need(s) to be disabled
* @param event A valid GPDMA event (::XMC_DMA_CH_EVENT_t) or a valid combination
* of logically OR'd GPDMA events
* @return None
*
* \par<b>Description: </b><br>
* Clear GPDMA event status <br>
*
* \par
* The following events are supported by the GPDMA peripheral: <br>
* 1) Transfer complete event <br>
* 2) Block transfer complete event <br>
* 3) Source transaction complete event <br>
* 4) Destination transaction complete event <br>
* 5) DMA error event <br>
*
* \par
* The function is used to clear the status of one (or more) of the aforementioned
* events. Typically, its use is in the GPDMA interrupt handler function. Once an
* event is detected, an appropriate callback function must run and the event status
* should be cleared.
*/
void XMC_DMA_CH_ClearEventStatus(XMC_DMA_t *const dma, const uint8_t channel, const uint32_t event);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The channel for which the event(s) status must be obtained
* @return Event status
*
* \par<b>Description: </b><br>
* Get GPDMA channel event status <br>
*
* \par
* The function is used obtain the status of one (or more) of the aforementioned
* events. The return value may then be masked with any one of the following
* enumerations to obtain the status of individual DMA events. <br>
*
* \par
* Transfer complete -> ::XMC_DMA_CH_EVENT_TRANSFER_COMPLETE <br>
* Block transfer complete -> ::XMC_DMA_CH_EVENT_BLOCK_TRANSFER_COMPLETE <br>
* Source transaction complete -> ::XMC_DMA_CH_EVENT_SRC_TRANSACTION_COMPLETE <br>
* Destination transaction complete -> ::XMC_DMA_CH_EVENT_DST_TRANSACTION_COMPLETE <br>
* DMA error event -> ::XMC_DMA_CH_EVENT_ERROR <br>
*
* \par
* Typically, its use is in the GPDMA interrupt handler function. Once an event is
* detected, an appropriate callback function must run and the event status should
* be cleared.
*/
uint32_t XMC_DMA_CH_GetEventStatus(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel is used for source gather?
* @param interval Gather interval
* @param count Gather count
* @return None
*
* \par<b>Description: </b><br>
* Enable source gather <br>
*
* \par
* The function is used to enable the source gather feature in the GPDMA peripheral.
* The user must also specify the gather count and interval. Once the configuration
* is successful, calling ::XMC_DMA_CH_EnableEvent() will initiate source gather.
* This function is normally used in conjunction with destination scatter. Please
* see ::XMC_DMA_CH_EnableDestinationScatter() for additional information.
*/
void XMC_DMA_CH_EnableSourceGather(XMC_DMA_t *const dma, const uint8_t channel, uint32_t interval, uint16_t count);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The source gather for which DMA channel is to be disabled?
* @return None
*
* \par<b>Description: </b><br>
* Disable source gather <br>
*
* \par
* The function is used to disable the source gather feature in the GPDMA peripheral.
*/
void XMC_DMA_CH_DisableSourceGather(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel is used for destination scatter?
* @param interval Scatter interval
* @param count Scatter count
* @return None
*
* \par<b>Description: </b><br>
* Enable destination scatter <br>
*
* \par
* The function is used to enable the destination scatter feature in the GPDMA
* peripheral. The user must also specify the scatter count and interval. Once
* the configuration is successful, calling ::XMC_DMA_CH_EnableEvent() will
* initiate destination gather. This function is normally used in conjunction
* with source gather. Please see ::XMC_DMA_CH_EnableSourceGather() for
* additional information.
*/
void XMC_DMA_CH_EnableDestinationScatter(XMC_DMA_t *const dma, const uint8_t channel, uint32_t interval, uint16_t count);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The source gather for which DMA channel is to be disabled?
* @return None
*
* \par<b>Description: </b><br>
* Disable source gather <br>
*
* \par
* The function is used to disable the destination scatter feature in the GPDMA
* peripheral.
*/
void XMC_DMA_CH_DisableDestinationScatter(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel is being used?
* @param type Transaction type: Single/burst mode
* @param last Specify "true" if it is the last source request trigger, "false"
* otherwise
* @return None
*
* \par<b>Description: </b><br>
* Trigger source request <br>
*
* \par
* The function can be used for GPDMA transfers involving a peripheral in software
* handshaking mode viz. Memory -> peripheral and peripheral -> peripheral.
*
* \par
* One would typically use this function in a (destination) peripheral's event
* callback function to trigger the source request.
*/
void XMC_DMA_CH_TriggerSourceRequest(XMC_DMA_t *const dma, const uint8_t channel, const XMC_DMA_CH_TRANSACTION_TYPE_t type, bool last);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel is being used?
* @param type Transaction type: Single/burst mode
* @param last Specify "true" if it is the last destination request trigger, "false"
* otherwise
* @return None
*
* \par<b>Description: </b><br>
* Trigger destination request <br>
*
* \par
* The function can be used for GPDMA transfers involving a peripheral in software
* handshaking mode viz. Peripheral -> memory and peripheral -> peripheral.
*
* \par
* One would typically use this function in a (source) peripheral's event
* callback function to trigger the destination request.
*/
void XMC_DMA_CH_TriggerDestinationRequest(XMC_DMA_t *const dma, const uint8_t channel, const XMC_DMA_CH_TRANSACTION_TYPE_t type, bool last);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The channel for which the source address must be reloaded
* @return None
*
* \par<b>Description: </b><br>
* Enable source address reload <br>
*
* \par
* The function is used to automatically reload the source DMA address (from its
* initial value) at the end of every block in a multi-block transfer. The auto-
* reload will begin soon after the DMA channel initialization (configured for a
* multi-block transaction).
*/
void XMC_DMA_CH_EnableSourceAddressReload(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The channel for which the source address reload must be disabled
* @return None
*
* \par<b>Description: </b><br>
* Disable source address reload <br>
*
* \par
* The source DMA address can be automatically reloaded from its initial value at
* the end of every block in a multi-block transfer. To disable this feature, use
* this function.
*/
void XMC_DMA_CH_DisableSourceAddressReload(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The channel for which the destination address must be reloaded
* @return None
*
* \par<b>Description: </b><br>
* Enable source address reload <br>
*
* \par
* The function is used to automatically reload the destination DMA address (from
* its initial value) at the end of every block in a multi-block transfer. The auto-
* reload will begin soon after the DMA channel initialization (configured for a
* multi-block transaction).
*/
void XMC_DMA_CH_EnableDestinationAddressReload(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The channel for which the destination address reload must be
* disabled
* @return None
*
* \par<b>Description: </b><br>
* Disable destination address reload <br>
*
* \par
* The destination DMA address can be automatically reloaded from its initial value
* at the end of every block in a multi-block transfer. To disable this feature,
* use this function.
*/
void XMC_DMA_CH_DisableDestinationAddressReload(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel Which DMA channel is participating in a multi-block transfer?
* @return None
*
* \par<b>Description: </b><br>
* Trigger the end of a multi-block transfer <br>
*
* \par
* The function is used signal the end of multi-block DMA transfer. It clears the
* RELOAD_SRC and RELOAD_DST bits of the CFGL register to keep the source and
* destination addresses from getting updated. The function is typically used in
* an event handler to signal that the next block getting transferred is the last
* block in the transfer sequence.
*/
void XMC_DMA_CH_RequestLastMultiblockTransfer(XMC_DMA_t *const dma, const uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The channel for which the event handler is being registered
* @param event_handler The event handler which will be invoked when the DMA event
* occurs
* @return None
*
* \par<b>Description: </b><br>
* Set a GPDMA event handler to service GPDMA events <br>
*
* \par
* The function is used to register user callback functions for servicing DMA events.
* Call this function after enabling the GPDMA events (See ::XMC_DMA_CH_EnableEvent())
*/
void XMC_DMA_CH_SetEventHandler(XMC_DMA_t *const dma, const uint8_t channel, XMC_DMA_CH_EVENT_HANDLER_t event_handler);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The source peripheral request for which DMA channel is to be cleared?
* @return None
*
* \par<b>Description: </b><br>
* Clear source peripheral request <br>
*
* \par
* The function is used to clear the source peripheral request for a given DMA
* channel.
*/
void XMC_DMA_CH_ClearSourcePeripheralRequest(XMC_DMA_t *const dma, uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @param channel The destination peripheral request for which DMA channel is to be cleared?
* @return None
*
* \par<b>Description: </b><br>
* Clear destination peripheral request <br>
*
* \par
* The function is used to clear the destination peripheral request for a given DMA
* channel.
*/
void XMC_DMA_CH_ClearDestinationPeripheralRequest(XMC_DMA_t *const dma, uint8_t channel);
/**
* @param dma A constant pointer to XMC_DMA_t, pointing to the GPDMA base address
* @return None
*
* \par<b>Description: </b><br>
* Default GPDMA IRQ handler <br>
*
* \par
* The function implements a default GPDMA IRQ handler. It can be used within the
* following (device specific) routines: <br>
* 1) GPDMA0_0_IRQHandler <br>
* 2) GPDMA1_0_IRQHandler <br>
*
* The function handles the enabled GPDMA events and runs the user callback function
* registered by the user to service the event. To register a callback function,
* see ::XMC_DMA_CH_SetEventHandler()
*/
void XMC_DMA_IRQHandler(XMC_DMA_t *const dma);
#ifdef __cplusplus
}
#endif
/**
* @} (end addtogroup DMA)
*/
/**
* @} (end addtogroup XMClib)
*/
#endif /* defined (GPDMA0) */
#endif /* XMC_DMA_H */