15struct dma_transfer_desc_t
19 dma_transfer_desc_t *pNext;
20 dma_descview_0 *pNext_0;
21 dma_descview_1 *pNext_1;
22 dma_descview_2 *pNext_2;
23 dma_descview_3 *pNext_3;
28struct dma_descview_0 :
public dma_transfer_desc_t
33struct dma_descview_1 :
public dma_transfer_desc_t
39struct dma_descview_2 :
public dma_transfer_desc_t
46struct dma_descview_3 :
public dma_transfer_desc_t
59extern "C" XdmaCh_t * xdmacGetFreeCh();
60extern "C" void xdmacReleaseCh(XdmaCh_t *xdmaCh);
67 void (* isr) (XdmaCh_t *);
71struct XdmaCh_t :
public XdmacChid
74 static XdmaChCtx_t ctx[XDMACCHID_NUMBER];
75 static uint32_t bInUse;
79 Mem2Mem = XDMAC_CC_TYPE_MEM_TRAN_Val,
80 Periph = XDMAC_CC_TYPE_PER_TRAN_Val
84 MBSiz_1 = XDMAC_CC_MBSIZE_SINGLE_Val,
85 MBSiz_4 = XDMAC_CC_MBSIZE_FOUR_Val,
86 MBSiz_8 = XDMAC_CC_MBSIZE_EIGHT_Val,
87 MBSiz_16 = XDMAC_CC_MBSIZE_SIXTEEN_Val
91 Periph2Mem = XDMAC_CC_DSYNC_PER2MEM_Val,
92 Mem2Periph = XDMAC_CC_DSYNC_MEM2PER_Val
96 Req_HW = XDMAC_CC_SWREQ_HWR_CONNECTED_Val,
97 Req_SW = XDMAC_CC_SWREQ_SWR_CONNECTED_Val
101 ChunkSiz_1 = XDMAC_CC_CSIZE_CHK_1_Val,
102 ChunkSiz_2 = XDMAC_CC_CSIZE_CHK_2_Val,
103 ChunkSiz_4 = XDMAC_CC_CSIZE_CHK_4_Val,
104 ChunkSiz_8 = XDMAC_CC_CSIZE_CHK_8_Val,
105 ChunkSiz_16 = XDMAC_CC_CSIZE_CHK_16_Val
109 DWidth_Byte = XDMAC_CC_DWIDTH_BYTE_Val,
110 DWidth_HalfWord = XDMAC_CC_DWIDTH_HALFWORD_Val,
111 DWidth_Word = XDMAC_CC_DWIDTH_WORD_Val
115 AHB_IF_0 = XDMAC_CC_SIF_AHB_IF0_Val,
116 AHB_IF_1 = XDMAC_CC_SIF_AHB_IF1_Val
120 AddrMode_Fixed = XDMAC_CC_SAM_FIXED_AM_Val,
121 AddrMode_Inc = XDMAC_CC_SAM_INCREMENTED_AM_Val,
122 AddrMode_uBS = XDMAC_CC_SAM_UBS_AM_Val,
123 AddrMode_uBS_DS = XDMAC_CC_SAM_UBS_DS_AM_Val
126 inline uint32_t readyStatus()
128 ctx[getID()].stickyISR |= ctx[getID()].lastISR = XDMAC_CIS;
129 return ctx[getID()].lastISR;
132 inline uint32_t getStatus() {
return ctx[getID()].lastISR;}
133 inline uint32_t getStickyStatus() {
return ctx[getID()].stickyISR;}
134 inline void clrStickyStatus(uint32_t mask = 0xFFFFFFFFul)
136 ctx[getID()].stickyISR &= ~mask;
138 inline uint32_t getID() {
return((XdmacChid *)
this) -
XDMAC->XDMAC_CHID;}
140 inline void enableGIrq() {
XDMAC->XDMAC_GIE = 1 << getID();}
141 inline void disableGIrq() {
XDMAC->XDMAC_GID = 1 << getID();}
143 inline void suspRd() {
XDMAC->XDMAC_GRS |= 1 << getID();}
144 inline void suspWr() {
XDMAC->XDMAC_GWS |= 1 << getID();}
145 inline void suspRdWr() {
XDMAC->XDMAC_GRWS = 1 << getID();}
146 inline void resRd() {
XDMAC->XDMAC_GRS &= ~(1 << getID());}
147 inline void resWr() {
XDMAC->XDMAC_GWS &= ~(1 << getID());}
148 inline void resRdWr() {
XDMAC->XDMAC_GRWR = 1 << getID();}
149 inline void flush() {
XDMAC->XDMAC_GSWF = 1 << getID();}
150 inline void disable() {
XDMAC->XDMAC_GD = 1 << getID();}
151 inline void enable() {
XDMAC->XDMAC_GE = 1 << getID();}
152 inline bool isEnabled() {
return(
XDMAC->XDMAC_GS) & (1 << getID());}
153 inline void suspRdAndFlush()
177 if ((XDMAC_CNDC & XDMAC_CNDC_NDE)
184 while (!(readyStatus() & XDMAC_CIS_FIS))
190 }
while (!(readyStatus() & XDMAC_CIS_FIS));
193 inline void sSrcAddr(uint32_t src) { XDMAC_CSA = src;}
194 inline void sDstAddr(uint32_t dst) { XDMAC_CDA = dst;}
195 inline uint32_t gSrcAddr() {
return XDMAC_CSA;}
196 inline uint32_t gDstAddr() {
return XDMAC_CDA;}
197 inline void suBLen(uint32_t uBLen) { XDMAC_CUBC = uBLen;}
198 inline void s_BLen(uint32_t BLen) { XDMAC_CBC = BLen;}
199 inline uint32_t guBLen() {
return XDMAC_CUBC;}
200 dma_transfer_desc_t * getNextDesc(uint32_t *remDataRet);
201 inline void *gNextDest()
203 dma_transfer_desc_t *desc = getNextDesc(NULL);
204 if ((XDMAC_CNDA & XDMAC_CNDA_NDA_Msk) == 0)
208 return(XDMAC_CNDC >> 3)
209 ? (
void *)(((dma_descview_1 *)XDMAC_CNDA)->dst)
210 : (void *)(((dma_descview_0 *)XDMAC_CNDA)->addr);
212 inline uint32_t gNextuBLen()
214 return((XDMAC_CNDA & XDMAC_CNDA_NDA_Msk) == 0)
216 : (((dma_descview_0 *)XDMAC_CNDA)->ubCtrl) & 0xFFFFFF;
218 void sNextDescAddr(dma_transfer_desc_t *pDesc);
219 inline uint32_t gXfrWidth()
220 {
return(XDMAC_CC & XDMAC_CC_DWIDTH_Msk) >> (XDMAC_CC_DWIDTH_Pos - 1);}
222 inline void sConfig(TransType_t type, MBSiz_t mbsiz, DSync_t dir,
223 SWReq_t reqSrc, ChunkSiz_t chunksiz, DWidth_t dataWidth,
224 AHB_IF_t srcIF, AHB_IF_t dstIF, AddrMode_t srcAddrMode,
225 AddrMode_t dstAddrMode, uint8_t periphID)
230 if (dataWidth != DWidth_Word)
232 if (srcAddrMode == AddrMode_Fixed)
234 srcAddrMode = AddrMode_uBS_DS;
236 XDMAC_CDS_MSP |= (0xFFFF);
239 XDMAC_CSUS = 0xFFFFFF;
241 if (dstAddrMode == AddrMode_Fixed)
243 dstAddrMode = AddrMode_uBS_DS;
245 XDMAC_CDS_MSP |= (0xFFFF << 16);
248 XDMAC_CDUS = 0xFFFFFF;
252 XDMAC_CC = (type << XDMAC_CC_TYPE_Pos) | (mbsiz << XDMAC_CC_MBSIZE_Pos)
253 | (dir << XDMAC_CC_DSYNC_Pos) | (chunksiz << XDMAC_CC_CSIZE_Pos)
254 | (dataWidth << XDMAC_CC_DWIDTH_Pos)
255 | (srcIF << XDMAC_CC_SIF_Pos) | (dstIF << XDMAC_CC_DIF_Pos)
256 | (srcAddrMode << XDMAC_CC_SAM_Pos)
257 | (dstAddrMode << XDMAC_CC_DAM_Pos)
258 | (periphID << XDMAC_CC_PERID_Pos);
263 inline void RegisterIsr(
void (*isr)(XdmaCh_t *)) { ctx[getID()].isr = isr;}
266 friend void XDMAC_Handler();
267 friend XdmaCh_t * xdmacGetFreeCh();
268 friend void xdmacReleaseCh(XdmaCh_t *xdmaCh);
271XdmaCh_t::AHB_IF_t xdmacGetIntfForAddr(uint32_t addr);
273inline void XdmaCh_t::sNextDescAddr(dma_transfer_desc_t *pDesc)
275 XDMAC_CNDA = (((uint32_t)pDesc) & ~0x3)
276 | xdmacGetIntfForAddr((uint32_t)pDesc);
279#define XDMA_BD_INUSE (0x1)
280#define XDMA_BD_SWEEP_MARK (0x2)
281#define XDMA_BD_BUFFER_DONE_Msk (XDMA_BD_SWEEP_MARK | XDMA_BD_INUSE)
282#define XDMA_BD_BUFFER_DONE (XDMA_BD_INUSE)
287 dma_descview_0 *descs;
288 dma_descview_0 *queueHead;
289 dma_descview_0 *modRelease;
296 bool spinOnLastNotNext;
298 uint32_t nConfigFirst;
304 int GetFreeDesc(dma_descview_0 *next);
305 dma_descview_0 * ModifyNextActive(uint32_t addr, uint32_t unumXfrs, uint32_t suspThresh);
306 void ConfigFirstAndEnableCh(uint32_t addr, uint32_t numXfrs);
307 dma_descview_0 * AddXfr(uint32_t addr, uint32_t numXfrs, uint32_t suspThresh);
310 void PrintDescChain();
NetBurner Real-Time Operating System (NBRTOS) API.
#define XDMAC
(XDMAC ) Base Address
Definition same70q21_sim.h:241