1 /* ----------------------------------------------------------------------------
\r
2 * SAM Software Package License
\r
3 * ----------------------------------------------------------------------------
\r
4 * Copyright (c) 2014, Atmel Corporation
\r
6 * All rights reserved.
\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
11 * - Redistributions of source code must retain the above copyright notice,
\r
12 * this list of conditions and the disclaimer below.
\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
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
34 * Implementation of xDMA controller (XDMAC).
\r
38 /*----------------------------------------------------------------------------
\r
40 *----------------------------------------------------------------------------*/
\r
46 /** \addtogroup dmac_functions XDMAC Functions
\r
50 /*----------------------------------------------------------------------------
\r
51 * Exported functions
\r
52 *----------------------------------------------------------------------------*/
\r
54 uint32_t XDMAC_GetType( Xdmac *pXdmac)
\r
57 return pXdmac->XDMAC_GTYPE;
\r
60 uint32_t XDMAC_GetConfig( Xdmac *pXdmac)
\r
63 return pXdmac->XDMAC_GCFG;
\r
66 uint32_t XDMAC_GetArbiter( Xdmac *pXdmac)
\r
69 return pXdmac->XDMAC_GWAC;
\r
73 * \brief Enables XDMAC global interrupt.
\r
75 * \param pXdmac Pointer to the XDMAC peripheral.
\r
76 * \param dwInteruptMask IT to be enabled.
\r
78 void XDMAC_EnableGIt (Xdmac *pXdmac, uint32_t dwInteruptMask )
\r
81 pXdmac->XDMAC_GIE = dwInteruptMask;
\r
85 * \brief Disables XDMAC global interrupt
\r
87 * \param pXdmac Pointer to the XDMAC peripheral.
\r
88 * \param dwInteruptMask IT to be enabled
\r
90 void XDMAC_DisableGIt (Xdmac *pXdmac, uint32_t dwInteruptMask )
\r
93 pXdmac->XDMAC_GID = dwInteruptMask;
\r
96 uint32_t XDMAC_GetGItMask( Xdmac *pXdmac )
\r
99 return (pXdmac->XDMAC_GIM);
\r
102 uint32_t XDMAC_GetGIsr( Xdmac *pXdmac )
\r
105 return (pXdmac->XDMAC_GIS);
\r
108 uint32_t XDMAC_GetMaskedGIsr( Xdmac *pXdmac )
\r
110 uint32_t _dwStatus;
\r
112 _dwStatus = pXdmac->XDMAC_GIS;
\r
113 _dwStatus &= pXdmac->XDMAC_GIM;
\r
118 * \brief enables the relevant channel of given XDMAC.
\r
120 * \param pXdmac Pointer to the XDMAC peripheral.
\r
121 * \param channel Particular channel number.
\r
123 void XDMAC_EnableChannel( Xdmac *pXdmac, uint8_t channel )
\r
126 assert(channel < XDMAC_CHANNEL_NUM);
\r
127 pXdmac->XDMAC_GE |= XDMAC_GE_EN0 << channel;
\r
131 * \brief enables the relevant channels of given XDMAC.
\r
133 * \param pXdmac Pointer to the XDMAC peripheral.
\r
134 * \param bmChannels Channels bitmap.
\r
136 void XDMAC_EnableChannels( Xdmac *pXdmac, uint8_t bmChannels )
\r
139 pXdmac->XDMAC_GE = bmChannels;
\r
143 * \brief Disables the relevant channel of given XDMAC.
\r
145 * \param pXdmac Pointer to the XDMAC peripheral.
\r
146 * \param channel Particular channel number.
\r
148 void XDMAC_DisableChannel( Xdmac *pXdmac, uint8_t channel )
\r
151 assert(channel < XDMAC_CHANNEL_NUM);
\r
152 pXdmac->XDMAC_GD |= XDMAC_GD_DI0 << channel;
\r
156 * \brief Disables the relevant channels of given XDMAC.
\r
158 * \param pXdmac Pointer to the XDMAC peripheral.
\r
159 * \param bmChannels Channels bitmap.
\r
161 void XDMAC_DisableChannels( Xdmac *pXdmac, uint8_t bmChannels )
\r
164 pXdmac->XDMAC_GD = bmChannels;
\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
174 uint32_t XDMAC_GetGlobalChStatus(Xdmac *pXdmac)
\r
178 return pXdmac->XDMAC_GS;
\r
181 void XDMAC_SuspendReadChannel( Xdmac *pXdmac, uint8_t channel )
\r
184 assert(channel < XDMAC_CHANNEL_NUM);
\r
185 pXdmac->XDMAC_GRS |= XDMAC_GRS_RS0 << channel;
\r
189 void XDMAC_SuspendWriteChannel( Xdmac *pXdmac, uint8_t channel )
\r
192 assert(channel < XDMAC_CHANNEL_NUM);
\r
193 pXdmac->XDMAC_GWS |= XDMAC_GWS_WS0 << channel;
\r
196 void XDMAC_SuspendReadWriteChannel( Xdmac *pXdmac, uint8_t channel )
\r
199 assert(channel < XDMAC_CHANNEL_NUM);
\r
200 pXdmac->XDMAC_GRWS |= XDMAC_GRWS_RWS0 << channel;
\r
203 void XDMAC_ResumeReadWriteChannel( Xdmac *pXdmac, uint8_t channel )
\r
206 assert(channel < XDMAC_CHANNEL_NUM);
\r
207 pXdmac->XDMAC_GRWR |= XDMAC_GRWR_RWR0 << channel;
\r
210 void XDMAC_SoftwareTransferReq(Xdmac *pXdmac, uint8_t channel)
\r
214 assert(channel < XDMAC_CHANNEL_NUM);
\r
215 pXdmac->XDMAC_GSWR |= (XDMAC_GSWR_SWREQ0 << channel);
\r
218 uint32_t XDMAC_GetSoftwareTransferStatus(Xdmac *pXdmac)
\r
222 return pXdmac->XDMAC_GSWS;
\r
225 void XDMAC_SoftwareFlushReq(Xdmac *pXdmac, uint8_t channel)
\r
229 assert(channel < XDMAC_CHANNEL_NUM);
\r
230 pXdmac->XDMAC_GSWF |= XDMAC_GSWF_SWF0 << channel;
\r
233 void XDMAC_EnableChannelIt (Xdmac *pXdmac, uint8_t channel, uint32_t dwInteruptMask )
\r
236 assert(channel < XDMAC_CHANNEL_NUM);
\r
237 pXdmac->XDMAC_CHID[channel].XDMAC_CIE = dwInteruptMask;
\r
240 void XDMAC_DisableChannelIt (Xdmac *pXdmac, uint8_t channel, uint32_t dwInteruptMask )
\r
243 assert(channel < XDMAC_CHANNEL_NUM);
\r
244 pXdmac->XDMAC_CHID[channel].XDMAC_CID = dwInteruptMask;
\r
247 uint32_t XDMAC_GetChannelItMask (Xdmac *pXdmac, uint8_t channel)
\r
250 assert(channel < XDMAC_CHANNEL_NUM);
\r
251 return pXdmac->XDMAC_CHID[channel].XDMAC_CIM;
\r
254 uint32_t XDMAC_GetChannelIsr (Xdmac *pXdmac, uint8_t channel)
\r
257 assert(channel < XDMAC_CHANNEL_NUM);
\r
258 return pXdmac->XDMAC_CHID[channel].XDMAC_CIS;
\r
261 uint32_t XDMAC_GetMaskChannelIsr (Xdmac *pXdmac, uint8_t channel)
\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
272 void XDMAC_SetSourceAddr(Xdmac *pXdmac, uint8_t channel, uint32_t addr)
\r
275 assert(channel < XDMAC_CHANNEL_NUM);
\r
276 pXdmac->XDMAC_CHID[channel].XDMAC_CSA = addr;
\r
279 void XDMAC_SetDestinationAddr(Xdmac *pXdmac, uint8_t channel, uint32_t addr)
\r
282 assert(channel < XDMAC_CHANNEL_NUM);
\r
283 pXdmac->XDMAC_CHID[channel].XDMAC_CDA = addr;
\r
286 void XDMAC_SetDescriptorAddr(Xdmac *pXdmac, uint8_t channel, uint32_t addr, uint32_t ndaif)
\r
289 assert(channel < XDMAC_CHANNEL_NUM);
\r
290 pXdmac->XDMAC_CHID[channel].XDMAC_CNDA = ( addr & 0xFFFFFFFC ) | ndaif;
\r
293 void XDMAC_SetDescriptorControl(Xdmac *pXdmac, uint8_t channel, uint32_t config)
\r
296 assert(channel < XDMAC_CHANNEL_NUM);
\r
297 pXdmac->XDMAC_CHID[channel].XDMAC_CNDC = config;
\r
300 void XDMAC_SetMicroblockControl(Xdmac *pXdmac, uint8_t channel, uint32_t ublen)
\r
304 assert(channel < XDMAC_CHANNEL_NUM);
\r
305 pXdmac->XDMAC_CHID[channel].XDMAC_CUBC = ublen;
\r
308 void XDMAC_SetBlockControl(Xdmac *pXdmac, uint8_t channel, uint32_t blen)
\r
312 assert(channel < XDMAC_CHANNEL_NUM);
\r
313 pXdmac->XDMAC_CHID[channel].XDMAC_CBC = blen;
\r
316 void XDMAC_SetChannelConfig(Xdmac *pXdmac, uint8_t channel, uint32_t config)
\r
320 assert(channel < XDMAC_CHANNEL_NUM);
\r
321 pXdmac->XDMAC_CHID[channel].XDMAC_CC = config;
\r
324 uint32_t XDMAC_GetChannelConfig(Xdmac *pXdmac, uint8_t channel)
\r
327 assert(channel < XDMAC_CHANNEL_NUM);
\r
328 return pXdmac->XDMAC_CHID[channel].XDMAC_CC;
\r
331 void XDMAC_SetDataStride_MemPattern(Xdmac *pXdmac, uint8_t channel, uint32_t dds_msp)
\r
335 assert(channel < XDMAC_CHANNEL_NUM);
\r
336 pXdmac->XDMAC_CHID[channel].XDMAC_CDS_MSP = dds_msp;
\r
339 void XDMAC_SetSourceMicroBlockStride(Xdmac *pXdmac, uint8_t channel, uint32_t subs)
\r
342 assert(channel < XDMAC_CHANNEL_NUM);
\r
343 pXdmac->XDMAC_CHID[channel].XDMAC_CSUS = subs;
\r
346 void XDMAC_SetDestinationMicroBlockStride(Xdmac *pXdmac, uint8_t channel, uint32_t dubs)
\r
349 assert(channel < XDMAC_CHANNEL_NUM);
\r
350 pXdmac->XDMAC_CHID[channel].XDMAC_CDUS = dubs;
\r
354 uint32_t XDMAC_GetChDestinationAddr(Xdmac *pXdmac, uint8_t channel)
\r
357 assert(channel < XDMAC_CHANNEL_NUM);
\r
358 return pXdmac->XDMAC_CHID[channel].XDMAC_CDA;
\r