1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald * All rights reserved.
4*5fd0122aSMatthias Ringwald *
5*5fd0122aSMatthias Ringwald * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald * are met:
8*5fd0122aSMatthias Ringwald *
9*5fd0122aSMatthias Ringwald * * Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald * notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald *
12*5fd0122aSMatthias Ringwald * * Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald * documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald *
16*5fd0122aSMatthias Ringwald * * Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald * its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald * from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald *
20*5fd0122aSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald #include <stdint.h>
33*5fd0122aSMatthias Ringwald
34*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/debug.h>
35*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/interrupt.h>
36*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/dma.h>
37*5fd0122aSMatthias Ringwald
DMA_enableModule(void)38*5fd0122aSMatthias Ringwald void DMA_enableModule(void)
39*5fd0122aSMatthias Ringwald {
40*5fd0122aSMatthias Ringwald //
41*5fd0122aSMatthias Ringwald // Set the master enable bit in the config register.
42*5fd0122aSMatthias Ringwald //
43*5fd0122aSMatthias Ringwald DMA_Control->CFG = DMA_CFG_MASTEN;
44*5fd0122aSMatthias Ringwald }
45*5fd0122aSMatthias Ringwald
DMA_disableModule(void)46*5fd0122aSMatthias Ringwald void DMA_disableModule(void)
47*5fd0122aSMatthias Ringwald {
48*5fd0122aSMatthias Ringwald uint32_t i;
49*5fd0122aSMatthias Ringwald
50*5fd0122aSMatthias Ringwald //
51*5fd0122aSMatthias Ringwald // Clear the master enable bit in the config register.
52*5fd0122aSMatthias Ringwald //
53*5fd0122aSMatthias Ringwald DMA_Control->CFG = 0;
54*5fd0122aSMatthias Ringwald
55*5fd0122aSMatthias Ringwald //
56*5fd0122aSMatthias Ringwald // Clear all source configuration registers
57*5fd0122aSMatthias Ringwald //
58*5fd0122aSMatthias Ringwald i = DMA_Channel->DEVICE_CFG & 0xff;
59*5fd0122aSMatthias Ringwald while (i--) {
60*5fd0122aSMatthias Ringwald DMA_Channel->CH_SRCCFG[i] = 0;
61*5fd0122aSMatthias Ringwald }
62*5fd0122aSMatthias Ringwald }
63*5fd0122aSMatthias Ringwald
DMA_getErrorStatus(void)64*5fd0122aSMatthias Ringwald uint32_t DMA_getErrorStatus(void)
65*5fd0122aSMatthias Ringwald {
66*5fd0122aSMatthias Ringwald //
67*5fd0122aSMatthias Ringwald // Return the DMA error status.
68*5fd0122aSMatthias Ringwald //
69*5fd0122aSMatthias Ringwald return DMA_Control->ERRCLR;
70*5fd0122aSMatthias Ringwald }
71*5fd0122aSMatthias Ringwald
DMA_clearErrorStatus(void)72*5fd0122aSMatthias Ringwald void DMA_clearErrorStatus(void)
73*5fd0122aSMatthias Ringwald {
74*5fd0122aSMatthias Ringwald //
75*5fd0122aSMatthias Ringwald // Clear the DMA error interrupt.
76*5fd0122aSMatthias Ringwald //
77*5fd0122aSMatthias Ringwald DMA_Control->ERRCLR = 1;
78*5fd0122aSMatthias Ringwald }
79*5fd0122aSMatthias Ringwald
DMA_enableChannel(uint32_t channelNum)80*5fd0122aSMatthias Ringwald void DMA_enableChannel(uint32_t channelNum)
81*5fd0122aSMatthias Ringwald {
82*5fd0122aSMatthias Ringwald //
83*5fd0122aSMatthias Ringwald // Check the arguments.
84*5fd0122aSMatthias Ringwald //
85*5fd0122aSMatthias Ringwald ASSERT((channelNum & 0xffff) < 8);
86*5fd0122aSMatthias Ringwald
87*5fd0122aSMatthias Ringwald //
88*5fd0122aSMatthias Ringwald // Set the bit for this channel in the enable set register.
89*5fd0122aSMatthias Ringwald //
90*5fd0122aSMatthias Ringwald DMA_Control->ENASET = 1 << (channelNum & 0x0F);
91*5fd0122aSMatthias Ringwald }
92*5fd0122aSMatthias Ringwald
DMA_disableChannel(uint32_t channelNum)93*5fd0122aSMatthias Ringwald void DMA_disableChannel(uint32_t channelNum)
94*5fd0122aSMatthias Ringwald {
95*5fd0122aSMatthias Ringwald //
96*5fd0122aSMatthias Ringwald // Check the arguments.
97*5fd0122aSMatthias Ringwald //
98*5fd0122aSMatthias Ringwald ASSERT((channelNum & 0xffff) < 8);
99*5fd0122aSMatthias Ringwald
100*5fd0122aSMatthias Ringwald //
101*5fd0122aSMatthias Ringwald // Set the bit for this channel in the enable clear register.
102*5fd0122aSMatthias Ringwald //
103*5fd0122aSMatthias Ringwald DMA_Control->ENACLR = 1 << (channelNum & 0x0F);
104*5fd0122aSMatthias Ringwald }
105*5fd0122aSMatthias Ringwald
DMA_isChannelEnabled(uint32_t channelNum)106*5fd0122aSMatthias Ringwald bool DMA_isChannelEnabled(uint32_t channelNum)
107*5fd0122aSMatthias Ringwald {
108*5fd0122aSMatthias Ringwald //
109*5fd0122aSMatthias Ringwald // Check the arguments.
110*5fd0122aSMatthias Ringwald //
111*5fd0122aSMatthias Ringwald ASSERT((channelNum & 0xffff) < 8);
112*5fd0122aSMatthias Ringwald
113*5fd0122aSMatthias Ringwald //
114*5fd0122aSMatthias Ringwald // AND the specified channel bit with the enable register and return the
115*5fd0122aSMatthias Ringwald // result.
116*5fd0122aSMatthias Ringwald //
117*5fd0122aSMatthias Ringwald return ((DMA_Control->ENASET & (1 << (channelNum & 0x0F))) ? true : false);
118*5fd0122aSMatthias Ringwald }
119*5fd0122aSMatthias Ringwald
DMA_setControlBase(void * controlTable)120*5fd0122aSMatthias Ringwald void DMA_setControlBase(void *controlTable)
121*5fd0122aSMatthias Ringwald {
122*5fd0122aSMatthias Ringwald //
123*5fd0122aSMatthias Ringwald // Check the arguments.
124*5fd0122aSMatthias Ringwald //
125*5fd0122aSMatthias Ringwald ASSERT(((uint32_t) controlTable & ~0x3FF) == (uint32_t) controlTable);
126*5fd0122aSMatthias Ringwald ASSERT((uint32_t) controlTable >= 0x20000000);
127*5fd0122aSMatthias Ringwald
128*5fd0122aSMatthias Ringwald //
129*5fd0122aSMatthias Ringwald // Program the base address into the register.
130*5fd0122aSMatthias Ringwald //
131*5fd0122aSMatthias Ringwald DMA_Control->CTLBASE = (uint32_t) controlTable;
132*5fd0122aSMatthias Ringwald }
133*5fd0122aSMatthias Ringwald
DMA_getControlBase(void)134*5fd0122aSMatthias Ringwald void* DMA_getControlBase(void)
135*5fd0122aSMatthias Ringwald {
136*5fd0122aSMatthias Ringwald //
137*5fd0122aSMatthias Ringwald // Read the current value of the control base register and return it to
138*5fd0122aSMatthias Ringwald // the caller.
139*5fd0122aSMatthias Ringwald //
140*5fd0122aSMatthias Ringwald return ((void *) DMA_Control->CTLBASE);
141*5fd0122aSMatthias Ringwald }
142*5fd0122aSMatthias Ringwald
DMA_getControlAlternateBase(void)143*5fd0122aSMatthias Ringwald void* DMA_getControlAlternateBase(void)
144*5fd0122aSMatthias Ringwald {
145*5fd0122aSMatthias Ringwald //
146*5fd0122aSMatthias Ringwald // Read the current value of the control base register and return it to
147*5fd0122aSMatthias Ringwald // the caller.
148*5fd0122aSMatthias Ringwald //
149*5fd0122aSMatthias Ringwald return ((void *) DMA_Control->ALTBASE);
150*5fd0122aSMatthias Ringwald }
151*5fd0122aSMatthias Ringwald
DMA_requestChannel(uint32_t channelNum)152*5fd0122aSMatthias Ringwald void DMA_requestChannel(uint32_t channelNum)
153*5fd0122aSMatthias Ringwald {
154*5fd0122aSMatthias Ringwald //
155*5fd0122aSMatthias Ringwald // Check the arguments.
156*5fd0122aSMatthias Ringwald //
157*5fd0122aSMatthias Ringwald ASSERT((channelNum & 0xffff) < 8);
158*5fd0122aSMatthias Ringwald
159*5fd0122aSMatthias Ringwald //
160*5fd0122aSMatthias Ringwald // Set the bit for this channel in the software DMA request register.
161*5fd0122aSMatthias Ringwald //
162*5fd0122aSMatthias Ringwald DMA_Control->SWREQ = 1 << (channelNum & 0x0F);
163*5fd0122aSMatthias Ringwald }
164*5fd0122aSMatthias Ringwald
DMA_enableChannelAttribute(uint32_t channelNum,uint32_t attr)165*5fd0122aSMatthias Ringwald void DMA_enableChannelAttribute(uint32_t channelNum, uint32_t attr)
166*5fd0122aSMatthias Ringwald {
167*5fd0122aSMatthias Ringwald //
168*5fd0122aSMatthias Ringwald // Check the arguments.
169*5fd0122aSMatthias Ringwald //
170*5fd0122aSMatthias Ringwald ASSERT((channelNum & 0xffff) < 8);
171*5fd0122aSMatthias Ringwald ASSERT(
172*5fd0122aSMatthias Ringwald (attr
173*5fd0122aSMatthias Ringwald & ~(UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT
174*5fd0122aSMatthias Ringwald | UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK))
175*5fd0122aSMatthias Ringwald == 0);
176*5fd0122aSMatthias Ringwald
177*5fd0122aSMatthias Ringwald //
178*5fd0122aSMatthias Ringwald // In case a channel selector macro (like UDMA_CH0_USB0EP1RX) was
179*5fd0122aSMatthias Ringwald // passed as the channelNum parameter, extract just the channel number
180*5fd0122aSMatthias Ringwald // from this parameter.
181*5fd0122aSMatthias Ringwald //
182*5fd0122aSMatthias Ringwald channelNum &= 0x0F;
183*5fd0122aSMatthias Ringwald
184*5fd0122aSMatthias Ringwald //
185*5fd0122aSMatthias Ringwald // Set the useburst bit for this channel if set in config.
186*5fd0122aSMatthias Ringwald //
187*5fd0122aSMatthias Ringwald if (attr & UDMA_ATTR_USEBURST)
188*5fd0122aSMatthias Ringwald {
189*5fd0122aSMatthias Ringwald DMA_Control->USEBURSTSET = 1 << channelNum;
190*5fd0122aSMatthias Ringwald }
191*5fd0122aSMatthias Ringwald
192*5fd0122aSMatthias Ringwald //
193*5fd0122aSMatthias Ringwald // Set the alternate control select bit for this channel,
194*5fd0122aSMatthias Ringwald // if set in config.
195*5fd0122aSMatthias Ringwald //
196*5fd0122aSMatthias Ringwald if (attr & UDMA_ATTR_ALTSELECT)
197*5fd0122aSMatthias Ringwald {
198*5fd0122aSMatthias Ringwald DMA_Control->ALTSET = 1 << channelNum;
199*5fd0122aSMatthias Ringwald }
200*5fd0122aSMatthias Ringwald
201*5fd0122aSMatthias Ringwald //
202*5fd0122aSMatthias Ringwald // Set the high priority bit for this channel, if set in config.
203*5fd0122aSMatthias Ringwald //
204*5fd0122aSMatthias Ringwald if (attr & UDMA_ATTR_HIGH_PRIORITY)
205*5fd0122aSMatthias Ringwald {
206*5fd0122aSMatthias Ringwald DMA_Control->PRIOSET = 1 << channelNum;
207*5fd0122aSMatthias Ringwald }
208*5fd0122aSMatthias Ringwald
209*5fd0122aSMatthias Ringwald //
210*5fd0122aSMatthias Ringwald // Set the request mask bit for this channel, if set in config.
211*5fd0122aSMatthias Ringwald //
212*5fd0122aSMatthias Ringwald if (attr & UDMA_ATTR_REQMASK)
213*5fd0122aSMatthias Ringwald {
214*5fd0122aSMatthias Ringwald DMA_Control->REQMASKSET = 1 << channelNum;
215*5fd0122aSMatthias Ringwald }
216*5fd0122aSMatthias Ringwald }
217*5fd0122aSMatthias Ringwald
DMA_disableChannelAttribute(uint32_t channelNum,uint32_t attr)218*5fd0122aSMatthias Ringwald void DMA_disableChannelAttribute(uint32_t channelNum, uint32_t attr)
219*5fd0122aSMatthias Ringwald {
220*5fd0122aSMatthias Ringwald //
221*5fd0122aSMatthias Ringwald // Check the arguments.
222*5fd0122aSMatthias Ringwald //
223*5fd0122aSMatthias Ringwald ASSERT((channelNum & 0xffff) < 8);
224*5fd0122aSMatthias Ringwald ASSERT(
225*5fd0122aSMatthias Ringwald (attr
226*5fd0122aSMatthias Ringwald & ~(UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT
227*5fd0122aSMatthias Ringwald | UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK))
228*5fd0122aSMatthias Ringwald == 0);
229*5fd0122aSMatthias Ringwald
230*5fd0122aSMatthias Ringwald //
231*5fd0122aSMatthias Ringwald // In case a channel selector macro (like UDMA_CH0_USB0EP1RX) was
232*5fd0122aSMatthias Ringwald // passed as the channelNum parameter, extract just the channel number
233*5fd0122aSMatthias Ringwald // from this parameter.
234*5fd0122aSMatthias Ringwald //
235*5fd0122aSMatthias Ringwald channelNum &= 0x0F;
236*5fd0122aSMatthias Ringwald
237*5fd0122aSMatthias Ringwald //
238*5fd0122aSMatthias Ringwald // Clear the useburst bit for this channel if set in config.
239*5fd0122aSMatthias Ringwald //
240*5fd0122aSMatthias Ringwald if (attr & UDMA_ATTR_USEBURST)
241*5fd0122aSMatthias Ringwald {
242*5fd0122aSMatthias Ringwald DMA_Control->USEBURSTCLR = 1 << channelNum;
243*5fd0122aSMatthias Ringwald }
244*5fd0122aSMatthias Ringwald
245*5fd0122aSMatthias Ringwald //
246*5fd0122aSMatthias Ringwald // Clear the alternate control select bit for this channel, if set in
247*5fd0122aSMatthias Ringwald // config.
248*5fd0122aSMatthias Ringwald //
249*5fd0122aSMatthias Ringwald if (attr & UDMA_ATTR_ALTSELECT)
250*5fd0122aSMatthias Ringwald {
251*5fd0122aSMatthias Ringwald DMA_Control->ALTCLR = 1 << channelNum;
252*5fd0122aSMatthias Ringwald }
253*5fd0122aSMatthias Ringwald
254*5fd0122aSMatthias Ringwald //
255*5fd0122aSMatthias Ringwald // Clear the high priority bit for this channel, if set in config.
256*5fd0122aSMatthias Ringwald //
257*5fd0122aSMatthias Ringwald if (attr & UDMA_ATTR_HIGH_PRIORITY)
258*5fd0122aSMatthias Ringwald {
259*5fd0122aSMatthias Ringwald DMA_Control->PRIOCLR = 1 << channelNum;
260*5fd0122aSMatthias Ringwald }
261*5fd0122aSMatthias Ringwald
262*5fd0122aSMatthias Ringwald //
263*5fd0122aSMatthias Ringwald // Clear the request mask bit for this channel, if set in config.
264*5fd0122aSMatthias Ringwald //
265*5fd0122aSMatthias Ringwald if (attr & UDMA_ATTR_REQMASK)
266*5fd0122aSMatthias Ringwald {
267*5fd0122aSMatthias Ringwald DMA_Control->REQMASKCLR = 1 << channelNum;
268*5fd0122aSMatthias Ringwald }
269*5fd0122aSMatthias Ringwald }
270*5fd0122aSMatthias Ringwald
DMA_getChannelAttribute(uint32_t channelNum)271*5fd0122aSMatthias Ringwald uint32_t DMA_getChannelAttribute(uint32_t channelNum)
272*5fd0122aSMatthias Ringwald {
273*5fd0122aSMatthias Ringwald uint32_t attr = 0;
274*5fd0122aSMatthias Ringwald
275*5fd0122aSMatthias Ringwald //
276*5fd0122aSMatthias Ringwald // Check the arguments.
277*5fd0122aSMatthias Ringwald //
278*5fd0122aSMatthias Ringwald ASSERT((channelNum & 0xffff) < 8);
279*5fd0122aSMatthias Ringwald
280*5fd0122aSMatthias Ringwald //
281*5fd0122aSMatthias Ringwald // In case a channel selector macro (like UDMA_CH0_USB0EP1RX) was
282*5fd0122aSMatthias Ringwald // passed as the channelNum parameter, extract just the channel number
283*5fd0122aSMatthias Ringwald // from this parameter.
284*5fd0122aSMatthias Ringwald //
285*5fd0122aSMatthias Ringwald channelNum &= 0x0F;
286*5fd0122aSMatthias Ringwald
287*5fd0122aSMatthias Ringwald //
288*5fd0122aSMatthias Ringwald // Check to see if useburst bit is set for this channel.
289*5fd0122aSMatthias Ringwald //
290*5fd0122aSMatthias Ringwald if (DMA_Control->USEBURSTSET & (1 << channelNum))
291*5fd0122aSMatthias Ringwald {
292*5fd0122aSMatthias Ringwald attr |= UDMA_ATTR_USEBURST;
293*5fd0122aSMatthias Ringwald }
294*5fd0122aSMatthias Ringwald
295*5fd0122aSMatthias Ringwald //
296*5fd0122aSMatthias Ringwald // Check to see if the alternate control bit is set for this channel.
297*5fd0122aSMatthias Ringwald //
298*5fd0122aSMatthias Ringwald if (DMA_Control->ALTSET & (1 << channelNum))
299*5fd0122aSMatthias Ringwald {
300*5fd0122aSMatthias Ringwald attr |= UDMA_ATTR_ALTSELECT;
301*5fd0122aSMatthias Ringwald }
302*5fd0122aSMatthias Ringwald
303*5fd0122aSMatthias Ringwald //
304*5fd0122aSMatthias Ringwald // Check to see if the high priority bit is set for this channel.
305*5fd0122aSMatthias Ringwald //
306*5fd0122aSMatthias Ringwald if (DMA_Control->PRIOSET & (1 << channelNum))
307*5fd0122aSMatthias Ringwald {
308*5fd0122aSMatthias Ringwald attr |= UDMA_ATTR_HIGH_PRIORITY;
309*5fd0122aSMatthias Ringwald }
310*5fd0122aSMatthias Ringwald
311*5fd0122aSMatthias Ringwald //
312*5fd0122aSMatthias Ringwald // Check to see if the request mask bit is set for this channel.
313*5fd0122aSMatthias Ringwald //
314*5fd0122aSMatthias Ringwald if (DMA_Control->REQMASKSET & (1 << channelNum))
315*5fd0122aSMatthias Ringwald {
316*5fd0122aSMatthias Ringwald attr |= UDMA_ATTR_REQMASK;
317*5fd0122aSMatthias Ringwald }
318*5fd0122aSMatthias Ringwald
319*5fd0122aSMatthias Ringwald //
320*5fd0122aSMatthias Ringwald // Return the configuration flags.
321*5fd0122aSMatthias Ringwald //
322*5fd0122aSMatthias Ringwald return (attr);
323*5fd0122aSMatthias Ringwald }
324*5fd0122aSMatthias Ringwald
DMA_setChannelControl(uint32_t channelStructIndex,uint32_t control)325*5fd0122aSMatthias Ringwald void DMA_setChannelControl(uint32_t channelStructIndex, uint32_t control)
326*5fd0122aSMatthias Ringwald {
327*5fd0122aSMatthias Ringwald DMA_ControlTable *pCtl;
328*5fd0122aSMatthias Ringwald
329*5fd0122aSMatthias Ringwald //
330*5fd0122aSMatthias Ringwald // Check the arguments.
331*5fd0122aSMatthias Ringwald //
332*5fd0122aSMatthias Ringwald ASSERT((channelStructIndex & 0xffff) < 64);
333*5fd0122aSMatthias Ringwald ASSERT(DMA_Control->CTLBASE != 0);
334*5fd0122aSMatthias Ringwald
335*5fd0122aSMatthias Ringwald //
336*5fd0122aSMatthias Ringwald // In case a channel selector macro (like UDMA_CH0_USB0EP1RX) was
337*5fd0122aSMatthias Ringwald // passed as the channelStructIndex parameter, extract just the channel
338*5fd0122aSMatthias Ringwald // index from this parameter.
339*5fd0122aSMatthias Ringwald //
340*5fd0122aSMatthias Ringwald channelStructIndex &= 0x3f;
341*5fd0122aSMatthias Ringwald
342*5fd0122aSMatthias Ringwald //
343*5fd0122aSMatthias Ringwald // Get the base address of the control table.
344*5fd0122aSMatthias Ringwald //
345*5fd0122aSMatthias Ringwald pCtl = (DMA_ControlTable *) DMA_Control->CTLBASE;
346*5fd0122aSMatthias Ringwald
347*5fd0122aSMatthias Ringwald //
348*5fd0122aSMatthias Ringwald // Get the current control word value and mask off the fields to be
349*5fd0122aSMatthias Ringwald // changed, then OR in the new settings.
350*5fd0122aSMatthias Ringwald //
351*5fd0122aSMatthias Ringwald pCtl[channelStructIndex].control = ((pCtl[channelStructIndex].control
352*5fd0122aSMatthias Ringwald & ~(UDMA_CHCTL_DSTINC_M | UDMA_CHCTL_DSTSIZE_M | UDMA_CHCTL_SRCINC_M
353*5fd0122aSMatthias Ringwald | UDMA_CHCTL_SRCSIZE_M | UDMA_CHCTL_ARBSIZE_M
354*5fd0122aSMatthias Ringwald | UDMA_CHCTL_NXTUSEBURST)) | control);
355*5fd0122aSMatthias Ringwald }
356*5fd0122aSMatthias Ringwald
DMA_setChannelTransfer(uint32_t channelStructIndex,uint32_t mode,void * srcAddr,void * dstAddr,uint32_t transferSize)357*5fd0122aSMatthias Ringwald void DMA_setChannelTransfer(uint32_t channelStructIndex, uint32_t mode,
358*5fd0122aSMatthias Ringwald void *srcAddr, void *dstAddr, uint32_t transferSize)
359*5fd0122aSMatthias Ringwald {
360*5fd0122aSMatthias Ringwald DMA_ControlTable *controlTable;
361*5fd0122aSMatthias Ringwald uint32_t control;
362*5fd0122aSMatthias Ringwald uint32_t increment;
363*5fd0122aSMatthias Ringwald uint32_t bufferBytes;
364*5fd0122aSMatthias Ringwald
365*5fd0122aSMatthias Ringwald //
366*5fd0122aSMatthias Ringwald // Check the arguments.
367*5fd0122aSMatthias Ringwald //
368*5fd0122aSMatthias Ringwald ASSERT((channelStructIndex & 0xffff) < 64);
369*5fd0122aSMatthias Ringwald ASSERT(DMA->CTLBASE != 0);
370*5fd0122aSMatthias Ringwald ASSERT(mode <= UDMA_MODE_PER_SCATTER_GATHER);
371*5fd0122aSMatthias Ringwald ASSERT((transferSize != 0) && (transferSize <= 1024));
372*5fd0122aSMatthias Ringwald
373*5fd0122aSMatthias Ringwald //
374*5fd0122aSMatthias Ringwald // In case a channel selector macro (like UDMA_CH0_USB0EP1RX) was
375*5fd0122aSMatthias Ringwald // passed as the channelStructIndex parameter, extract just the channel
376*5fd0122aSMatthias Ringwald // index from this parameter.
377*5fd0122aSMatthias Ringwald //
378*5fd0122aSMatthias Ringwald channelStructIndex &= 0x3f;
379*5fd0122aSMatthias Ringwald
380*5fd0122aSMatthias Ringwald //
381*5fd0122aSMatthias Ringwald // Get the base address of the control table.
382*5fd0122aSMatthias Ringwald //
383*5fd0122aSMatthias Ringwald controlTable = (DMA_ControlTable *) DMA_Control->CTLBASE;
384*5fd0122aSMatthias Ringwald
385*5fd0122aSMatthias Ringwald //
386*5fd0122aSMatthias Ringwald // Get the current control word value and mask off the mode and size
387*5fd0122aSMatthias Ringwald // fields.
388*5fd0122aSMatthias Ringwald //
389*5fd0122aSMatthias Ringwald control = (controlTable[channelStructIndex].control
390*5fd0122aSMatthias Ringwald & ~(UDMA_CHCTL_XFERSIZE_M | UDMA_CHCTL_XFERMODE_M));
391*5fd0122aSMatthias Ringwald
392*5fd0122aSMatthias Ringwald //
393*5fd0122aSMatthias Ringwald // Adjust the mode if the alt control structure is selected.
394*5fd0122aSMatthias Ringwald //
395*5fd0122aSMatthias Ringwald if (channelStructIndex & UDMA_ALT_SELECT)
396*5fd0122aSMatthias Ringwald {
397*5fd0122aSMatthias Ringwald if ((mode == UDMA_MODE_MEM_SCATTER_GATHER)
398*5fd0122aSMatthias Ringwald || (mode == UDMA_MODE_PER_SCATTER_GATHER))
399*5fd0122aSMatthias Ringwald {
400*5fd0122aSMatthias Ringwald mode |= UDMA_MODE_ALT_SELECT;
401*5fd0122aSMatthias Ringwald }
402*5fd0122aSMatthias Ringwald }
403*5fd0122aSMatthias Ringwald
404*5fd0122aSMatthias Ringwald //
405*5fd0122aSMatthias Ringwald // Set the transfer size and mode in the control word (but don't write the
406*5fd0122aSMatthias Ringwald // control word yet as it could kick off a transfer).
407*5fd0122aSMatthias Ringwald //
408*5fd0122aSMatthias Ringwald control |= mode | ((transferSize - 1) << 4);
409*5fd0122aSMatthias Ringwald
410*5fd0122aSMatthias Ringwald //
411*5fd0122aSMatthias Ringwald // Get the address increment value for the source, from the control word.
412*5fd0122aSMatthias Ringwald //
413*5fd0122aSMatthias Ringwald increment = (control & UDMA_CHCTL_SRCINC_M);
414*5fd0122aSMatthias Ringwald
415*5fd0122aSMatthias Ringwald //
416*5fd0122aSMatthias Ringwald // Compute the ending source address of the transfer. If the source
417*5fd0122aSMatthias Ringwald // increment is set to none, then the ending address is the same as the
418*5fd0122aSMatthias Ringwald // beginning.
419*5fd0122aSMatthias Ringwald //
420*5fd0122aSMatthias Ringwald if (increment != UDMA_SRC_INC_NONE)
421*5fd0122aSMatthias Ringwald {
422*5fd0122aSMatthias Ringwald increment = increment >> 26;
423*5fd0122aSMatthias Ringwald bufferBytes = (transferSize - 1) << increment;
424*5fd0122aSMatthias Ringwald srcAddr = (void *) ((uint32_t) srcAddr + bufferBytes);
425*5fd0122aSMatthias Ringwald }
426*5fd0122aSMatthias Ringwald
427*5fd0122aSMatthias Ringwald //
428*5fd0122aSMatthias Ringwald // Load the source ending address into the control block.
429*5fd0122aSMatthias Ringwald //
430*5fd0122aSMatthias Ringwald controlTable[channelStructIndex].srcEndAddr = srcAddr;
431*5fd0122aSMatthias Ringwald
432*5fd0122aSMatthias Ringwald //
433*5fd0122aSMatthias Ringwald // Get the address increment value for the destination, from the control
434*5fd0122aSMatthias Ringwald // word.
435*5fd0122aSMatthias Ringwald //
436*5fd0122aSMatthias Ringwald increment = control & UDMA_CHCTL_DSTINC_M;
437*5fd0122aSMatthias Ringwald
438*5fd0122aSMatthias Ringwald //
439*5fd0122aSMatthias Ringwald // Compute the ending destination address of the transfer. If the
440*5fd0122aSMatthias Ringwald // destination increment is set to none, then the ending address is the
441*5fd0122aSMatthias Ringwald // same as the beginning.
442*5fd0122aSMatthias Ringwald //
443*5fd0122aSMatthias Ringwald if (increment != UDMA_DST_INC_NONE)
444*5fd0122aSMatthias Ringwald {
445*5fd0122aSMatthias Ringwald //
446*5fd0122aSMatthias Ringwald // There is a special case if this is setting up a scatter-gather
447*5fd0122aSMatthias Ringwald // transfer. The destination pointer must point to the end of
448*5fd0122aSMatthias Ringwald // the alternate structure for this channel instead of calculating
449*5fd0122aSMatthias Ringwald // the end of the buffer in the normal way.
450*5fd0122aSMatthias Ringwald //
451*5fd0122aSMatthias Ringwald if ((mode == UDMA_MODE_MEM_SCATTER_GATHER)
452*5fd0122aSMatthias Ringwald || (mode == UDMA_MODE_PER_SCATTER_GATHER))
453*5fd0122aSMatthias Ringwald {
454*5fd0122aSMatthias Ringwald dstAddr = (void *) &controlTable[channelStructIndex
455*5fd0122aSMatthias Ringwald | UDMA_ALT_SELECT].spare;
456*5fd0122aSMatthias Ringwald }
457*5fd0122aSMatthias Ringwald //
458*5fd0122aSMatthias Ringwald // Not a scatter-gather transfer, calculate end pointer normally.
459*5fd0122aSMatthias Ringwald //
460*5fd0122aSMatthias Ringwald else
461*5fd0122aSMatthias Ringwald {
462*5fd0122aSMatthias Ringwald increment = increment >> 30;
463*5fd0122aSMatthias Ringwald bufferBytes = (transferSize - 1) << increment;
464*5fd0122aSMatthias Ringwald dstAddr = (void *) ((uint32_t) dstAddr + bufferBytes);
465*5fd0122aSMatthias Ringwald }
466*5fd0122aSMatthias Ringwald }
467*5fd0122aSMatthias Ringwald
468*5fd0122aSMatthias Ringwald //
469*5fd0122aSMatthias Ringwald // Load the destination ending address into the control block.
470*5fd0122aSMatthias Ringwald //
471*5fd0122aSMatthias Ringwald controlTable[channelStructIndex].dstEndAddr = dstAddr;
472*5fd0122aSMatthias Ringwald
473*5fd0122aSMatthias Ringwald //
474*5fd0122aSMatthias Ringwald // Write the new control word value.
475*5fd0122aSMatthias Ringwald //
476*5fd0122aSMatthias Ringwald controlTable[channelStructIndex].control = control;
477*5fd0122aSMatthias Ringwald }
478*5fd0122aSMatthias Ringwald
DMA_setChannelScatterGather(uint32_t channelNum,uint32_t taskCount,void * taskList,uint32_t isPeriphSG)479*5fd0122aSMatthias Ringwald void DMA_setChannelScatterGather(uint32_t channelNum, uint32_t taskCount,
480*5fd0122aSMatthias Ringwald void *taskList, uint32_t isPeriphSG)
481*5fd0122aSMatthias Ringwald {
482*5fd0122aSMatthias Ringwald DMA_ControlTable *controlTable;
483*5fd0122aSMatthias Ringwald DMA_ControlTable *pTaskTable;
484*5fd0122aSMatthias Ringwald
485*5fd0122aSMatthias Ringwald //
486*5fd0122aSMatthias Ringwald // Check the parameters
487*5fd0122aSMatthias Ringwald //
488*5fd0122aSMatthias Ringwald ASSERT((channelNum & 0xffff) < 8);
489*5fd0122aSMatthias Ringwald ASSERT(DMA->CTLBASE != 0);
490*5fd0122aSMatthias Ringwald ASSERT(taskList != 0);
491*5fd0122aSMatthias Ringwald ASSERT(taskCount <= 1024);
492*5fd0122aSMatthias Ringwald ASSERT(taskCount != 0);
493*5fd0122aSMatthias Ringwald
494*5fd0122aSMatthias Ringwald //
495*5fd0122aSMatthias Ringwald // In case a channel selector macro (like UDMA_CH0_USB0EP1RX) was
496*5fd0122aSMatthias Ringwald // passed as the channelNum parameter, extract just the channel number
497*5fd0122aSMatthias Ringwald // from this parameter.
498*5fd0122aSMatthias Ringwald //
499*5fd0122aSMatthias Ringwald channelNum &= 0x0F;
500*5fd0122aSMatthias Ringwald
501*5fd0122aSMatthias Ringwald //
502*5fd0122aSMatthias Ringwald // Get the base address of the control table.
503*5fd0122aSMatthias Ringwald //
504*5fd0122aSMatthias Ringwald controlTable = (DMA_ControlTable *) DMA_Control->CTLBASE;
505*5fd0122aSMatthias Ringwald
506*5fd0122aSMatthias Ringwald //
507*5fd0122aSMatthias Ringwald // Get a handy pointer to the task list
508*5fd0122aSMatthias Ringwald //
509*5fd0122aSMatthias Ringwald pTaskTable = (DMA_ControlTable *) taskList;
510*5fd0122aSMatthias Ringwald
511*5fd0122aSMatthias Ringwald //
512*5fd0122aSMatthias Ringwald // Compute the ending address for the source pointer. This address is the
513*5fd0122aSMatthias Ringwald // last element of the last task in the task table
514*5fd0122aSMatthias Ringwald //
515*5fd0122aSMatthias Ringwald controlTable[channelNum].srcEndAddr = &pTaskTable[taskCount - 1].spare;
516*5fd0122aSMatthias Ringwald
517*5fd0122aSMatthias Ringwald //
518*5fd0122aSMatthias Ringwald // Compute the ending address for the destination pointer. This address
519*5fd0122aSMatthias Ringwald // is the end of the alternate structure for this channel.
520*5fd0122aSMatthias Ringwald //
521*5fd0122aSMatthias Ringwald controlTable[channelNum].dstEndAddr = &controlTable[channelNum
522*5fd0122aSMatthias Ringwald | UDMA_ALT_SELECT].spare;
523*5fd0122aSMatthias Ringwald
524*5fd0122aSMatthias Ringwald //
525*5fd0122aSMatthias Ringwald // Compute the control word. Most configurable items are fixed for
526*5fd0122aSMatthias Ringwald // scatter-gather. Item and increment sizes are all 32-bit and arb
527*5fd0122aSMatthias Ringwald // size must be 4. The count is the number of items in the task list
528*5fd0122aSMatthias Ringwald // times 4 (4 words per task).
529*5fd0122aSMatthias Ringwald //
530*5fd0122aSMatthias Ringwald controlTable[channelNum].control = (UDMA_CHCTL_DSTINC_32
531*5fd0122aSMatthias Ringwald | UDMA_CHCTL_DSTSIZE_32 | UDMA_CHCTL_SRCINC_32
532*5fd0122aSMatthias Ringwald | UDMA_CHCTL_SRCSIZE_32 | UDMA_CHCTL_ARBSIZE_4
533*5fd0122aSMatthias Ringwald | (((taskCount * 4) - 1) << UDMA_CHCTL_XFERSIZE_S)
534*5fd0122aSMatthias Ringwald | (isPeriphSG ?
535*5fd0122aSMatthias Ringwald UDMA_CHCTL_XFERMODE_PER_SG :
536*5fd0122aSMatthias Ringwald UDMA_CHCTL_XFERMODE_MEM_SG));
537*5fd0122aSMatthias Ringwald
538*5fd0122aSMatthias Ringwald //
539*5fd0122aSMatthias Ringwald // Scatter-gather operations can leave the alt bit set. So if doing
540*5fd0122aSMatthias Ringwald // back to back scatter-gather transfers, the second attempt may not
541*5fd0122aSMatthias Ringwald // work correctly because the alt bit is set. Therefore, clear the
542*5fd0122aSMatthias Ringwald // alt bit here to ensure that it is always cleared before a new SG
543*5fd0122aSMatthias Ringwald // transfer is started.
544*5fd0122aSMatthias Ringwald //
545*5fd0122aSMatthias Ringwald DMA_Control->ALTCLR = 1 << channelNum;
546*5fd0122aSMatthias Ringwald }
547*5fd0122aSMatthias Ringwald
DMA_getChannelSize(uint32_t channelStructIndex)548*5fd0122aSMatthias Ringwald uint32_t DMA_getChannelSize(uint32_t channelStructIndex)
549*5fd0122aSMatthias Ringwald {
550*5fd0122aSMatthias Ringwald DMA_ControlTable *controlTable;
551*5fd0122aSMatthias Ringwald uint32_t control;
552*5fd0122aSMatthias Ringwald
553*5fd0122aSMatthias Ringwald //
554*5fd0122aSMatthias Ringwald // Check the arguments.
555*5fd0122aSMatthias Ringwald //
556*5fd0122aSMatthias Ringwald ASSERT((channelStructIndex & 0xffff) < 16);
557*5fd0122aSMatthias Ringwald ASSERT(DMA->CTLBASE != 0);
558*5fd0122aSMatthias Ringwald
559*5fd0122aSMatthias Ringwald //
560*5fd0122aSMatthias Ringwald // In case a channel selector macro (like UDMA_CH0_USB0EP1RX) was
561*5fd0122aSMatthias Ringwald // passed as the channelStructIndex parameter, extract just the channel
562*5fd0122aSMatthias Ringwald // index from this parameter.
563*5fd0122aSMatthias Ringwald //
564*5fd0122aSMatthias Ringwald channelStructIndex &= 0x3f;
565*5fd0122aSMatthias Ringwald
566*5fd0122aSMatthias Ringwald //
567*5fd0122aSMatthias Ringwald // Get the base address of the control table.
568*5fd0122aSMatthias Ringwald //
569*5fd0122aSMatthias Ringwald controlTable = (DMA_ControlTable *) DMA_Control->CTLBASE;
570*5fd0122aSMatthias Ringwald
571*5fd0122aSMatthias Ringwald //
572*5fd0122aSMatthias Ringwald // Get the current control word value and mask off all but the size field
573*5fd0122aSMatthias Ringwald // and the mode field.
574*5fd0122aSMatthias Ringwald //
575*5fd0122aSMatthias Ringwald control = (controlTable[channelStructIndex].control
576*5fd0122aSMatthias Ringwald & (UDMA_CHCTL_XFERSIZE_M | UDMA_CHCTL_XFERMODE_M));
577*5fd0122aSMatthias Ringwald
578*5fd0122aSMatthias Ringwald //
579*5fd0122aSMatthias Ringwald // If the size field and mode field are 0 then the transfer is finished
580*5fd0122aSMatthias Ringwald // and there are no more items to transfer
581*5fd0122aSMatthias Ringwald //
582*5fd0122aSMatthias Ringwald if (control == 0)
583*5fd0122aSMatthias Ringwald {
584*5fd0122aSMatthias Ringwald return (0);
585*5fd0122aSMatthias Ringwald }
586*5fd0122aSMatthias Ringwald
587*5fd0122aSMatthias Ringwald //
588*5fd0122aSMatthias Ringwald // Otherwise, if either the size field or more field is non-zero, then
589*5fd0122aSMatthias Ringwald // not all the items have been transferred.
590*5fd0122aSMatthias Ringwald //
591*5fd0122aSMatthias Ringwald else
592*5fd0122aSMatthias Ringwald {
593*5fd0122aSMatthias Ringwald //
594*5fd0122aSMatthias Ringwald // Shift the size field and add one, then return to user.
595*5fd0122aSMatthias Ringwald //
596*5fd0122aSMatthias Ringwald return ((control >> 4) + 1);
597*5fd0122aSMatthias Ringwald }
598*5fd0122aSMatthias Ringwald }
599*5fd0122aSMatthias Ringwald
DMA_getChannelMode(uint32_t channelStructIndex)600*5fd0122aSMatthias Ringwald uint32_t DMA_getChannelMode(uint32_t channelStructIndex)
601*5fd0122aSMatthias Ringwald {
602*5fd0122aSMatthias Ringwald DMA_ControlTable *controlTable;
603*5fd0122aSMatthias Ringwald uint32_t control;
604*5fd0122aSMatthias Ringwald
605*5fd0122aSMatthias Ringwald //
606*5fd0122aSMatthias Ringwald // Check the arguments.
607*5fd0122aSMatthias Ringwald //
608*5fd0122aSMatthias Ringwald ASSERT((channelStructIndex & 0xffff) < 64);
609*5fd0122aSMatthias Ringwald ASSERT(DMA->CTLBASE != 0);
610*5fd0122aSMatthias Ringwald
611*5fd0122aSMatthias Ringwald //
612*5fd0122aSMatthias Ringwald // In case a channel selector macro (like UDMA_CH0_USB0EP1RX) was
613*5fd0122aSMatthias Ringwald // passed as the channelStructIndex parameter, extract just the channel
614*5fd0122aSMatthias Ringwald // index from this parameter.
615*5fd0122aSMatthias Ringwald //
616*5fd0122aSMatthias Ringwald channelStructIndex &= 0x3f;
617*5fd0122aSMatthias Ringwald
618*5fd0122aSMatthias Ringwald //
619*5fd0122aSMatthias Ringwald // Get the base address of the control table.
620*5fd0122aSMatthias Ringwald //
621*5fd0122aSMatthias Ringwald controlTable = (DMA_ControlTable *) DMA_Control->CTLBASE;
622*5fd0122aSMatthias Ringwald
623*5fd0122aSMatthias Ringwald //
624*5fd0122aSMatthias Ringwald // Get the current control word value and mask off all but the mode field.
625*5fd0122aSMatthias Ringwald //
626*5fd0122aSMatthias Ringwald control =
627*5fd0122aSMatthias Ringwald (controlTable[channelStructIndex].control & UDMA_CHCTL_XFERMODE_M);
628*5fd0122aSMatthias Ringwald
629*5fd0122aSMatthias Ringwald //
630*5fd0122aSMatthias Ringwald // Check if scatter/gather mode, and if so, mask off the alt bit.
631*5fd0122aSMatthias Ringwald //
632*5fd0122aSMatthias Ringwald if (((control & ~UDMA_MODE_ALT_SELECT) == UDMA_MODE_MEM_SCATTER_GATHER)
633*5fd0122aSMatthias Ringwald || ((control & ~UDMA_MODE_ALT_SELECT)
634*5fd0122aSMatthias Ringwald == UDMA_MODE_PER_SCATTER_GATHER))
635*5fd0122aSMatthias Ringwald {
636*5fd0122aSMatthias Ringwald control &= ~UDMA_MODE_ALT_SELECT;
637*5fd0122aSMatthias Ringwald }
638*5fd0122aSMatthias Ringwald
639*5fd0122aSMatthias Ringwald //
640*5fd0122aSMatthias Ringwald // Return the mode to the caller.
641*5fd0122aSMatthias Ringwald //
642*5fd0122aSMatthias Ringwald return (control);
643*5fd0122aSMatthias Ringwald }
644*5fd0122aSMatthias Ringwald
DMA_assignChannel(uint32_t mapping)645*5fd0122aSMatthias Ringwald void DMA_assignChannel(uint32_t mapping)
646*5fd0122aSMatthias Ringwald {
647*5fd0122aSMatthias Ringwald switch (mapping)
648*5fd0122aSMatthias Ringwald {
649*5fd0122aSMatthias Ringwald case DMA_CH0_RESERVED0:
650*5fd0122aSMatthias Ringwald case DMA_CH0_EUSCIA0TX:
651*5fd0122aSMatthias Ringwald case DMA_CH0_EUSCIB0TX0:
652*5fd0122aSMatthias Ringwald case DMA_CH0_EUSCIB3TX1:
653*5fd0122aSMatthias Ringwald case DMA_CH0_EUSCIB2TX2:
654*5fd0122aSMatthias Ringwald case DMA_CH0_EUSCIB1TX3:
655*5fd0122aSMatthias Ringwald case DMA_CH0_TIMERA0CCR0:
656*5fd0122aSMatthias Ringwald case DMA_CH0_AESTRIGGER0:
657*5fd0122aSMatthias Ringwald DMA_Channel->CH_SRCCFG[0] = (mapping >> 24) & 0x1F;
658*5fd0122aSMatthias Ringwald break;
659*5fd0122aSMatthias Ringwald case DMA_CH1_RESERVED0:
660*5fd0122aSMatthias Ringwald case DMA_CH1_EUSCIA0RX:
661*5fd0122aSMatthias Ringwald case DMA_CH1_EUSCIB0RX0:
662*5fd0122aSMatthias Ringwald case DMA_CH1_EUSCIB3RX1:
663*5fd0122aSMatthias Ringwald case DMA_CH1_EUSCIB2RX2:
664*5fd0122aSMatthias Ringwald case DMA_CH1_EUSCIB1RX3:
665*5fd0122aSMatthias Ringwald case DMA_CH1_TIMERA0CCR2:
666*5fd0122aSMatthias Ringwald case DMA_CH1_AESTRIGGER1:
667*5fd0122aSMatthias Ringwald DMA_Channel->CH_SRCCFG[1] = (mapping >> 24) & 0x1F;
668*5fd0122aSMatthias Ringwald break;
669*5fd0122aSMatthias Ringwald case DMA_CH2_RESERVED0:
670*5fd0122aSMatthias Ringwald case DMA_CH2_EUSCIA1TX:
671*5fd0122aSMatthias Ringwald case DMA_CH2_EUSCIB1TX0:
672*5fd0122aSMatthias Ringwald case DMA_CH2_EUSCIB0TX1:
673*5fd0122aSMatthias Ringwald case DMA_CH2_EUSCIB3TX2:
674*5fd0122aSMatthias Ringwald case DMA_CH2_EUSCIB2TX3:
675*5fd0122aSMatthias Ringwald case DMA_CH2_TIMERA1CCR0:
676*5fd0122aSMatthias Ringwald case DMA_CH2_AESTRIGGER2:
677*5fd0122aSMatthias Ringwald DMA_Channel->CH_SRCCFG[2] = (mapping >> 24) & 0x1F;
678*5fd0122aSMatthias Ringwald break;
679*5fd0122aSMatthias Ringwald case DMA_CH3_RESERVED0:
680*5fd0122aSMatthias Ringwald case DMA_CH3_EUSCIA1RX:
681*5fd0122aSMatthias Ringwald case DMA_CH3_EUSCIB1RX0:
682*5fd0122aSMatthias Ringwald case DMA_CH3_EUSCIB0RX1:
683*5fd0122aSMatthias Ringwald case DMA_CH3_EUSCIB3RX2:
684*5fd0122aSMatthias Ringwald case DMA_CH3_EUSCIB2RX3:
685*5fd0122aSMatthias Ringwald case DMA_CH3_TIMERA1CCR2:
686*5fd0122aSMatthias Ringwald case DMA_CH3_RESERVED1:
687*5fd0122aSMatthias Ringwald DMA_Channel->CH_SRCCFG[3] = (mapping >> 24) & 0x1F;
688*5fd0122aSMatthias Ringwald break;
689*5fd0122aSMatthias Ringwald case DMA_CH4_RESERVED0:
690*5fd0122aSMatthias Ringwald case DMA_CH4_EUSCIA2TX:
691*5fd0122aSMatthias Ringwald case DMA_CH4_EUSCIB2TX0:
692*5fd0122aSMatthias Ringwald case DMA_CH4_EUSCIB1TX1:
693*5fd0122aSMatthias Ringwald case DMA_CH4_EUSCIB0TX2:
694*5fd0122aSMatthias Ringwald case DMA_CH4_EUSCIB3TX3:
695*5fd0122aSMatthias Ringwald case DMA_CH4_TIMERA2CCR0:
696*5fd0122aSMatthias Ringwald case DMA_CH4_RESERVED1:
697*5fd0122aSMatthias Ringwald DMA_Channel->CH_SRCCFG[4] = (mapping >> 24) & 0x1F;
698*5fd0122aSMatthias Ringwald break;
699*5fd0122aSMatthias Ringwald case DMA_CH5_RESERVED0:
700*5fd0122aSMatthias Ringwald case DMA_CH5_EUSCIA2RX:
701*5fd0122aSMatthias Ringwald case DMA_CH5_EUSCIB2RX0:
702*5fd0122aSMatthias Ringwald case DMA_CH5_EUSCIB1RX1:
703*5fd0122aSMatthias Ringwald case DMA_CH5_EUSCIB0RX2:
704*5fd0122aSMatthias Ringwald case DMA_CH5_EUSCIB3RX3:
705*5fd0122aSMatthias Ringwald case DMA_CH5_TIMERA2CCR2:
706*5fd0122aSMatthias Ringwald case DMA_CH5_RESERVED1:
707*5fd0122aSMatthias Ringwald DMA_Channel->CH_SRCCFG[5] = (mapping >> 24) & 0x1F;
708*5fd0122aSMatthias Ringwald break;
709*5fd0122aSMatthias Ringwald case DMA_CH6_RESERVED0:
710*5fd0122aSMatthias Ringwald case DMA_CH6_EUSCIA3TX:
711*5fd0122aSMatthias Ringwald case DMA_CH6_EUSCIB3TX0:
712*5fd0122aSMatthias Ringwald case DMA_CH6_EUSCIB2TX1:
713*5fd0122aSMatthias Ringwald case DMA_CH6_EUSCIB1TX2:
714*5fd0122aSMatthias Ringwald case DMA_CH6_EUSCIB0TX3:
715*5fd0122aSMatthias Ringwald case DMA_CH6_TIMERA3CCR0:
716*5fd0122aSMatthias Ringwald case DMA_CH6_EXTERNALPIN:
717*5fd0122aSMatthias Ringwald DMA_Channel->CH_SRCCFG[6] = (mapping >> 24) & 0x1F;
718*5fd0122aSMatthias Ringwald break;
719*5fd0122aSMatthias Ringwald case DMA_CH7_RESERVED0:
720*5fd0122aSMatthias Ringwald case DMA_CH7_EUSCIA3RX:
721*5fd0122aSMatthias Ringwald case DMA_CH7_EUSCIB3RX0:
722*5fd0122aSMatthias Ringwald case DMA_CH7_EUSCIB2RX1:
723*5fd0122aSMatthias Ringwald case DMA_CH7_EUSCIB1RX2:
724*5fd0122aSMatthias Ringwald case DMA_CH7_EUSCIB0RX3:
725*5fd0122aSMatthias Ringwald case DMA_CH7_TIMERA3CCR2:
726*5fd0122aSMatthias Ringwald case DMA_CH7_ADC14:
727*5fd0122aSMatthias Ringwald DMA_Channel->CH_SRCCFG[7] = (mapping >> 24) & 0x1F;
728*5fd0122aSMatthias Ringwald break;
729*5fd0122aSMatthias Ringwald default:
730*5fd0122aSMatthias Ringwald ASSERT(false);
731*5fd0122aSMatthias Ringwald }
732*5fd0122aSMatthias Ringwald
733*5fd0122aSMatthias Ringwald }
734*5fd0122aSMatthias Ringwald
DMA_assignInterrupt(uint32_t interruptNumber,uint32_t channel)735*5fd0122aSMatthias Ringwald void DMA_assignInterrupt(uint32_t interruptNumber, uint32_t channel)
736*5fd0122aSMatthias Ringwald {
737*5fd0122aSMatthias Ringwald ASSERT(
738*5fd0122aSMatthias Ringwald interruptNumber == DMA_INT1 || interruptNumber == DMA_INT2
739*5fd0122aSMatthias Ringwald || interruptNumber == DMA_INT3);
740*5fd0122aSMatthias Ringwald
741*5fd0122aSMatthias Ringwald if (interruptNumber == DMA_INT1)
742*5fd0122aSMatthias Ringwald {
743*5fd0122aSMatthias Ringwald DMA_Channel->INT1_SRCCFG = (DMA_Channel->INT1_SRCCFG
744*5fd0122aSMatthias Ringwald & ~DMA_INT1_SRCCFG_INT_SRC_MASK) | channel;
745*5fd0122aSMatthias Ringwald } else if (interruptNumber == DMA_INT2)
746*5fd0122aSMatthias Ringwald {
747*5fd0122aSMatthias Ringwald DMA_Channel->INT2_SRCCFG = (DMA_Channel->INT2_SRCCFG
748*5fd0122aSMatthias Ringwald & ~DMA_INT1_SRCCFG_INT_SRC_MASK) | channel;
749*5fd0122aSMatthias Ringwald } else if (interruptNumber == DMA_INT3)
750*5fd0122aSMatthias Ringwald {
751*5fd0122aSMatthias Ringwald DMA_Channel->INT3_SRCCFG = (DMA_Channel->INT3_SRCCFG
752*5fd0122aSMatthias Ringwald & ~DMA_INT1_SRCCFG_INT_SRC_MASK) | channel;
753*5fd0122aSMatthias Ringwald }
754*5fd0122aSMatthias Ringwald
755*5fd0122aSMatthias Ringwald /* Enabling the assigned interrupt */
756*5fd0122aSMatthias Ringwald DMA_enableInterrupt(interruptNumber);
757*5fd0122aSMatthias Ringwald }
758*5fd0122aSMatthias Ringwald
DMA_requestSoftwareTransfer(uint32_t channel)759*5fd0122aSMatthias Ringwald void DMA_requestSoftwareTransfer(uint32_t channel)
760*5fd0122aSMatthias Ringwald {
761*5fd0122aSMatthias Ringwald DMA_Channel->SW_CHTRIG |= (1 << channel);
762*5fd0122aSMatthias Ringwald }
763*5fd0122aSMatthias Ringwald
DMA_getInterruptStatus(void)764*5fd0122aSMatthias Ringwald uint32_t DMA_getInterruptStatus(void)
765*5fd0122aSMatthias Ringwald {
766*5fd0122aSMatthias Ringwald return DMA_Channel->INT0_SRCFLG;
767*5fd0122aSMatthias Ringwald }
768*5fd0122aSMatthias Ringwald
DMA_clearInterruptFlag(uint32_t channel)769*5fd0122aSMatthias Ringwald void DMA_clearInterruptFlag(uint32_t channel)
770*5fd0122aSMatthias Ringwald {
771*5fd0122aSMatthias Ringwald DMA_Channel->INT0_CLRFLG |= (1 << channel);
772*5fd0122aSMatthias Ringwald }
773*5fd0122aSMatthias Ringwald
DMA_enableInterrupt(uint32_t interruptNumber)774*5fd0122aSMatthias Ringwald void DMA_enableInterrupt(uint32_t interruptNumber)
775*5fd0122aSMatthias Ringwald {
776*5fd0122aSMatthias Ringwald ASSERT(
777*5fd0122aSMatthias Ringwald (interruptNumber == DMA_INT1)
778*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INT2)
779*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INT3));
780*5fd0122aSMatthias Ringwald
781*5fd0122aSMatthias Ringwald if (interruptNumber == DMA_INT1)
782*5fd0122aSMatthias Ringwald {
783*5fd0122aSMatthias Ringwald DMA_Channel->INT1_SRCCFG |= DMA_INT1_SRCCFG_EN;
784*5fd0122aSMatthias Ringwald } else if (interruptNumber == DMA_INT2)
785*5fd0122aSMatthias Ringwald {
786*5fd0122aSMatthias Ringwald DMA_Channel->INT2_SRCCFG |= DMA_INT2_SRCCFG_EN;
787*5fd0122aSMatthias Ringwald } else if (interruptNumber == DMA_INT3)
788*5fd0122aSMatthias Ringwald {
789*5fd0122aSMatthias Ringwald DMA_Channel->INT3_SRCCFG |= DMA_INT3_SRCCFG_EN;
790*5fd0122aSMatthias Ringwald }
791*5fd0122aSMatthias Ringwald
792*5fd0122aSMatthias Ringwald }
793*5fd0122aSMatthias Ringwald
DMA_disableInterrupt(uint32_t interruptNumber)794*5fd0122aSMatthias Ringwald void DMA_disableInterrupt(uint32_t interruptNumber)
795*5fd0122aSMatthias Ringwald {
796*5fd0122aSMatthias Ringwald ASSERT(
797*5fd0122aSMatthias Ringwald (interruptNumber == DMA_INT1)
798*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INT2)
799*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INT3));
800*5fd0122aSMatthias Ringwald
801*5fd0122aSMatthias Ringwald if (interruptNumber == DMA_INT1)
802*5fd0122aSMatthias Ringwald {
803*5fd0122aSMatthias Ringwald DMA_Channel->INT1_SRCCFG &= ~DMA_INT1_SRCCFG_EN;
804*5fd0122aSMatthias Ringwald } else if (interruptNumber == DMA_INT2)
805*5fd0122aSMatthias Ringwald {
806*5fd0122aSMatthias Ringwald DMA_Channel->INT2_SRCCFG &= ~DMA_INT2_SRCCFG_EN;
807*5fd0122aSMatthias Ringwald } else if (interruptNumber == DMA_INT3)
808*5fd0122aSMatthias Ringwald {
809*5fd0122aSMatthias Ringwald DMA_Channel->INT3_SRCCFG &= ~DMA_INT3_SRCCFG_EN;
810*5fd0122aSMatthias Ringwald }
811*5fd0122aSMatthias Ringwald }
812*5fd0122aSMatthias Ringwald
DMA_registerInterrupt(uint32_t interruptNumber,void (* intHandler)(void))813*5fd0122aSMatthias Ringwald void DMA_registerInterrupt(uint32_t interruptNumber, void (*intHandler)(void))
814*5fd0122aSMatthias Ringwald {
815*5fd0122aSMatthias Ringwald //
816*5fd0122aSMatthias Ringwald // Check the arguments.
817*5fd0122aSMatthias Ringwald //
818*5fd0122aSMatthias Ringwald ASSERT(intHandler);
819*5fd0122aSMatthias Ringwald ASSERT(
820*5fd0122aSMatthias Ringwald (interruptNumber == DMA_INT0) || (interruptNumber == DMA_INT1)
821*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INT2)
822*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INT3)
823*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INTERR));
824*5fd0122aSMatthias Ringwald
825*5fd0122aSMatthias Ringwald //
826*5fd0122aSMatthias Ringwald // Register the interrupt handler.
827*5fd0122aSMatthias Ringwald //
828*5fd0122aSMatthias Ringwald Interrupt_registerInterrupt(interruptNumber, intHandler);
829*5fd0122aSMatthias Ringwald
830*5fd0122aSMatthias Ringwald //
831*5fd0122aSMatthias Ringwald // Enable the memory management fault.
832*5fd0122aSMatthias Ringwald //
833*5fd0122aSMatthias Ringwald Interrupt_enableInterrupt(interruptNumber);
834*5fd0122aSMatthias Ringwald
835*5fd0122aSMatthias Ringwald }
836*5fd0122aSMatthias Ringwald
DMA_unregisterInterrupt(uint32_t interruptNumber)837*5fd0122aSMatthias Ringwald void DMA_unregisterInterrupt(uint32_t interruptNumber)
838*5fd0122aSMatthias Ringwald {
839*5fd0122aSMatthias Ringwald ASSERT(
840*5fd0122aSMatthias Ringwald (interruptNumber == DMA_INT0) || (interruptNumber == DMA_INT1)
841*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INT2)
842*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INT3)
843*5fd0122aSMatthias Ringwald || (interruptNumber == DMA_INTERR));
844*5fd0122aSMatthias Ringwald
845*5fd0122aSMatthias Ringwald //
846*5fd0122aSMatthias Ringwald // Disable the interrupt.
847*5fd0122aSMatthias Ringwald //
848*5fd0122aSMatthias Ringwald Interrupt_disableInterrupt(interruptNumber);
849*5fd0122aSMatthias Ringwald
850*5fd0122aSMatthias Ringwald //
851*5fd0122aSMatthias Ringwald // Unregister the interrupt handler.
852*5fd0122aSMatthias Ringwald //
853*5fd0122aSMatthias Ringwald Interrupt_unregisterInterrupt(interruptNumber);
854*5fd0122aSMatthias Ringwald }
855*5fd0122aSMatthias Ringwald
856