Files
Cognitive_Agent/firmware/t2g/common/src/drivers/dma/cy_pdma.h
T

854 lines
38 KiB
C

/***************************************************************************//**
* \file cy_pdma.h
* \version 1.0
*
* \brief
* The header file of the PDMA driver.
*
********************************************************************************
* \copyright
* Copyright 2016-2017, Cypress Semiconductor Corporation. All rights reserved.
* You may use this file only in accordance with the license, terms, conditions,
* disclaimers, and limitations in the end user license agreement accompanying
* the software package with which this file was provided.
*******************************************************************************/
/**
* \defgroup group_pdma Peripheral DMA (P-DMA)
* \{
* Configures a PDMA channel and its descriptor(s).
*
* The PDMA Channel component can be used in any project that needs to transfer data
* without CPU intervention, based on a hardware trigger signal from another component.
*
* A device may support more than one PDMA hardware block. Each block has a set of
* registers, and a base hardware address. Each block also supports multiple channels.
* Many API functions for the PDMA driver require the base hardware address and the
* channel number. Ensure that you use the correct hardware address for the PDMA block in use.
*
* Features:
* * Devices support up to two PDMA hardware blocks
* * Each PDMA block supports up to 16 PDMA channels
* * Supports channel descriptors in SRAM
* * Four Priority Levels for each channel
* * Byte, Half-word (2 byte), and Word (4 byte) transfers
* * Configurable source and destination addresses
*
* \section group_pdma_configuration Configuration Considerations
*
* To set up a PDMA driver you initialize a descriptor,
* intialize and enable a channel, and enable the PDMA block.
*
* To set up the descriptor, provide the configuration parameters for the
* descriptor in the \ref cy_stc_pdma_descr_config_t structure. Then call the
* \ref Cy_PDMA_Descr_Init function to initialize the descriptor in SRAM. You can
* modify the source and destination addresses dynamically by calling
* \ref Cy_PDMA_Descr_SetSrcAddr and \ref Cy_PDMA_Descr_SetDestAddr.
*
* To set up the PDMA channel, provide a filled \ref cy_stc_pdma_chnl_config_t
* structure. Call the \ref Cy_PDMA_Chnl_Init function, specifying the channel
* number. Use \ref Cy_PDMA_Chnl_Enable to enable the configured PDMA channel.
*
* Call \ref Cy_PDMA_Chnl_Enable for each PDMA channel in use.
*
* <B>NOTE:</B> Even if a PDMA channel is enabled, it is not operational until
* the PDMA block is enabled using function \ref Cy_PDMA_Enable.\n
* <B>NOTE:</B> If the PDMA descriptor is configured to generate an interrupt,
* the interrupt must be enabled using the \ref Cy_PDMA_Chnl_SetInterruptMask
* function for each PDMA channel.
*
* \section group_pdma_more_information More Information.
*
* See the PDMA Component datasheet.
* See also the PDMA chapter of the device technical reference manual (TRM).
*
*
* \section group_pdma_changelog Changelog
*
* <table class="doxtable">
* <tr><th>Version</th><th>Changes</th><th>Reason for Change</th></tr>
* <tr>
* <td>7.3.0</td>
* <td>group_pdma_common_macro_PDMAIntrCauses corrections </td>
* <td>Status alignment with design</td>
* </tr>
* </table>
*
* <table class="doxtable">
* <tr><th>Version</th><th>Changes</th><th>Reason for Change</th></tr>
* <tr>
* <td>1.0</td>
* <td>Initial version</td>
* <td></td>
* </tr>
* </table>
*
* \defgroup group_pdma_macro Macro
* \{
* \defgroup group_pdma_common_macro_PDMAIntrCauses PDMA Interrupt Causes
* \}
*
* \defgroup group_pdma_functions Functions
* \defgroup group_pdma_data_structures Data structures
* \defgroup group_pdma_enums Enumerated types
*/
#if !defined(CY_PDMA_H)
#define CY_PDMA_H
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include "syslib/cy_syslib.h"
#include "cy_device_headers.h"
/*
#ifndef CY_IP_M4CPUSS_PDMA
#error "The PDMA driver is not supported on this device"
#endif
*/
#if defined(__cplusplus)
extern "C" {
#endif
/******************************************************************************
* Macro definitions *
******************************************************************************/
/**
* \addtogroup group_pdma_macro
* \{
*/
/** Driver major version */
#define CY_PDMA_DRV_VERSION_MAJOR 1
/** Driver minor version */
#define CY_PDMA_DRV_VERSION_MINOR 0
/** \cond INTERNAL */
#define CY_PDMA_INTR_BIT_MASK (0x01UL)
/** \endcond */
/**
* \addtogroup group_pdma_common_macro_PDMAIntrCauses
* \{
*/
#define CY_PDMA_INTRCAUSE_NO_INTR (0x00u) /**< No interrupt generated */
#define CY_PDMA_INTRCAUSE_COMPLETION (0x01u) /**< Interrupt based on transfer completion configuration based on INTR_TYPE */
#define CY_PDMA_INTRCAUSE_SRC_BUS_ERROR (0x02u) /**< Source transfer bus error */
#define CY_PDMA_INTRCAUSE_DST_BUS_ERROR (0x03u) /**< Destination transfer bus error */
#define CY_PDMA_INTRCAUSE_SRC_MISAL (0x04u) /**< Source address misalignment */
#define CY_PDMA_INTRCAUSE_DST_MISAL (0x05u) /**< Destination address misalignment */
#define CY_PDMA_INTRCAUSE_CURR_PTR_NULL (0x06u) /**< Current descriptor pointer is null */
#define CY_PDMA_INTRCAUSE_ACTIVE_CH_DISABLED (0x07u) /**< Active channel is disabled */
#define CY_PDMA_INTRCAUSE_DESCR_BUS_ERROR (0x08u) /**< Descriptor bus error */
/** \} group_pdma_common_macro_PDMAIntrCauses */
#define CY_PDMA_ID (CY_PDL_DRV_ID(0x13u)) /**< PDMA PDL ID */
#define CY_PDMA_ID_INFO (uint32_t)( CY_PDMA_ID | CY_PDL_STATUS_INFO ) /**< Return prefix for PDMA driver function status codes */
#define CY_PDMA_ID_WARNING (uint32_t)( CY_PDMA_ID | CY_PDL_STATUS_WARNING) /**< Return prefix for PDMA driver function warning return values */
#define CY_PDMA_ID_ERROR (uint32_t)( CY_PDMA_ID | CY_PDL_STATUS_ERROR) /**< Return prefix for PDMA driver function error return values */
/** \} group_pdma_macro */
/**
* \addtogroup group_pdma_data_structures
* \{
*/
/* PDMA descriptor structure type. This is a redefinition of the descriptor structure in the driver.
* The user will use this descriptor type in his descriptor configuration functions.
*/
/**
* \brief PDMA descriptor structure
*/
typedef struct stc_PDMA_DESCR_CTL_field {
uint32_t u2WAIT_FOR_DEACT:2;
uint32_t u2INTR_TYPE:2;
uint32_t u2TR_OUT_TYPE:2;
uint32_t u2TR_IN_TYPE:2;
uint32_t :16;
uint32_t u1CH_DISABLE:1;
uint32_t :1;
uint32_t u1SRC_TRANSFER_SIZE:1;
uint32_t u1DST_TRANSFER_SIZE:1;
uint32_t u2DATA_SIZE:2;
uint32_t u2DESCR_TYPE:2;
} stc_PDMA_DESCR_CTL_field_t;
typedef union un_PDMA_DESCR_CTL {
uint32_t u32Register;
stc_PDMA_DESCR_CTL_field_t stcField;
uint8_t au8Byte[4];
uint16_t au16Halfword[2];
} un_PDMA_DESCR_CTL_t;
typedef struct stc_PDMA_DESCR_X_CTL_field {
uint32_t u12SRC_X_INCR:12;
uint32_t u12DST_X_INCR:12;
uint32_t u8X_COUNT:8;
} stc_PDMA_DESCR_X_CTL_field_t;
typedef union un_PDMA_DESCR_X_CTL {
uint32_t u32Register;
stc_PDMA_DESCR_X_CTL_field_t stcField;
uint8_t au8Byte[4];
uint16_t au16Halfword[2];
} un_PDMA_DESCR_X_CTL_t;
typedef struct stc_PDMA_DESCR_Y_CTL_field {
uint32_t u12SRC_Y_INCR:12;
uint32_t u12DST_Y_INCR:12;
uint32_t u8Y_COUNT:8;
} stc_PDMA_DESCR_Y_CTL_field_t;
typedef union un_PDMA_DESCR_Y_CTL {
uint32_t u32Register;
stc_PDMA_DESCR_Y_CTL_field_t stcField;
uint8_t au8Byte[4];
uint16_t au16Halfword[2];
} un_PDMA_DESCR_Y_CTL_t;
typedef struct {
un_PDMA_DESCR_CTL_t unPDMA_DESCR_CTL;
uint32_t u32PDMA_DESCR_SRC;
uint32_t u32PDMA_DESCR_DST;
un_PDMA_DESCR_X_CTL_t unPDMA_DESCR_X_CTL;
un_PDMA_DESCR_Y_CTL_t unPDMA_DESCR_Y_CTL;
uint32_t u32PDMA_DESCR_NEXT_PTR;
} cy_stc_pdma_descr_t;
/**
* This structure is a configuration structure pre-initialized by the user and
* passed as a parameter to the CY_PDMA_InitDescr(). This structure has all the parameters
* of the descriptor as separate parameters. Some of these parameters are represented in the
* stc_Descr_t data structure as bit fields.
*/
typedef struct {
uint32_t deact; /**< Specifies whether the PDMA controller should wait for the input trigger to be deactivated */
uint32_t intrType; /**< Sets the event that triggers an interrupt, see \ref cy_en_pdma_inttype_t */
uint32_t trigoutType; /**< Sets the event that triggers an output, see \ref cy_en_pdma_trigouttype_t */
uint32_t chStateAtCmplt; /**< Specifies if the channel is enabled or disabled on completion of descriptor see \ref cy_en_pdma_chdesccmpl_t */
uint32_t triginType; /**< Sets what type of transfer is triggered, see \ref cy_en_pdma_trigintype_t */
uint32_t dataSize; /**< The size of the data bus for transfer, see \ref cy_en_pdma_datasize_t */
uint32_t srcTxfrSize; /**< The source transfer size */
uint32_t destTxfrSize; /**< The destination transfer size */
uint32_t descrType; /**< The type of the descriptor see \ref cy_en_pdma_descrtype_t*/
void * srcAddr; /**< The source address of the transfer */
void * destAddr; /**< The destination address of the transfer */
int32_t srcXincr; /**< The address increment of the source after each X-loop transfer */
int32_t destXincr; /**< The address increment of the destination after each X-loop transfer */
uint32_t xCount; /**< The number of transfers in an X-loop */
int32_t srcYincr; /**< The address increment of the source after each Y-loop transfer */
int32_t destYincr; /**< The address increment of the destination after each Y-loop transfer */
uint32_t yCount; /**< The number of transfers in the Y-loop */
cy_stc_pdma_descr_t* descrNext; /**< The next descriptor to chain after completion, a NULL value will signify no chaining */
} cy_stc_pdma_descr_config_t;
/** This structure holds the initialization values for the PDMA channel */
typedef struct {
cy_stc_pdma_descr_t* PDMA_Descriptor;/**< The PDMA descriptor associated with the channel being initialized */
uint32_t preemptable; /**< Specifies if the channel is preemptable by another higher-priority channel */
uint32_t priority; /**< This parameter specifies the channel's priority */
uint32_t enable; /**< This parameter specifies if the channel is enabled after initializing */
uint32_t priviledge;
uint32_t non_secure;
uint32_t bufferable;
uint32_t protection_context;
} cy_stc_pdma_chnl_config_t;
/** This structure holds the initialization values for the CRC feature on PDMA */
typedef struct {
uint32_t data_reverse;
uint32_t rem_reverse;
uint8_t data_xor;
uint32_t polynomial;
uint32_t lfsr32;
uint32_t rem_xor;
} cy_stc_pdma_crc_config_t;
/** \} group_pdma_data_structures */
/**
* \addtogroup group_pdma_enums
* \{
*/
/** Contains the options for the trigger input deactivation parameter type */
enum cy_en_pdma_deactivate_t {
CY_PDMA_TRIG_DEACT_NO_WAIT, /**< Don't wait for deactivation (for pulse sensitive triggers)*/
CY_PDMA_TRIG_DEACT_4CYC, /**< Wait for up to 4 cycles */
CY_PDMA_TRIG_DEACT_16CYC, /**< Wait for up to 16 cycles */
CY_PDMA_TRIG_DEACT_WAIT_INDEFINITELY, /**< Wait indefinitely. This option may result in controller lockup if the trigger is not de-activated */
} ;
/** Contains the options for the descriptor type */
enum cy_en_pdma_descrtype_t {
CY_PDMA_SINGLE_TRANSFER, /**< Single transfer */
CY_PDMA_1D_TRANSFER, /**< 1D transfer */
CY_PDMA_2D_TRANSFER, /**< 2D transfer */
CY_PDMA_CRC_TRANSFER /**< CRC transfer */
} ;
/** Contains the options for the interrupt-type parameter of the descriptor */
enum cy_en_pdma_inttype_t {
CY_PDMA_INTR_1ELEMENT_CMPLT, /**< Triggers on every element transfer completion */
CY_PDMA_INTR_X_LOOP_CMPLT, /**< Triggers on every X loop transfer completion */
CY_PDMA_INTR_DESCR_CMPLT, /**< Triggers on descriptor completion */
CY_PDMA_INTR_DESCRCHAIN_CMPLT /**< Triggers on completion of the entire descriptor chain */
} ;
/** This enum has the options for the trigger in the type parameter of the descriptor */
enum cy_en_pdma_trigouttype_t {
CY_PDMA_TRIGOUT_1ELEMENT_CMPLT, /**< Triggers on every element transfer completion */
CY_PDMA_TRIGOUT_X_LOOP_CMPLT, /**< Triggers on every X loop transfer completion */
CY_PDMA_TRIGOUT_DESCR_CMPLT, /**< Triggers on descriptor completion */
CY_PDMA_TRIGOUT_DESCRCHAIN_CMPLT /**< Triggers on completion of the entire descriptor chain */
} ;
/** This enum has the options for the trigger-in-type parameter of the descriptor */
enum cy_en_pdma_trigintype_t {
CY_PDMA_TRIGIN_1ELEMENT, /**< One transfer per trigger */
CY_PDMA_TRIGIN_XLOOP, /**< One X loop transfer per trigger */
CY_PDMA_TRIGIN_DESCR, /**< The entire descriptor transfer per trigger */
CY_PDMA_TRIGIN_DESCRCHAIN /**< The entire descriptor chain per trigger */
} ;
/** This enum has the options for the data size */
enum cy_en_pdma_datasize_t {
CY_PDMA_BYTE, /**< One byte */
CY_PDMA_HALFWORD, /**< Half word (two bytes) */
CY_PDMA_WORD /**< Full word (four bytes) */
} ;
/** This enum has the options for descriptor retriggering */
enum cy_en_pdma_retrigger_t {
CY_PDMA_RETDIG_IM, /**< Retrigger immediately */
CY_PDMA_RETDIG_4CYC, /**< Retrigger after 4 SYSCLK */
CY_PDMA_RETDIG_16CYC, /**< Retrigger after 16 SYSCLK */
CY_PDMA_WAIT_FOR_REACT /**< Wait for trigger reactivation */
};
/** This enum has the options for the transfer size */
enum cy_en_pdma_txfrsize_t {
CY_PDMA_TXFR_SIZE_DATA_SIZE, /**< As per data size register */
CY_PDMA_TXFR_SIZE_WORD /**< A full word (four bytes) */
};
/** This enum has the options for the state of the channel when the descriptor is completed */
enum cy_en_pdma_chdesccmpl_t {
CY_PDMA_CH_ENABLED, /**< Channel stays enabled */
CY_PDMA_CH_DISABLED /**< Channel is disabled */
};
/** This enum has the return values of the PDMA driver */
typedef enum
{
CY_PDMA_SUCCESS = 0x00ul, /**< Success */
CY_PDMA_INVALID_INPUT_PARAMETERS = ( CY_PDMA_ID_ERROR + 1ul), /**< Input parameters passed to PDMA API are not valid */
CY_PDMA_ERR_UNC = ( CY_PDMA_ID_ERROR + 0xFul),/**< Unknown error */
} cy_en_pdma_status_t;
/** \} group_pdma_enums */
/**
* \addtogroup group_pdma_functions
* \{
*/
//IP functions
void Cy_PDMA_Enable ( volatile stc_DW_t * pstcPDMA);
void Cy_PDMA_Disable ( volatile stc_DW_t * pstcPDMA);
uint32_t Cy_PDMA_GetActiveChnl ( const volatile stc_DW_t * pstcPDMA);
void* Cy_PDMA_GetActiveSrcAddr ( const volatile stc_DW_t * pstcPDMA);
void* Cy_PDMA_GetActiveDstAddr ( const volatile stc_DW_t * pstcPDMA);
void Cy_PDMA_CRC_Config ( volatile stc_DW_t * pstcPDMA,
const cy_stc_pdma_crc_config_t* pstcCrcConfig);
uint32_t Cy_PDMA_GetCrcRemainderResult ( volatile stc_DW_t * pstcPDMA);
//Descriptor functions
cy_en_pdma_status_t Cy_PDMA_Descr_Init ( cy_stc_pdma_descr_t* descriptor,
const cy_stc_pdma_descr_config_t* config);
void Cy_PDMA_Descr_DeInit ( cy_stc_pdma_descr_t* descriptor);
__STATIC_INLINE void Cy_PDMA_Descr_SetSrcAddr ( cy_stc_pdma_descr_t* descriptor,
const void * srcAddr);
__STATIC_INLINE void Cy_PDMA_Descr_SetDestAddr ( cy_stc_pdma_descr_t* descriptor,
const void * dstAddr);
void Cy_PDMA_Descr_SetNxtDescr ( cy_stc_pdma_descr_t* descriptor,
const cy_stc_pdma_descr_t* nxtDescriptor);
__STATIC_INLINE void Cy_PDMA_Descr_SetIntrType ( cy_stc_pdma_descr_t* descriptor,
uint32_t interruptType);
__STATIC_INLINE void Cy_PDMA_Descr_SetTrigInType ( cy_stc_pdma_descr_t* descriptor,
uint32_t trigInType);
__STATIC_INLINE void Cy_PDMA_Descr_SetTrigOutType ( cy_stc_pdma_descr_t* descriptor,
uint32_t trigOutType);
void Cy_PDMA_Descr_SetTxfrWidth ( cy_stc_pdma_descr_t* descriptor,
uint32_t dataElementSize,
uint32_t srcTxfrWidth,
uint32_t dstTxfrWidth);
//Channel functions
cy_en_pdma_status_t Cy_PDMA_Chnl_Init ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum,
const cy_stc_pdma_chnl_config_t* chnlConfig);
void Cy_PDMA_Chnl_DeInit ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE void Cy_PDMA_Chnl_SetDescr ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum,
const cy_stc_pdma_descr_t* descriptor);
__STATIC_INLINE void Cy_PDMA_Chnl_Enable ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE void Cy_PDMA_Chnl_Disable ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE void Cy_PDMA_Chnl_SetPriority ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum,
uint32_t priority);
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetPriority ( const volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE cy_stc_pdma_descr_t* Cy_PDMA_Chnl_GetCurrentDescr ( const volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetInterruptStatus ( const volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetInterruptCause ( const volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
void Cy_PDMA_Chnl_ClearInterrupt ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE void Cy_PDMA_Chnl_SetInterrupt ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetInterruptMask ( const volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE void Cy_PDMA_Chnl_SetInterruptMask ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetInterruptStatusMasked ( const volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
#if defined(CPUSS_SW_TR_PRESENT) && (CPUSS_SW_TR_PRESENT == 1)
__STATIC_INLINE void Cy_PDMA_Chnl_SetSwTrigger ( volatile stc_DW_t * pstcPDMA,
uint32_t chNum);
#endif
/***************************************
* In-line Function Implementation
***************************************/
/*******************************************************************************
* Function Name: Cy_PDMA_Descr_SetSrcAddr
****************************************************************************//**
*
* \brief Sets the source address parameter for the descriptor structure.
*
* This function will operate on the descriptor only if it was defined as a RAM
* variable.
* If the descriptor is being defined in Flash, then the user has to use the
* configuration defines to initialize it.
*
* \param descriptor
* This is a descriptor-structure instance declared by the user. The function
* modifies the source-address parameter in this descriptor.
*
* \param srcAddr
* The source address value for the descriptor.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Descr_SetSrcAddr(cy_stc_pdma_descr_t* descriptor, const void * srcAddr)
{
descriptor->u32PDMA_DESCR_SRC = (uint32_t)srcAddr;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Descr_SetDestAddr
****************************************************************************//**
*
* \brief Sets the destination address parameter for the descriptor structure.
*
* This function will operate in the descriptor only if it was defined as a RAM
* variable.
* If the descriptor is being defined in Flash, then the user has to use the
* configuration defines to initialize it.
*
* \param descriptor
* This is a descriptor-structure instance declared by the user. The function
* modifies the destination-address parameter in this descriptor.
*
* \param dstAddr
* The destination address value for the descriptor.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Descr_SetDestAddr(cy_stc_pdma_descr_t* descriptor, const void * dstAddr)
{
descriptor->u32PDMA_DESCR_DST = (uint32_t)dstAddr;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_SetDescr
****************************************************************************//**
*
* \brief Sets a descriptor as current for specified PDMA channel.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
* \param descriptor
* This is the descriptor which will be associated with the channel.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Chnl_SetDescr(volatile stc_DW_t *pstcPDMA, uint32_t chNum, const cy_stc_pdma_descr_t* descriptor)
{
pstcPDMA->CH_STRUCT[chNum].unCH_CURR_PTR.u32Register = (uint32_t)descriptor;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_Enable
****************************************************************************//**
*
* The function is used to enable a PDMA channel.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Chnl_Enable(volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
pstcPDMA->CH_STRUCT[chNum].unCH_CTL.stcField.u1ENABLED = 1ul;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_Disable
****************************************************************************//**
*
* The function is used to disable a PDMA channel.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Chnl_Disable(volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
pstcPDMA->CH_STRUCT[chNum].unCH_CTL.stcField.u1ENABLED = 0ul;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_SetPriority
****************************************************************************//**
*
* The function is used to set a priority for the PDMA channel.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
* \param priority
* The priority to be set for the PDMA channel. The allowed values are 0,1,2,3.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Chnl_SetPriority(volatile stc_DW_t *pstcPDMA, uint32_t chNum, uint32_t priority)
{
pstcPDMA->CH_STRUCT[chNum].unCH_CTL.stcField.u2PRIO = priority;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_GetPriority
****************************************************************************//**
*
* Returns the priority of PDMA channel.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
* \return
* The priority of the channel.
*
*******************************************************************************/
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetPriority(const volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
return pstcPDMA->CH_STRUCT[chNum].unCH_CTL.stcField.u2PRIO;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_GetCurrentDescr
****************************************************************************//**
*
* This function returns the descriptor that is active in the channel.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
* \return
* The pointer to the descriptor associated with the channel.
*
*******************************************************************************/
__STATIC_INLINE cy_stc_pdma_descr_t* Cy_PDMA_Chnl_GetCurrentDescr(const volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
return (cy_stc_pdma_descr_t*) pstcPDMA->CH_STRUCT[chNum].unCH_CURR_PTR.u32Register;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Descr_SetIntrType
****************************************************************************//**
*
* Sets the interrupt type parameter for the descriptor structure.
* This function will operate in the descriptor only if it was defined as a RAM
* variable.
* If the descriptor is being defined in Flash, then the user has to use the
* configuration defines to initialize it.
*
* \param descriptor
* This is the descriptor-structure instance declared by the user. This is the
* descriptor being modified.
*
* \param interruptType
* The interrupt type set for the descriptor.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Descr_SetIntrType(cy_stc_pdma_descr_t* descriptor, uint32_t interruptType)
{
descriptor->unPDMA_DESCR_CTL.stcField.u2INTR_TYPE = interruptType;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Descr_SetTrigInType
****************************************************************************//**
*
* Sets the trigger-in-type parameter for the descriptor structure.
* This function will operate in the descriptor only if it was defined as a RAM
* variable.
* If the descriptor is being defined in Flash, then the user has to use the
* configuration defines to initialize it.
*
* \param descriptor
* This is a descriptor structure instance declared by the user. This is the
* descriptor being modified.
*
* \param trigInType
* The trigger-in-type set for the descriptor. \ref cy_en_pdma_trigintype_t
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Descr_SetTrigInType(cy_stc_pdma_descr_t* descriptor, uint32_t trigInType)
{
descriptor->unPDMA_DESCR_CTL.stcField.u2TR_IN_TYPE = trigInType;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Descr_SetTrigOutType
****************************************************************************//**
*
* This function sets the trigger-out-type parameter for for the descriptor
* structure.
* This function will operate in the descriptor only if it was defined as a RAM
* variable.
* If the descriptor is being defined in Flash, then the user has to use the
* configuration defines to initialize it.
*
* \param descriptor
* This is a descriptor-structure instance declared by the user. This is the
* descriptor being modified.
*
* \param trigOutType
* The trigger-out-type set for the descriptor. \ref cy_en_pdma_trigouttype_t
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Descr_SetTrigOutType(cy_stc_pdma_descr_t* descriptor, uint32_t trigOutType)
{
descriptor->unPDMA_DESCR_CTL.stcField.u2TR_OUT_TYPE = trigOutType;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_GetInterruptStatus
****************************************************************************//**
*
* This function can be used to determine the interrupt status of the
* PDMA channel.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
* \return
* Returns a status of an interrupt for specified channel.
*
*******************************************************************************/
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetInterruptStatus(const volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
return (pstcPDMA->CH_STRUCT[chNum].unINTR.u32Register);
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_GetInterruptCause
****************************************************************************//**
*
* This function can be used to determine the interrupt reason of the
* PDMA channel.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
* \return
* Returns a status of an interrupt for specified channel.
* (see \ref group_pdma_common_macro_PDMAIntrCauses for return values).
* For error related interrupt causes (INTR_CAUSE is "1", "2", "3", ..., "8"),
* the channel is disabled (HW sets CH_CTL.ENABLED to '0').
*
*******************************************************************************/
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetInterruptCause(const volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
return (pstcPDMA->CH_STRUCT[chNum].unCH_STATUS.stcField.u4INTR_CAUSE);
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_SetInterrupt
****************************************************************************//**
*
* This function sets the interrupt.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Chnl_SetInterrupt(volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
pstcPDMA->CH_STRUCT[chNum].unINTR_SET.u32Register = CY_PDMA_INTR_BIT_MASK;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_GetInterruptMask
****************************************************************************//**
*
* This function gets interrupt mask value.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
* \return
* Returns an interrupt mask value.
*
*******************************************************************************/
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetInterruptMask(const volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
return (pstcPDMA->CH_STRUCT[chNum].unINTR_MASK.u32Register);
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_SetInterruptMask
****************************************************************************//**
*
* This function sets interrupt mask value.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Chnl_SetInterruptMask(volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
pstcPDMA->CH_STRUCT[chNum].unINTR_MASK.u32Register = CY_PDMA_INTR_BIT_MASK;
}
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_GetInterruptStatusMasked
****************************************************************************//**
*
* This function returns logical and of corresponding INTR and INTR_MASK fields
* in a single load operation.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
*******************************************************************************/
__STATIC_INLINE uint32_t Cy_PDMA_Chnl_GetInterruptStatusMasked(const volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
return (pstcPDMA->CH_STRUCT[chNum].unINTR_MASKED.u32Register);
}
#if defined(CPUSS_SW_TR_PRESENT) && (CPUSS_SW_TR_PRESENT == 1)
/*******************************************************************************
* Function Name: Cy_PDMA_Chnl_SetSwTrigger
****************************************************************************//**
*
* This function sets the SW trigger for a channel.
*
* \param pstcPDMA
* Pointer to the hardware PDMA block.
*
* \param chNum
* Channel number of the PDMA.
*
* \return
* Returns an interrupt mask value.
*
*******************************************************************************/
__STATIC_INLINE void Cy_PDMA_Chnl_SetSwTrigger(volatile stc_DW_t *pstcPDMA, uint32_t chNum)
{
pstcPDMA->CH_STRUCT[chNum].unTR_CMD.stcField.u1ACTIVATE = 1ul;
}
#endif
/** \} group_pdma_functions */
#if defined(__cplusplus)
}
#endif
#endif /* (CY_PDMA_H) */
/** \} group_pdma */
/* [] END OF FILE */