Skip to content

Commit 57e9a25

Browse files
committed
mcux-sdk: edma: add channel link function
Signed-off-by: Yongxu Wang <[email protected]>
1 parent 8b7472d commit 57e9a25

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

mcux/mcux-sdk/drivers/edma_rev2/fsl_edma_rev2.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,39 @@ static uint32_t EDMA_ConvertTransferWidth(uint32_t width)
172172
return 0;
173173
}
174174

175+
status_t EDMA_SetChannelLink(edma_config_t *cfg, int channel, edma_channel_link_type_t type, uint32_t linkedChannel)
176+
{
177+
uint32_t mp_csr;
178+
/* setting global channel linking control */
179+
mp_csr = EDMA_MPRegRead(cfg, EDMA_MP_CS) | EDMA_MP_CS_GCLC_MASK;
180+
EDMA_MPRegWrite(cfg, EDMA_MP_CS, mp_csr);
181+
if (type == kEDMA_MinorLink)
182+
{
183+
uint16_t biter, citer;
184+
biter = EDMA_ChannelRegRead(cfg, channel, EDMA_TCD_BITER);
185+
citer = EDMA_ChannelRegRead(cfg, channel, EDMA_TCD_CITER);
186+
biter |= EDMA_BITER_ELINKYES_ELINK_MASK | EDMA_BITER_ELINKYES_LINKCH(linkedChannel);
187+
citer |= EDMA_CITER_ELINKYES_ELINK_MASK | EDMA_CITER_ELINKYES_LINKCH(linkedChannel);
188+
EDMA_ChannelRegWrite(cfg, channel, EDMA_TCD_CITER, citer);
189+
EDMA_ChannelRegWrite(cfg, channel, EDMA_TCD_BITER, biter);
190+
}
191+
else if(type == kEDMA_MajorLink)
192+
{
193+
uint16_t csr;
194+
csr = EDMA_ChannelRegRead(cfg, channel, EDMA_TCD_CSR);
195+
csr |= EDMA_CSR_MAJORELINK_MASK | EDMA_CSR_MAJORLINKCH(linkedChannel);
196+
EDMA_ChannelRegUpdate(cfg, channel, EDMA_TCD_CSR, EDMA_TCD_CSR_MAJORELINK_MASk, 0);
197+
}
198+
else
199+
{
200+
/* disable global channel linking control if no linked channel */
201+
mp_csr = EDMA_MPRegRead(cfg, EDMA_MP_CS) & (~EDMA_MP_CS_GCLC_MASK);
202+
EDMA_MPRegWrite(cfg, EDMA_MP_CS, mp_csr);
203+
}
204+
205+
return kStatus_Success;
206+
}
207+
175208
status_t EDMA_ConfigureTransfer(edma_config_t *cfg, int channel,
176209
uint32_t saddr, uint32_t daddr,
177210
uint32_t ssize, uint32_t dsize,

mcux/mcux-sdk/drivers/edma_rev2/fsl_edma_rev2.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,27 +77,40 @@ extern "C" {
7777
#define EDMA_TCD_CITER_ELINKNO_MASK 0x7fff
7878
#define EDMA_TCD_CITER_ELINKNO(x) ((x) & EDMA_TCD_CITER_ELINKNO_MASK)
7979

80-
#define EDMA_TCD_BITER_ELINKNO_MASK 0x7fff
80+
#define EDMA_TCD_BITER_ELINKNO_MASK 0xf
8181
#define EDMA_TCD_BITER_ELINKNO(x) ((x) & EDMA_TCD_BITER_ELINKNO_MASK)
8282

8383
#define EDMA_TCD_NBYTES_MLOFFNO_MASK 0x3fffffff
8484
#define EDMA_TCD_NBYTES_MLOFFNO(x) ((x) & EDMA_TCD_NBYTES_MLOFFNO_MASK)
8585

86+
#define EDMA_TCD_CSR_MAJORELINK_MASk EDMA_BIT(5)
8687
#define EDMA_TCD_CSR_INTHALF_MASK EDMA_BIT(2)
8788
#define EDMA_TCD_CSR_INTMAJOR_MASK EDMA_BIT(1)
89+
#define EDMA_TCD_CSR_START_MASK EDMA_BIT(0)
8890

8991
#define EDMA_TCD_CH_CSR_ACTIVE_MASK EDMA_BIT(31)
9092
#define EDMA_TCD_CH_CSR_DONE_MASK EDMA_BIT(30)
9193
#define EDMA_TCD_CH_CSR_ERQ_MASK EDMA_BIT(0)
9294

9395
#define EDMA_TCD_CH_INT_MASK BIT(1)
9496

97+
#define EDMA_CSR_MAJORELINK_MASK EDMA_BIT(5)
98+
#define EDMA_CITER_ELINKYES_LINKCH_MASK (0x3E00U)
99+
#define EDMA_BITER_ELINKYES_LINKCH_MASK (0x3E00U)
100+
#define EDMA_BITER_ELINKYES_LINKCH(x) (((uint16_t)(((uint16_t)(x)) << (9U))) & (0x3E00U))
101+
#define EDMA_CITER_ELINKYES_LINKCH(x) (((uint16_t)(((uint16_t)(x)) << (9U))) & (0x3E00U))
102+
#define EDMA_BITER_ELINKYES_ELINK_MASK EDMA_BIT(15)
103+
#define EDMA_CITER_ELINKYES_ELINK_MASK EDMA_BIT(15)
104+
#define EDMA_CSR_MAJORLINKCH_MASK (0x1F00U)
105+
#define EDMA_CSR_MAJORLINKCH(x) (((uint16_t)(((uint16_t)(x)) << (8U))) & (0x1F00U))
106+
95107
/* EDMA registers */
96108
/* common MP-related registers */
97109
#define EDMA_MP_CS EDMA_REGISTER_MAKE(EDMA_MP_CS_INDEX, kEDMA_RegAccess32)
98110
#define EDMA_MP_ES EDMA_REGISTER_MAKE(EDMA_MP_ES_INDEX, kEDMA_RegAccess32)
99111
#define EDMA_MP_INT EDMA_REGISTER_MAKE(EDMA_MP_INT_INDEX, kEDMA_RegAccess32)
100112
#define EDMA_MP_HRS EDMA_REGISTER_MAKE(EDMA_MP_HRS_INDEX, kEDMA_RegAccess32)
113+
#define EDMA_MP_CS_GCLC_MASK EDMA_BIT(6)
101114
/* TODO: access requires validation */
102115
#define EDMA_MP_CH_GRPRI EDMA_REGISTER_MAKE(EDMA_MP_CH_GRPRI_INDEX, kEDMA_RegAccess32)
103116
/* common TCD-related registers */
@@ -159,6 +172,14 @@ enum _edma_transfer_type {
159172
kEDMA_TransferTypeP2M, /* Peripheral to memory transfer */
160173
};
161174

175+
/*! @brief Channel link type */
176+
typedef enum _edma_channel_link_type
177+
{
178+
kEDMA_LinkNone = 0x0U, /*!< No channel link */
179+
kEDMA_MinorLink, /*!< Channel link after each minor loop */
180+
kEDMA_MajorLink, /*!< Channel link while major loop count exhausted */
181+
}edma_channel_link_type_t;
182+
162183
typedef struct _edma_config {
163184
/* EDMA base address. Should be overwritten by user if working with virtual
164185
* addresses.
@@ -328,3 +349,4 @@ status_t EDMA_ConfigureTransfer(edma_config_t *cfg, int channel,
328349
}
329350
#endif
330351
#endif /* _FSL_EDMA_REV2_H_ */
352+

0 commit comments

Comments
 (0)