1 /*
2  * Copyright 2022 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 #ifndef FSL_EDMA_CORE_H_
8 #define FSL_EDMA_CORE_H_
9 
10 #include "fsl_edma_soc.h"
11 
12 /*!
13  * @addtogroup edma_core
14  * @{
15  */
16 
17 /*******************************************************************************
18  * Definitions
19  ******************************************************************************/
20 #define DMA_CSR_INTMAJOR_MASK          (0x2U)
21 #define DMA_CSR_INTHALF_MASK           (0x4U)
22 #define DMA_CSR_DREQ_MASK              (0x8U)
23 #define DMA_CSR_ESG_MASK               (0x10U)
24 #define DMA_CSR_BWC_MASK               (0xC000U)
25 #define DMA_CSR_BWC(x)                 (((uint16_t)(((uint16_t)(x)) << (14U))) & (0xC000U))
26 #define DMA_CSR_START_MASK             (0x1U)
27 #define DMA_CITER_ELINKNO_CITER_MASK   (0x7FFFU)
28 #define DMA_BITER_ELINKNO_BITER_MASK   (0x7FFFU)
29 #define DMA_CITER_ELINKNO_CITER_SHIFT  (0U)
30 #define DMA_CITER_ELINKYES_CITER_MASK  (0x1FFU)
31 #define DMA_CITER_ELINKYES_CITER_SHIFT (0U)
32 #define DMA_ATTR_SMOD_MASK             (0xF800U)
33 #define DMA_ATTR_DMOD_MASK             (0xF8U)
34 #define DMA_CITER_ELINKNO_ELINK_MASK   (0x8000U)
35 #define DMA_CSR_MAJORELINK_MASK        (0x20U)
36 #define DMA_BITER_ELINKYES_ELINK_MASK  (0x8000U)
37 #define DMA_CITER_ELINKYES_ELINK_MASK  (0x8000U)
38 #define DMA_CSR_MAJORLINKCH_MASK       (0x1F00U)
39 #define DMA_BITER_ELINKYES_LINKCH_MASK (0x3E00U)
40 #define DMA_CITER_ELINKYES_LINKCH_MASK (0x3E00U)
41 #define DMA_NBYTES_MLOFFYES_MLOFF_MASK (0x3FFFFC00U)
42 #define DMA_NBYTES_MLOFFYES_DMLOE_MASK (0x40000000U)
43 #define DMA_NBYTES_MLOFFYES_SMLOE_MASK (0x80000000U)
44 #define DMA_NBYTES_MLOFFNO_NBYTES_MASK (0x3FFFFFFFU)
45 #define DMA_ATTR_DMOD(x)               (((uint16_t)(((uint16_t)(x)) << (3U))) & (0xF8U))
46 #define DMA_ATTR_SMOD(x)               (((uint16_t)(((uint16_t)(x)) << (11U))) & (0xF800U))
47 #define DMA_BITER_ELINKYES_LINKCH(x)   (((uint16_t)(((uint16_t)(x)) << (9U))) & (0x3E00U))
48 #define DMA_CITER_ELINKYES_LINKCH(x)   (((uint16_t)(((uint16_t)(x)) << (9U))) & (0x3E00U))
49 #define DMA_NBYTES_MLOFFYES_MLOFF(x)   (((uint32_t)(((uint32_t)(x)) << (10U))) & (0x3FFFFC00U))
50 #define DMA_NBYTES_MLOFFYES_DMLOE(x)   (((uint32_t)(((uint32_t)(x)) << (30U))) & (0x40000000U))
51 #define DMA_NBYTES_MLOFFYES_SMLOE(x)   (((uint32_t)(((uint32_t)(x)) << (31U))) & (0x80000000U))
52 #define DMA_NBYTES_MLOFFNO_NBYTES(x)   (((uint32_t)(((uint32_t)(x)) << (0U))) & (0x3FFFFFFFU))
53 #define DMA_NBYTES_MLOFFYES_NBYTES(x)  (((uint32_t)(((uint32_t)(x)) << (0U))) & (0x3FFU))
54 #define DMA_ATTR_DSIZE(x)              (((uint16_t)(((uint16_t)(x)) << (0U))) & (0x7U))
55 #define DMA_ATTR_SSIZE(x)              (((uint16_t)(((uint16_t)(x)) << (8U))) & (0x700U))
56 #define DMA_CSR_DREQ(x)                (((uint16_t)(((uint16_t)(x)) << (3U))) & (0x8U))
57 #define DMA_CSR_MAJORLINKCH(x)         (((uint16_t)(((uint16_t)(x)) << (8U))) & (0x1F00U))
58 #define DMA_CH_MATTR_WCACHE(x)         (((uint16_t)(((uint16_t)(x)) << (4U))) & (0xF0U))
59 #define DMA_CH_MATTR_RCACHE(x)         (((uint16_t)(((uint16_t)(x)) << (0U))) & (0xFU))
60 #define DMA_CH_CSR_SIGNEXT_MASK        (0x3F0000U)
61 #define DMA_CH_CSR_SIGNEXT_SHIFT       (16U)
62 #define DMA_CH_CSR_SWAP_MASK           (0xF000U)
63 #define DMA_CH_CSR_SWAP_SHIFT          (12U)
64 #define DMA_CH_SBR_INSTR_MASK          (0x2000U)
65 #define DMA_CH_SBR_INSTR_SHIFT         (13U)
66 #define DMA_CH_MUX_SOURCE(x)           (((uint32_t)(((uint32_t)(x)) << (0U))) & (0xFFU))
67 
68 /*! @brief DMA error flag */
69 #if defined(FSL_EDMA_SOC_IP_EDMA) && FSL_EDMA_SOC_IP_EDMA
70 #define DMA_ERR_DBE_FLAG     DMA_ES_DBE_MASK
71 #define DMA_ERR_SBE_FLAG     DMA_ES_SBE_MASK
72 #define DMA_ERR_SGE_FLAG     DMA_ES_SGE_MASK
73 #define DMA_ERR_NCE_FLAG     DMA_ES_NCE_MASK
74 #define DMA_ERR_DOE_FLAG     DMA_ES_DOE_MASK
75 #define DMA_ERR_DAE_FLAG     DMA_ES_DAE_MASK
76 #define DMA_ERR_SOE_FLAG     DMA_ES_SOE_MASK
77 #define DMA_ERR_SAE_FLAG     DMA_ES_SAE_MASK
78 #define DMA_ERR_ERRCHAN_FLAG DMA_ES_ERRCHN_MASK
79 #define DMA_ERR_CPE_FLAG     DMA_ES_CPE_MASK
80 #define DMA_ERR_ECX_FLAG     DMA_ES_ECX_MASK
81 #if defined(FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT) && (FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT > 1)
82 #define DMA_ERR_GPE_FLAG DMA_ES_GPE_MASK
83 #endif
84 #define DMA_ERR_FLAG DMA_ES_VLD_MASK
85 
86 /*! @brief get/clear DONE status*/
87 #define DMA_CLEAR_DONE_STATUS(base, channel) (EDMA_BASE(base)->CDNE = (uint8_t)channel)
88 #define DMA_GET_DONE_STATUS(base, channel) \
89     ((EDMA_TCD_BASE(base, channel)->CSR & DMA_CSR_DONE_MASK) >> DMA_CSR_DONE_SHIFT)
90 /*! @brief enable/disable error interrupt*/
91 #define DMA_ENABLE_ERROR_INT(base, channel)  (base->EEI |= ((uint32_t)0x1U << channel))
92 #define DMA_DISABLE_ERROR_INT(base, channel) (base->EEI &= (~((uint32_t)0x1U << channel)))
93 /*! @brief get/clear error status*/
94 #define DMA_GET_ERROR_STATUS(base, channel)   (((uint32_t)EDMA_BASE(base)->ERR >> channel) & 0x1U)
95 #define DMA_CLEAR_ERROR_STATUS(base, channel) ((uint32_t)EDMA_BASE(base)->CERR = (uint8_t)channel)
96 /*! @brief get/clear int status*/
97 #define DMA_GET_INT_STATUS(base, channel)   ((((uint32_t)EDMA_BASE(base)->INT >> channel) & 0x1U))
98 #define DMA_CLEAR_INT_STATUS(base, channel) ((uint32_t)EDMA_BASE(base)->CINT = (uint8_t)channel)
99 
100 #else
101 
102 #define DMA_ERR_DBE_FLAG                     DMA_MP_ES_DBE_MASK
103 #define DMA_ERR_SBE_FLAG                     DMA_MP_ES_SBE_MASK
104 #define DMA_ERR_SGE_FLAG                     DMA_MP_ES_SGE_MASK
105 #define DMA_ERR_NCE_FLAG                     DMA_MP_ES_NCE_MASK
106 #define DMA_ERR_DOE_FLAG                     DMA_MP_ES_DOE_MASK
107 #define DMA_ERR_DAE_FLAG                     DMA_MP_ES_DAE_MASK
108 #define DMA_ERR_SOE_FLAG                     DMA_MP_ES_SOE_MASK
109 #define DMA_ERR_SAE_FLAG                     DMA_MP_ES_SAE_MASK
110 #define DMA_ERR_ERRCHAN_FLAG                 DMA_MP_ES_ERRCHN_MASK
111 #define DMA_ERR_ECX_FLAG                     DMA_MP_ES_ECX_MASK
112 #define DMA_ERR_FLAG                         DMA_MP_ES_VLD_MASK
113 
114 /*! @brief get/clear DONE bit*/
115 #define DMA_CLEAR_DONE_STATUS(base, channel) (EDMA_CHANNEL_BASE(base, channel)->CH_CSR |= DMA_CH_CSR_DONE_MASK)
116 #define DMA_GET_DONE_STATUS(base, channel) \
117     ((EDMA_CHANNEL_BASE(base, channel)->CH_CSR & DMA_CH_CSR_DONE_MASK) >> DMA_CH_CSR_DONE_SHIFT)
118 /*! @brief enable/disable error interupt*/
119 #define DMA_ENABLE_ERROR_INT(base, channel)   (EDMA_CHANNEL_BASE(base, channel)->CH_CSR |= DMA_CH_CSR_EEI_MASK)
120 #define DMA_DISABLE_ERROR_INT(base, channel)  (EDMA_CHANNEL_BASE(base, channel)->CH_CSR &= ~DMA_CH_CSR_EEI_MASK)
121 /*! @brief get/clear error status*/
122 #define DMA_CLEAR_ERROR_STATUS(base, channel) (EDMA_CHANNEL_BASE(base, channel)->CH_ES |= DMA_CH_ES_ERR_MASK)
123 #define DMA_GET_ERROR_STATUS(base, channel) \
124     (((uint32_t)EDMA_CHANNEL_BASE(base, channel)->CH_ES >> DMA_CH_ES_ERR_SHIFT) & 0x1U)
125 /*! @brief get/clear INT status*/
126 #define DMA_CLEAR_INT_STATUS(base, channel) (EDMA_CHANNEL_BASE(base, channel)->CH_INT = DMA_CH_INT_INT_MASK)
127 #define DMA_GET_INT_STATUS(base, channel)   ((((uint32_t)EDMA_CHANNEL_BASE(base, channel)->CH_INT) & 0x1U))
128 #endif /*FSL_EDMA_SOC_IP_EDMA*/
129 
130 /*! @brief enable/dsiable MAJOR/HALF INT*/
131 #define DMA_ENABLE_MAJOR_INT(base, channel) \
132     (EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) |= DMA_CSR_INTMAJOR_MASK)
133 #define DMA_ENABLE_HALF_INT(base, channel) \
134     (EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) |= DMA_CSR_INTHALF_MASK)
135 #define DMA_DISABLE_MAJOR_INT(base, channel) \
136     (EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_INTMAJOR_MASK)
137 #define DMA_DISABLE_HALF_INT(base, channel) \
138     (EDMA_TCD_CSR(EDMA_TCD_BASE(base, channel), EDMA_TCD_TYPE(base)) &= ~(uint16_t)DMA_CSR_INTHALF_MASK)
139 
140 /*!@brief EDMA tcd align size */
141 #define EDMA_TCD_ALIGN_SIZE (32U)
142 
143 /*!@brief edma core channel struture definition */
144 typedef struct _edma_core_mp
145 {
146     __IO uint32_t MP_CSR; /**< Channel Control and Status, array offset: 0x10000, array step: 0x10000 */
147     __IO uint32_t MP_ES;  /**< Channel Error Status, array offset: 0x10004, array step: 0x10000 */
148     union
149     {
150         struct
151         {
152             __IO uint32_t MP_INT_LOW;   /**< Channel Control and Status, array offset: 0x10008, array step: 0x10000 */
153             __I uint32_t MP_INT_HIGH;   /**< Channel Control and Status, array offset: 0x1000C, array step: 0x10000 */
154             __I uint32_t MP_HRS_LOW;    /**< Channel Control and Status, array offset: 0x10010, array step: 0x10000 */
155             __I uint32_t MP_HRS_HIGH;   /**< Channel Control and Status, array offset: 0x10014, array step: 0x10000 */
156             uint8_t RESERVED_0[8];
157             __IO uint32_t MP_STOPCH;    /**< Channel Control and Status, array offset: 0x10020, array step: 0x10000 */
158             uint8_t RESERVED_1[12];
159             __I uint32_t MP_SSR_LOW;    /**< Channel Control and Status, array offset: 0x10030, array step: 0x10000 */
160             __I uint32_t MP_SSR_HIGH;   /**< Channel Control and Status, array offset: 0x10034, array step: 0x10000 */
161             uint8_t RESERVED_2[200];
162             __IO uint32_t CH_GRPRI[64]; /**< Channel Control and Status, array offset: 0x10100, array step: 0x10000 */
163             __IO uint32_t CH_MUX[64];   /**< Channel Control and Status, array offset: 0x10200, array step: 0x10000 */
164             uint8_t RESERVED_3[256];
165             __IO uint32_t CH_PROT[64];  /**< Channel Control and Status, array offset: 0x10400, array step: 0x10000 */
166         } EDMA5_REG;
167     } MP_REGS;
168 } edma_core_mp_t;
169 
170 /*!@brief edma core channel struture definition */
171 typedef struct _edma_core_channel
172 {
173     __IO uint32_t CH_CSR; /**< Channel Control and Status, array offset: 0x10000, array step: 0x10000 */
174     __IO uint32_t CH_ES;  /**< Channel Error Status, array offset: 0x10004, array step: 0x10000 */
175     __IO uint32_t CH_INT; /**< Channel Interrupt Status, array offset: 0x10008, array step: 0x10000 */
176     __IO uint32_t CH_SBR; /**< Channel System Bus, array offset: 0x1000C, array step: 0x10000 */
177     __IO uint32_t CH_PRI; /**< Channel Priority, array offset: 0x10010, array step: 0x10000 */
178     union
179     {
180         struct
181         {
182             __IO uint8_t RESERVED_1[4];
183             __IO uint32_t CH_MATTR; /**< Memory Attributes Register, array offset: 0x10018, array step: 0x8000 */
184         } EDMA5_REG;
185         struct
186         {
187             __IO uint32_t CH_MUX; /**< Channel Multiplexor Configuration, array offset: 0x10014, array step: 0x10000 */
188             __IO uint16_t CH_MATTR; /**< Memory Attributes Register, array offset: 0x10018, array step: 0x8000 */
189         } EDMA4_REG;
190     } CH_REGS;
191 } edma_core_channel_t;
192 
193 /*! @brief eDMA tcd flag type */
194 typedef enum _edma_tcd_type
195 {
196     kEDMA_EDMA4Flag = 0x0U, /*!< Data access for eDMA4 transfers. */
197     kEDMA_EDMA5Flag = 0x1U, /*!< Instruction access for eDMA4 transfers. */
198 } edma_tcd_type_t;
199 
200 /*!@brief edma5 core TCD struture definition */
201 typedef struct _edma5_core_tcd
202 {
203     __IO uint32_t SADDR;          /*!< SADDR register, used to save source address */
204     __IO uint32_t SADDR_HIGH;     /*!< SADDR HIGH register, used to save source address */
205     __IO uint16_t SOFF;           /*!< SOFF register, save offset bytes every transfer */
206     __IO uint16_t ATTR;           /*!< ATTR register, source/destination transfer size and modulo */
207     __IO uint32_t NBYTES;         /*!< Nbytes register, minor loop length in bytes */
208     __IO uint32_t SLAST;          /*!< SLAST register */
209     __IO uint32_t SLAST_SDA_HIGH; /*!< SLAST SDA HIGH register */
210     __IO uint32_t DADDR;          /*!< DADDR register, used for destination address */
211     __IO uint32_t DADDR_HIGH;     /*!< DADDR HIGH register, used for destination address */
212     __IO uint32_t DLAST_SGA;      /*!< DLASTSGA register, next tcd address used in scatter-gather mode */
213     __IO uint32_t DLAST_SGA_HIGH; /*!< DLASTSGA HIGH register, next tcd address used in scatter-gather mode */
214     __IO uint16_t DOFF;           /*!< DOFF register, used for destination offset */
215     __IO uint16_t CITER;          /*!< CITER register, current minor loop numbers, for unfinished minor loop.*/
216     __IO uint16_t CSR;            /*!< CSR register, for TCD control status */
217     __IO uint16_t BITER;          /*!< BITER register, begin minor loop count. */
218     uint8_t RESERVED[16];         /*!< Aligned 64 bytes */
219 } edma5_core_tcd_t;
220 
221 /*!@brief edma4 core TCD struture definition */
222 typedef struct _edma4_core_tcd
223 {
224     __IO uint32_t SADDR;     /*!< SADDR register, used to save source address */
225     __IO uint16_t SOFF;      /*!< SOFF register, save offset bytes every transfer */
226     __IO uint16_t ATTR;      /*!< ATTR register, source/destination transfer size and modulo */
227     __IO uint32_t NBYTES;    /*!< Nbytes register, minor loop length in bytes */
228     __IO uint32_t SLAST;     /*!< SLAST register */
229     __IO uint32_t DADDR;     /*!< DADDR register, used for destination address */
230     __IO uint16_t DOFF;      /*!< DOFF register, used for destination offset */
231     __IO uint16_t CITER;     /*!< CITER register, current minor loop numbers, for unfinished minor loop.*/
232     __IO uint32_t DLAST_SGA; /*!< DLASTSGA register, next tcd address used in scatter-gather mode */
233     __IO uint16_t CSR;       /*!< CSR register, for TCD control status */
234     __IO uint16_t BITER;     /*!< BITER register, begin minor loop count. */
235 } edma4_core_tcd_t;
236 
237 /*!@brief edma core TCD struture definition */
238 typedef struct _edma_core_tcd
239 {
240     union
241     {
242         edma4_core_tcd_t edma4_tcd;
243 #if defined FSL_EDMA_SOC_IP_DMA5 && FSL_EDMA_SOC_IP_DMA5
244         edma5_core_tcd_t edma5_tcd;
245 #endif /* FSL_EDMA_SOC_IP_DMA5 */
246     } TCD_REGS;
247 } edma_core_tcd_t;
248 
249 /*!@brief EDMA typedef */
250 typedef edma_core_channel_t EDMA_ChannelType;
251 typedef edma_core_tcd_t EDMA_TCDType;
252 typedef void EDMA_Type;
253 
254 /*!@brief EDMA base address convert macro */
255 #define EDMA_BASE(base)
256 #define EDMA_CHANNEL_BASE(base, channel)                                          \
257     ((edma_core_channel_t *)((uint32_t)(uint32_t *)(base) + EDMA_CHANNEL_OFFSET + \
258                              (channel)*EDMA_CHANNEL_ARRAY_STEP(base)))
259 #define EDMA_TCD_BASE(base, channel)                                          \
260     ((edma_core_tcd_t *)((uint32_t)(uint32_t *)(base) + EDMA_CHANNEL_OFFSET + \
261                          (channel)*EDMA_CHANNEL_ARRAY_STEP(base) + 0x20U))
262 #define EDMA_MP_BASE(base) ((edma_core_mp_t *)((uint32_t)(uint32_t *)(base)))
263 
264 /*!@brief EDMA TCD type macro */
265 #if defined FSL_FEATURE_EDMA_TCD_TYPEn
266 #define EDMA_TCD_TYPE(x) FSL_FEATURE_EDMA_TCD_TYPEn(x)
267 #else
268 #define EDMA_TCD_TYPE(x) (0)
269 #endif
270 
271 #if defined FSL_EDMA_SOC_IP_DMA5 && FSL_EDMA_SOC_IP_DMA5
272 /*!@brief EDMA TCD address convert macro */
273 #define EDMA_TCD_SADDR(tcd, flag)                                                                                    \
274     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SADDR)) : \
275                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->SADDR))))
276 
277 #define EDMA_TCD_SOFF(tcd, flag)                                                                                    \
278     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SOFF)) : \
279                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->SOFF))))
280 
281 #define EDMA_TCD_ATTR(tcd, flag)                                                                                    \
282     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->ATTR)) : \
283                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->ATTR))))
284 
285 #define EDMA_TCD_NBYTES(tcd, flag)                                                                                    \
286     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->NBYTES)) : \
287                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->NBYTES))))
288 
289 #define EDMA_TCD_SLAST(tcd, flag)                                                                                    \
290     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SLAST)) : \
291                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->SLAST))))
292 
293 #define EDMA_TCD_DADDR(tcd, flag)                                                                                    \
294     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DADDR)) : \
295                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->DADDR))))
296 
297 #define EDMA_TCD_DOFF(tcd, flag)                                                                                    \
298     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DOFF)) : \
299                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->DOFF))))
300 
301 #define EDMA_TCD_CITER(tcd, flag)                                                                                    \
302     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->CITER)) : \
303                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->CITER))))
304 
305 #define EDMA_TCD_DLAST_SGA(tcd, flag)                                         \
306     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ?                         \
307            (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DLAST_SGA)) : \
308            (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->DLAST_SGA))))
309 
310 #define EDMA_TCD_CSR(tcd, flag)                                                                                    \
311     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->CSR)) : \
312                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->CSR))))
313 
314 #define EDMA_TCD_BITER(tcd, flag)                                                                                    \
315     (*(((edma_tcd_type_t)(flag) == kEDMA_EDMA4Flag) ? (&(((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->BITER)) : \
316                                                       (&(((edma5_core_tcd_t *)(&(tcd)->TCD_REGS.edma5_tcd))->BITER))))
317 #else
318 /*!@brief EDMA TCD address convert macro */
319 #define EDMA_TCD_SADDR(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SADDR)
320 
321 #define EDMA_TCD_SOFF(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SOFF)
322 
323 #define EDMA_TCD_ATTR(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->ATTR)
324 
325 #define EDMA_TCD_NBYTES(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->NBYTES)
326 
327 #define EDMA_TCD_SLAST(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->SLAST)
328 
329 #define EDMA_TCD_DADDR(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DADDR)
330 
331 #define EDMA_TCD_DOFF(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DOFF)
332 
333 #define EDMA_TCD_CITER(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->CITER)
334 
335 #define EDMA_TCD_DLAST_SGA(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->DLAST_SGA)
336 
337 #define EDMA_TCD_CSR(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->CSR)
338 
339 #define EDMA_TCD_BITER(tcd, flag) (((edma4_core_tcd_t *)(&(tcd)->TCD_REGS.edma4_tcd))->BITER)
340 #endif /* FSL_EDMA_SOC_IP_DMA5 */
341 /*******************************************************************************
342  * API
343  ******************************************************************************/
344 
345 #ifdef __cplusplus
346 extern "C" {
347 #endif
348 
349 #ifdef __cplusplus
350 }
351 #endif
352 
353 /*!
354  * @}
355  */
356 
357 #endif /* FSL_EDMA_CORE_H_ */
358