]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil/libchip_samv7/source/xdmac.c
Final V8.2.1 release ready for tagging:
[freertos] / FreeRTOS / Demo / CORTEX_M7_SAMV71_Xplained_IAR_Keil / libchip_samv7 / source / xdmac.c
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License \r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2014, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 \r
31 /**\r
32  * \file\r
33  *\r
34  * Implementation of xDMA controller (XDMAC).\r
35  *\r
36  */\r
37 \r
38 /*----------------------------------------------------------------------------\r
39  *        Headers\r
40  *----------------------------------------------------------------------------*/\r
41 \r
42 #include "chip.h"\r
43 \r
44 #include <stdint.h>\r
45 #include <assert.h>\r
46 /** \addtogroup dmac_functions XDMAC Functions\r
47  *@{\r
48  */\r
49 \r
50 /*----------------------------------------------------------------------------\r
51  *        Exported functions\r
52  *----------------------------------------------------------------------------*/\r
53 \r
54 uint32_t XDMAC_GetType( Xdmac *pXdmac)\r
55 {\r
56     assert(pXdmac);\r
57     return pXdmac->XDMAC_GTYPE;\r
58 }\r
59 \r
60 uint32_t XDMAC_GetConfig( Xdmac *pXdmac)\r
61 {\r
62     assert(pXdmac);\r
63     return pXdmac->XDMAC_GCFG;\r
64 }\r
65 \r
66 uint32_t XDMAC_GetArbiter( Xdmac *pXdmac)\r
67 {\r
68     assert(pXdmac);\r
69     return pXdmac->XDMAC_GWAC;\r
70 }\r
71 \r
72 /**\r
73  * \brief Enables XDMAC global interrupt.\r
74  *\r
75  * \param pXdmac Pointer to the XDMAC peripheral.\r
76  * \param dwInteruptMask IT to be enabled.\r
77  */\r
78 void XDMAC_EnableGIt (Xdmac *pXdmac, uint32_t dwInteruptMask )\r
79 {\r
80     assert(pXdmac);\r
81     pXdmac->XDMAC_GIE = dwInteruptMask;\r
82 }\r
83 \r
84 /**\r
85  * \brief Disables XDMAC global interrupt\r
86  *\r
87  * \param pXdmac Pointer to the XDMAC peripheral.\r
88  * \param dwInteruptMask IT to be enabled\r
89  */\r
90 void XDMAC_DisableGIt (Xdmac *pXdmac, uint32_t dwInteruptMask )\r
91 {\r
92     assert(pXdmac);\r
93     pXdmac->XDMAC_GID = dwInteruptMask;\r
94 }\r
95 \r
96 uint32_t XDMAC_GetGItMask( Xdmac *pXdmac )\r
97 {\r
98     assert(pXdmac);\r
99     return (pXdmac->XDMAC_GIM);\r
100 }\r
101 \r
102 uint32_t XDMAC_GetGIsr( Xdmac *pXdmac )\r
103 {\r
104     assert(pXdmac);\r
105     return (pXdmac->XDMAC_GIS);\r
106 }\r
107 \r
108 uint32_t XDMAC_GetMaskedGIsr( Xdmac *pXdmac )\r
109 {\r
110     uint32_t _dwStatus;\r
111     assert(pXdmac);\r
112     _dwStatus = pXdmac->XDMAC_GIS;\r
113     _dwStatus &= pXdmac->XDMAC_GIM;\r
114     return _dwStatus;\r
115 }\r
116 \r
117 /**\r
118  * \brief enables the relevant channel of given XDMAC.\r
119  *\r
120  * \param pXdmac Pointer to the XDMAC peripheral.\r
121  * \param channel Particular channel number.\r
122  */\r
123 void XDMAC_EnableChannel( Xdmac *pXdmac, uint8_t channel )\r
124 {\r
125     assert(pXdmac);\r
126     assert(channel < XDMAC_CHANNEL_NUM);\r
127     pXdmac->XDMAC_GE |= XDMAC_GE_EN0 << channel;\r
128 }\r
129 \r
130 /**\r
131  * \brief enables the relevant channels of given XDMAC.\r
132  *\r
133  * \param pXdmac Pointer to the XDMAC peripheral.\r
134  * \param bmChannels Channels bitmap.\r
135  */\r
136 void XDMAC_EnableChannels( Xdmac *pXdmac, uint8_t bmChannels )\r
137 {\r
138     assert(pXdmac);\r
139     pXdmac->XDMAC_GE = bmChannels;\r
140 }\r
141 \r
142 /**\r
143  * \brief Disables the relevant channel of given XDMAC.\r
144  *\r
145  * \param pXdmac Pointer to the XDMAC peripheral.\r
146  * \param channel Particular channel number.\r
147  */\r
148 void XDMAC_DisableChannel( Xdmac *pXdmac, uint8_t channel )\r
149 {\r
150     assert(pXdmac);\r
151     assert(channel < XDMAC_CHANNEL_NUM);\r
152     pXdmac->XDMAC_GD |= XDMAC_GD_DI0 << channel;\r
153 }\r
154 \r
155 /**\r
156  * \brief Disables the relevant channels of given XDMAC.\r
157  *\r
158  * \param pXdmac Pointer to the XDMAC peripheral.\r
159  * \param bmChannels Channels bitmap.\r
160  */\r
161 void XDMAC_DisableChannels( Xdmac *pXdmac, uint8_t bmChannels )\r
162 {\r
163     assert(pXdmac);\r
164     pXdmac->XDMAC_GD = bmChannels;\r
165 }\r
166 \r
167 \r
168 /**\r
169  * \brief Get Global channel status of given XDMAC.\r
170  * \Note: When set to 1, this bit indicates that the channel x is enabled. If a channel disable request is issued, this bit remains asserted\r
171     until pending transaction is completed.\r
172  * \param pXdmac Pointer to the XDMAC peripheral.\r
173  */\r
174 uint32_t XDMAC_GetGlobalChStatus(Xdmac *pXdmac)\r
175 {\r
176 \r
177     assert(pXdmac);\r
178     return pXdmac->XDMAC_GS;\r
179 }\r
180 \r
181 void XDMAC_SuspendReadChannel( Xdmac *pXdmac, uint8_t channel )\r
182 {\r
183     assert(pXdmac);\r
184     assert(channel < XDMAC_CHANNEL_NUM);\r
185     pXdmac->XDMAC_GRS |= XDMAC_GRS_RS0 << channel;\r
186 }\r
187 \r
188 \r
189 void XDMAC_SuspendWriteChannel( Xdmac *pXdmac, uint8_t channel )\r
190 {\r
191     assert(pXdmac);\r
192     assert(channel < XDMAC_CHANNEL_NUM);\r
193     pXdmac->XDMAC_GWS |= XDMAC_GWS_WS0 << channel;\r
194 }\r
195 \r
196 void XDMAC_SuspendReadWriteChannel( Xdmac *pXdmac, uint8_t channel )\r
197 {\r
198     assert(pXdmac);\r
199     assert(channel < XDMAC_CHANNEL_NUM);\r
200     pXdmac->XDMAC_GRWS |= XDMAC_GRWS_RWS0 << channel;\r
201 }\r
202 \r
203 void XDMAC_ResumeReadWriteChannel( Xdmac *pXdmac, uint8_t channel )\r
204 {\r
205     assert(pXdmac);\r
206     assert(channel < XDMAC_CHANNEL_NUM);\r
207     pXdmac->XDMAC_GRWR |= XDMAC_GRWR_RWR0 << channel;\r
208 }\r
209 \r
210 void XDMAC_SoftwareTransferReq(Xdmac *pXdmac, uint8_t channel)\r
211 {\r
212 \r
213     assert(pXdmac);\r
214     assert(channel < XDMAC_CHANNEL_NUM);\r
215     pXdmac->XDMAC_GSWR |= (XDMAC_GSWR_SWREQ0 << channel);\r
216 }\r
217 \r
218 uint32_t XDMAC_GetSoftwareTransferStatus(Xdmac *pXdmac)\r
219 {\r
220 \r
221     assert(pXdmac);\r
222     return pXdmac->XDMAC_GSWS;\r
223 }\r
224 \r
225 void XDMAC_SoftwareFlushReq(Xdmac *pXdmac, uint8_t channel)\r
226 {\r
227 \r
228     assert(pXdmac);\r
229     assert(channel < XDMAC_CHANNEL_NUM);\r
230     pXdmac->XDMAC_GSWF |= XDMAC_GSWF_SWF0 << channel;\r
231 }\r
232 \r
233 void XDMAC_EnableChannelIt (Xdmac *pXdmac, uint8_t channel, uint32_t dwInteruptMask )\r
234 {\r
235     assert(pXdmac);\r
236     assert(channel < XDMAC_CHANNEL_NUM);\r
237     pXdmac->XDMAC_CHID[channel].XDMAC_CIE = dwInteruptMask;\r
238 }\r
239 \r
240 void XDMAC_DisableChannelIt (Xdmac *pXdmac, uint8_t channel, uint32_t dwInteruptMask )\r
241 {\r
242     assert(pXdmac);\r
243     assert(channel < XDMAC_CHANNEL_NUM);\r
244     pXdmac->XDMAC_CHID[channel].XDMAC_CID = dwInteruptMask;\r
245 }\r
246 \r
247 uint32_t XDMAC_GetChannelItMask (Xdmac *pXdmac, uint8_t channel)\r
248 {\r
249     assert(pXdmac);\r
250     assert(channel < XDMAC_CHANNEL_NUM);\r
251     return pXdmac->XDMAC_CHID[channel].XDMAC_CIM;\r
252 }\r
253 \r
254 uint32_t XDMAC_GetChannelIsr (Xdmac *pXdmac, uint8_t channel)\r
255 {\r
256     assert(pXdmac);\r
257     assert(channel < XDMAC_CHANNEL_NUM);\r
258     return pXdmac->XDMAC_CHID[channel].XDMAC_CIS;\r
259 }\r
260 \r
261 uint32_t XDMAC_GetMaskChannelIsr (Xdmac *pXdmac, uint8_t channel)\r
262 {\r
263     uint32_t status;\r
264     assert(pXdmac);\r
265     assert(channel < XDMAC_CHANNEL_NUM);\r
266     status = pXdmac->XDMAC_CHID[channel].XDMAC_CIS;\r
267     status &= pXdmac->XDMAC_CHID[channel].XDMAC_CIM;\r
268 \r
269     return status;\r
270 }\r
271 \r
272 void XDMAC_SetSourceAddr(Xdmac *pXdmac, uint8_t channel, uint32_t addr)\r
273 {\r
274     assert(pXdmac);\r
275     assert(channel < XDMAC_CHANNEL_NUM);\r
276     pXdmac->XDMAC_CHID[channel].XDMAC_CSA = addr;\r
277 }\r
278 \r
279 void XDMAC_SetDestinationAddr(Xdmac *pXdmac, uint8_t channel, uint32_t addr)\r
280 {\r
281     assert(pXdmac);\r
282     assert(channel < XDMAC_CHANNEL_NUM);\r
283     pXdmac->XDMAC_CHID[channel].XDMAC_CDA = addr;\r
284 }\r
285 \r
286 void XDMAC_SetDescriptorAddr(Xdmac *pXdmac, uint8_t channel, uint32_t addr, uint32_t ndaif)\r
287 {\r
288     assert(pXdmac);\r
289     assert(channel < XDMAC_CHANNEL_NUM);\r
290     pXdmac->XDMAC_CHID[channel].XDMAC_CNDA =  ( addr & 0xFFFFFFFC ) | ndaif;\r
291 }\r
292 \r
293 void XDMAC_SetDescriptorControl(Xdmac *pXdmac, uint8_t channel, uint32_t config)\r
294 {\r
295     assert(pXdmac);\r
296     assert(channel < XDMAC_CHANNEL_NUM);\r
297     pXdmac->XDMAC_CHID[channel].XDMAC_CNDC = config;\r
298 }\r
299 \r
300 void XDMAC_SetMicroblockControl(Xdmac *pXdmac, uint8_t channel, uint32_t ublen)\r
301 {\r
302 \r
303     assert(pXdmac);\r
304     assert(channel < XDMAC_CHANNEL_NUM);\r
305     pXdmac->XDMAC_CHID[channel].XDMAC_CUBC = ublen;\r
306 }\r
307 \r
308 void XDMAC_SetBlockControl(Xdmac *pXdmac, uint8_t channel, uint32_t blen)\r
309 {\r
310 \r
311     assert(pXdmac);\r
312     assert(channel < XDMAC_CHANNEL_NUM);\r
313     pXdmac->XDMAC_CHID[channel].XDMAC_CBC = blen;\r
314 }\r
315 \r
316 void XDMAC_SetChannelConfig(Xdmac *pXdmac, uint8_t channel, uint32_t config)\r
317 {\r
318 \r
319     assert(pXdmac);\r
320     assert(channel < XDMAC_CHANNEL_NUM);\r
321     pXdmac->XDMAC_CHID[channel].XDMAC_CC = config;\r
322 }\r
323 \r
324 uint32_t XDMAC_GetChannelConfig(Xdmac *pXdmac, uint8_t channel)\r
325 {\r
326     assert(pXdmac);\r
327     assert(channel < XDMAC_CHANNEL_NUM);\r
328     return pXdmac->XDMAC_CHID[channel].XDMAC_CC;\r
329 }\r
330 \r
331 void XDMAC_SetDataStride_MemPattern(Xdmac *pXdmac, uint8_t channel, uint32_t dds_msp)\r
332 {\r
333 \r
334     assert(pXdmac);\r
335     assert(channel < XDMAC_CHANNEL_NUM);\r
336     pXdmac->XDMAC_CHID[channel].XDMAC_CDS_MSP = dds_msp;\r
337 }\r
338 \r
339 void XDMAC_SetSourceMicroBlockStride(Xdmac *pXdmac, uint8_t channel, uint32_t subs)\r
340 {\r
341     assert(pXdmac);\r
342     assert(channel < XDMAC_CHANNEL_NUM);\r
343     pXdmac->XDMAC_CHID[channel].XDMAC_CSUS = subs;\r
344 }\r
345 \r
346 void XDMAC_SetDestinationMicroBlockStride(Xdmac *pXdmac, uint8_t channel, uint32_t dubs)\r
347 {\r
348     assert(pXdmac);\r
349     assert(channel < XDMAC_CHANNEL_NUM);\r
350     pXdmac->XDMAC_CHID[channel].XDMAC_CDUS = dubs;\r
351 }\r
352 \r
353 \r
354 uint32_t XDMAC_GetChDestinationAddr(Xdmac *pXdmac, uint8_t channel)\r
355 {\r
356     assert(pXdmac);\r
357     assert(channel < XDMAC_CHANNEL_NUM);\r
358     return pXdmac->XDMAC_CHID[channel].XDMAC_CDA;\r
359 }\r
360 \r
361 /**@}*/\r
362 \r