]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/MSP430FR5969_LaunchPad/driverlib/MSP430FR5xx_6xx/dma.c
Complete large memory model MSP430FR5969 demo - including CLI and run-time stats.
[freertos] / FreeRTOS / Demo / MSP430FR5969_LaunchPad / driverlib / MSP430FR5xx_6xx / dma.c
1 /* --COPYRIGHT--,BSD\r
2  * Copyright (c) 2014, Texas Instruments Incorporated\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * *  Redistributions of source code must retain the above copyright\r
10  *    notice, this list of conditions and the following disclaimer.\r
11  *\r
12  * *  Redistributions in binary form must reproduce the above copyright\r
13  *    notice, this list of conditions and the following disclaimer in the\r
14  *    documentation and/or other materials provided with the distribution.\r
15  *\r
16  * *  Neither the name of Texas Instruments Incorporated nor the names of\r
17  *    its contributors may be used to endorse or promote products derived\r
18  *    from this software without specific prior written permission.\r
19  *\r
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31  * --/COPYRIGHT--*/\r
32 //*****************************************************************************\r
33 //\r
34 // dma.c - Driver for the dma Module.\r
35 //\r
36 //*****************************************************************************\r
37 \r
38 //*****************************************************************************\r
39 //\r
40 //! \addtogroup dma_api dma\r
41 //! @{\r
42 //\r
43 //*****************************************************************************\r
44 \r
45 #include "inc/hw_regaccess.h"\r
46 #include "inc/hw_memmap.h"\r
47 \r
48 #if defined(__MSP430_HAS_DMAX_3__) || defined(__MSP430_HAS_DMAX_6__)\r
49 #include "dma.h"\r
50 \r
51 #include <assert.h>\r
52 \r
53 void DMA_init(DMA_initParam *param){\r
54     uint8_t triggerOffset = (param->channelSelect >> 4);\r
55 \r
56     //Reset and Set DMA Control 0 Register\r
57     HWREG16(DMA_BASE + param->channelSelect + OFS_DMA0CTL) =\r
58         param->transferModeSelect //Set Transfer Mode\r
59         + param->transferUnitSelect //Set Transfer Unit Size\r
60         + param->triggerTypeSelect; //Set Trigger Type\r
61 \r
62     //Set Transfer Size Amount\r
63     HWREG16(DMA_BASE + param->channelSelect + OFS_DMA0SZ) = param->transferSize;\r
64 \r
65     if(triggerOffset & 0x01)     //Odd Channel\r
66     {\r
67         HWREG16(DMA_BASE + (triggerOffset & 0x0E)) &= 0x00FF; //Reset Trigger Select\r
68         HWREG16(DMA_BASE +\r
69                 (triggerOffset & 0x0E)) |= (param->triggerSourceSelect << 8);\r
70     }\r
71     else       //Even Channel\r
72     {\r
73         HWREG16(DMA_BASE + (triggerOffset & 0x0E)) &= 0xFF00; //Reset Trigger Select\r
74         HWREG16(DMA_BASE +\r
75                 (triggerOffset & 0x0E)) |= param->triggerSourceSelect;\r
76     }\r
77 }\r
78 \r
79 void DMA_setTransferSize(uint8_t channelSelect,\r
80                          uint16_t transferSize)\r
81 {\r
82     //Set Transfer Size Amount\r
83     HWREG16(DMA_BASE + channelSelect + OFS_DMA0SZ) = transferSize;\r
84 }\r
85 \r
86 uint16_t DMA_getTransferSize(uint8_t channelSelect)\r
87 {\r
88     //Get Transfer Size Amount\r
89     return(HWREG16(DMA_BASE + channelSelect + OFS_DMA0SZ));\r
90 }\r
91 \r
92 void DMA_setSrcAddress(uint8_t channelSelect,\r
93                        uint32_t srcAddress,\r
94                        uint16_t directionSelect)\r
95 {\r
96     //Set the Source Address\r
97     __data16_write_addr((unsigned short)(DMA_BASE + channelSelect + OFS_DMA0SA),\r
98                         srcAddress);\r
99 \r
100     //Reset bits before setting them\r
101     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) &= ~(DMASRCINCR_3);\r
102     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) |= directionSelect;\r
103 }\r
104 \r
105 void DMA_setDstAddress(uint8_t channelSelect,\r
106                        uint32_t dstAddress,\r
107                        uint16_t directionSelect)\r
108 {\r
109     //Set the Destination Address\r
110     __data16_write_addr((unsigned short)(DMA_BASE + channelSelect + OFS_DMA0DA),\r
111                         dstAddress);\r
112 \r
113     //Reset bits before setting them\r
114     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) &= ~(DMADSTINCR_3);\r
115     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) |= (directionSelect << 2);\r
116 }\r
117 \r
118 void DMA_enableTransfers(uint8_t channelSelect)\r
119 {\r
120     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) |= DMAEN;\r
121 }\r
122 \r
123 void DMA_disableTransfers(uint8_t channelSelect)\r
124 {\r
125     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) &= ~(DMAEN);\r
126 }\r
127 \r
128 void DMA_startTransfer(uint8_t channelSelect)\r
129 {\r
130     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) |= DMAREQ;\r
131 }\r
132 \r
133 void DMA_enableInterrupt(uint8_t channelSelect)\r
134 {\r
135     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) |= DMAIE;\r
136 }\r
137 \r
138 void DMA_disableInterrupt(uint8_t channelSelect)\r
139 {\r
140     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) &= ~(DMAIE);\r
141 }\r
142 \r
143 uint16_t DMA_getInterruptStatus(uint8_t channelSelect)\r
144 {\r
145     return (HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) & DMAIFG);\r
146 }\r
147 \r
148 void DMA_clearInterrupt(uint8_t channelSelect)\r
149 {\r
150     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) &= ~(DMAIFG);\r
151 }\r
152 \r
153 uint16_t DMA_getNMIAbortStatus(uint8_t channelSelect)\r
154 {\r
155     return (HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) & DMAABORT);\r
156 }\r
157 \r
158 void DMA_clearNMIAbort(uint8_t channelSelect)\r
159 {\r
160     HWREG16(DMA_BASE + channelSelect + OFS_DMA0CTL) &= ~(DMAABORT);\r
161 }\r
162 \r
163 void DMA_disableTransferDuringReadModifyWrite(void)\r
164 {\r
165     HWREG16(DMA_BASE + OFS_DMACTL4) |= DMARMWDIS;\r
166 }\r
167 \r
168 void DMA_enableTransferDuringReadModifyWrite(void)\r
169 {\r
170     HWREG16(DMA_BASE + OFS_DMACTL4) &= ~(DMARMWDIS);\r
171 }\r
172 \r
173 void DMA_enableRoundRobinPriority(void)\r
174 {\r
175     HWREG16(DMA_BASE + OFS_DMACTL4) |= ROUNDROBIN;\r
176 }\r
177 \r
178 void DMA_disableRoundRobinPriority(void)\r
179 {\r
180     HWREG16(DMA_BASE + OFS_DMACTL4) &= ~(ROUNDROBIN);\r
181 }\r
182 \r
183 void DMA_enableNMIAbort(void)\r
184 {\r
185     HWREG16(DMA_BASE + OFS_DMACTL4) |= ENNMI;\r
186 }\r
187 \r
188 void DMA_disableNMIAbort(void)\r
189 {\r
190     HWREG16(DMA_BASE + OFS_DMACTL4) &= ~(ENNMI);\r
191 }\r
192 \r
193 #endif\r
194 //*****************************************************************************\r
195 //\r
196 //! Close the doxygen group for dma_api\r
197 //! @}\r
198 //\r
199 //*****************************************************************************\r