1*1b2596b5SMatthias Ringwald /**
2*1b2596b5SMatthias Ringwald * \file
3*1b2596b5SMatthias Ringwald *
4*1b2596b5SMatthias Ringwald * \brief SAM XDMA Controller (DMAC) driver.
5*1b2596b5SMatthias Ringwald *
6*1b2596b5SMatthias Ringwald * Copyright (c) 2015 Atmel Corporation. All rights reserved.
7*1b2596b5SMatthias Ringwald *
8*1b2596b5SMatthias Ringwald * \asf_license_start
9*1b2596b5SMatthias Ringwald *
10*1b2596b5SMatthias Ringwald * \page License
11*1b2596b5SMatthias Ringwald *
12*1b2596b5SMatthias Ringwald * Redistribution and use in source and binary forms, with or without
13*1b2596b5SMatthias Ringwald * modification, are permitted provided that the following conditions are met:
14*1b2596b5SMatthias Ringwald *
15*1b2596b5SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright notice,
16*1b2596b5SMatthias Ringwald * this list of conditions and the following disclaimer.
17*1b2596b5SMatthias Ringwald *
18*1b2596b5SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright notice,
19*1b2596b5SMatthias Ringwald * this list of conditions and the following disclaimer in the documentation
20*1b2596b5SMatthias Ringwald * and/or other materials provided with the distribution.
21*1b2596b5SMatthias Ringwald *
22*1b2596b5SMatthias Ringwald * 3. The name of Atmel may not be used to endorse or promote products derived
23*1b2596b5SMatthias Ringwald * from this software without specific prior written permission.
24*1b2596b5SMatthias Ringwald *
25*1b2596b5SMatthias Ringwald * 4. This software may only be redistributed and used in connection with an
26*1b2596b5SMatthias Ringwald * Atmel microcontroller product.
27*1b2596b5SMatthias Ringwald *
28*1b2596b5SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
29*1b2596b5SMatthias Ringwald * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
30*1b2596b5SMatthias Ringwald * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
31*1b2596b5SMatthias Ringwald * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
32*1b2596b5SMatthias Ringwald * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33*1b2596b5SMatthias Ringwald * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34*1b2596b5SMatthias Ringwald * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35*1b2596b5SMatthias Ringwald * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
36*1b2596b5SMatthias Ringwald * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
37*1b2596b5SMatthias Ringwald * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38*1b2596b5SMatthias Ringwald * POSSIBILITY OF SUCH DAMAGE.
39*1b2596b5SMatthias Ringwald *
40*1b2596b5SMatthias Ringwald * \asf_license_stop
41*1b2596b5SMatthias Ringwald *
42*1b2596b5SMatthias Ringwald */
43*1b2596b5SMatthias Ringwald /*
44*1b2596b5SMatthias Ringwald * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
45*1b2596b5SMatthias Ringwald */
46*1b2596b5SMatthias Ringwald
47*1b2596b5SMatthias Ringwald #ifndef XDMAC_H_INCLUDED
48*1b2596b5SMatthias Ringwald #define XDMAC_H_INCLUDED
49*1b2596b5SMatthias Ringwald
50*1b2596b5SMatthias Ringwald /**
51*1b2596b5SMatthias Ringwald * \defgroup asfdoc_sam_drivers_xdmac_group SAMV71/V70/E70/S70 XDMA Controller (XDMAC) Driver
52*1b2596b5SMatthias Ringwald *
53*1b2596b5SMatthias Ringwald * This driver for Atmel® | SMART SAM XDMA Controller (XDMAC) is a AHB-protocol central
54*1b2596b5SMatthias Ringwald * direct memory access controller. It performs peripheral data transfer and memory move operations
55*1b2596b5SMatthias Ringwald * over one or two bus ports through the unidirectional communication channel.
56*1b2596b5SMatthias Ringwald * This is a driver for the configuration, enabling, disabling, and use of the XDMAC peripheral.
57*1b2596b5SMatthias Ringwald *
58*1b2596b5SMatthias Ringwald * Devices from the following series can use this module:
59*1b2596b5SMatthias Ringwald * - Atmel | SMART SAMV71
60*1b2596b5SMatthias Ringwald * - Atmel | SMART SAMV70
61*1b2596b5SMatthias Ringwald * - Atmel | SMART SAMS70
62*1b2596b5SMatthias Ringwald * - Atmel | SMART SAME70
63*1b2596b5SMatthias Ringwald *
64*1b2596b5SMatthias Ringwald * The outline of this documentation is as follows:
65*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_prerequisites
66*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_module_overview
67*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_special_considerations
68*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_extra_info
69*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_examples
70*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_api_overview
71*1b2596b5SMatthias Ringwald *
72*1b2596b5SMatthias Ringwald *
73*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_prerequisites Prerequisites
74*1b2596b5SMatthias Ringwald *
75*1b2596b5SMatthias Ringwald * There are no prerequisites for this module.
76*1b2596b5SMatthias Ringwald *
77*1b2596b5SMatthias Ringwald *
78*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_module_overview Module Overview
79*1b2596b5SMatthias Ringwald * The DMA Controller (XDMAC) is a AHB-protocol central direct memory access controller.
80*1b2596b5SMatthias Ringwald * It performs peripheral data transfer and memory move operations over one or two bus ports
81*1b2596b5SMatthias Ringwald * through the unidirectional communication channel. Each channel is fully programmable and
82*1b2596b5SMatthias Ringwald * provides both peripheral or memory to memory transfer. The channel features are configurable
83*1b2596b5SMatthias Ringwald * at implementation time.
84*1b2596b5SMatthias Ringwald *
85*1b2596b5SMatthias Ringwald *
86*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_special_considerations Special Considerations
87*1b2596b5SMatthias Ringwald * There are no special considerations for this module.
88*1b2596b5SMatthias Ringwald *
89*1b2596b5SMatthias Ringwald *
90*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_extra_info Extra Information
91*1b2596b5SMatthias Ringwald *
92*1b2596b5SMatthias Ringwald * For extra information, see \ref asfdoc_sam_drivers_xdmac_extra. This includes:
93*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_extra_acronyms
94*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_extra_dependencies
95*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_extra_errata
96*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_extra_history
97*1b2596b5SMatthias Ringwald *
98*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_examples Examples
99*1b2596b5SMatthias Ringwald *
100*1b2596b5SMatthias Ringwald * For a list of examples related to this driver, see
101*1b2596b5SMatthias Ringwald * \ref asfdoc_sam_drivers_xdmac_exqsg.
102*1b2596b5SMatthias Ringwald *
103*1b2596b5SMatthias Ringwald *
104*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_api_overview API Overview
105*1b2596b5SMatthias Ringwald * @{
106*1b2596b5SMatthias Ringwald */
107*1b2596b5SMatthias Ringwald
108*1b2596b5SMatthias Ringwald #include <compiler.h>
109*1b2596b5SMatthias Ringwald #include <status_codes.h>
110*1b2596b5SMatthias Ringwald
111*1b2596b5SMatthias Ringwald /** @cond */
112*1b2596b5SMatthias Ringwald /**INDENT-OFF**/
113*1b2596b5SMatthias Ringwald #ifdef __cplusplus
114*1b2596b5SMatthias Ringwald extern "C" {
115*1b2596b5SMatthias Ringwald #endif
116*1b2596b5SMatthias Ringwald /**INDENT-ON**/
117*1b2596b5SMatthias Ringwald /** @endcond */
118*1b2596b5SMatthias Ringwald
119*1b2596b5SMatthias Ringwald /** DMA channel hardware interface number */
120*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_HSMCI 0
121*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_SPI0_TX 1
122*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_SPI0_RX 2
123*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_SPI1_TX 3
124*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_SPI1_RX 4
125*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_QSPI_TX 5
126*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_QSPI_RX 6
127*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_USART0_TX 7
128*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_USART0_RX 8
129*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_USART1_TX 9
130*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_USART1_RX 10
131*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_USART2_TX 11
132*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_USART2_RX 12
133*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_PWM0 13
134*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TWIHS0_TX 14
135*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TWIHS0_RX 15
136*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TWIHS1_TX 16
137*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TWIHS1_RX 17
138*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TWIHS2_TX 18
139*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TWIHS2_RX 19
140*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART0_TX 20
141*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART0_RX 21
142*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART1_TX 22
143*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART1_RX 23
144*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART2_TX 24
145*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART2_RX 25
146*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART3_TX 26
147*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART3_RX 27
148*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART4_TX 28
149*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_UART4_RX 29
150*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_DAC 30
151*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_SSC_TX 32
152*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_SSC_RX 33
153*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_PIOA 34
154*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_AFEC0 35
155*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_AFEC1 36
156*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_AES_TX 37
157*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_AES_RX 38
158*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_PWM1 39
159*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TC0 40
160*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TC1 41
161*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TC2 42
162*1b2596b5SMatthias Ringwald #define XDAMC_CHANNEL_HWID_TC3 43
163*1b2596b5SMatthias Ringwald
164*1b2596b5SMatthias Ringwald /* XDMA_MBR_UBC */
165*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NDE (0x1u << 24)
166*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NDE_FETCH_DIS (0x0u << 24)
167*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NDE_FETCH_EN (0x1u << 24)
168*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NSEN (0x1u << 25)
169*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NSEN_UNCHANGED (0x0u << 25)
170*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NSEN_UPDATED (0x1u << 25)
171*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NDEN (0x1u << 26)
172*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NDEN_UNCHANGED (0x0u << 26)
173*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NDEN_UPDATED (0x1u << 26)
174*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NVIEW_Pos 27
175*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NVIEW_Msk (0x3u << XDMAC_UBC_NVIEW_Pos)
176*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NVIEW_NDV0 (0x0u << XDMAC_UBC_NVIEW_Pos)
177*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NVIEW_NDV1 (0x1u << XDMAC_UBC_NVIEW_Pos)
178*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NVIEW_NDV2 (0x2u << XDMAC_UBC_NVIEW_Pos)
179*1b2596b5SMatthias Ringwald #define XDMAC_UBC_NVIEW_NDV3 (0x3u << XDMAC_UBC_NVIEW_Pos)
180*1b2596b5SMatthias Ringwald #define XDMAC_UBC_UBLEN_Pos 0
181*1b2596b5SMatthias Ringwald #define XDMAC_UBC_UBLEN_Msk (0xffffffu << XDMAC_UBC_UBLEN_Pos)
182*1b2596b5SMatthias Ringwald #define XDMAC_UBC_UBLEN(value) ((XDMAC_UBC_UBLEN_Msk & ((value) << XDMAC_UBC_UBLEN_Pos)))
183*1b2596b5SMatthias Ringwald
184*1b2596b5SMatthias Ringwald /** XDMA config register for channel */
185*1b2596b5SMatthias Ringwald typedef struct {
186*1b2596b5SMatthias Ringwald /** Microblock Control Member. */
187*1b2596b5SMatthias Ringwald uint32_t mbr_ubc;
188*1b2596b5SMatthias Ringwald /** Source Address Member. */
189*1b2596b5SMatthias Ringwald uint32_t mbr_sa;
190*1b2596b5SMatthias Ringwald /** Destination Address Member. */
191*1b2596b5SMatthias Ringwald uint32_t mbr_da;
192*1b2596b5SMatthias Ringwald /** Configuration Register. */
193*1b2596b5SMatthias Ringwald uint32_t mbr_cfg;
194*1b2596b5SMatthias Ringwald /** Block Control Member. */
195*1b2596b5SMatthias Ringwald uint32_t mbr_bc;
196*1b2596b5SMatthias Ringwald /** Data Stride Member. */
197*1b2596b5SMatthias Ringwald uint32_t mbr_ds;
198*1b2596b5SMatthias Ringwald /** Source Microblock Stride Member. */
199*1b2596b5SMatthias Ringwald uint32_t mbr_sus;
200*1b2596b5SMatthias Ringwald /** Destination Microblock Stride Member. */
201*1b2596b5SMatthias Ringwald uint32_t mbr_dus;
202*1b2596b5SMatthias Ringwald } xdmac_channel_config_t;
203*1b2596b5SMatthias Ringwald
204*1b2596b5SMatthias Ringwald /**
205*1b2596b5SMatthias Ringwald * \brief Structure for storing parameters for DMA view0 that can be
206*1b2596b5SMatthias Ringwald * performed by the DMA Master transfer.
207*1b2596b5SMatthias Ringwald */
208*1b2596b5SMatthias Ringwald typedef struct {
209*1b2596b5SMatthias Ringwald /** Next Descriptor Address number. */
210*1b2596b5SMatthias Ringwald uint32_t mbr_nda;
211*1b2596b5SMatthias Ringwald /** Microblock Control Member. */
212*1b2596b5SMatthias Ringwald uint32_t mbr_ubc;
213*1b2596b5SMatthias Ringwald /** Destination Address Member. */
214*1b2596b5SMatthias Ringwald uint32_t mbr_da;
215*1b2596b5SMatthias Ringwald } lld_view0;
216*1b2596b5SMatthias Ringwald
217*1b2596b5SMatthias Ringwald /**
218*1b2596b5SMatthias Ringwald * \brief Structure for storing parameters for DMA view1 that can be
219*1b2596b5SMatthias Ringwald * performed by the DMA Master transfer.
220*1b2596b5SMatthias Ringwald */
221*1b2596b5SMatthias Ringwald typedef struct {
222*1b2596b5SMatthias Ringwald /** Next Descriptor Address number. */
223*1b2596b5SMatthias Ringwald uint32_t mbr_nda;
224*1b2596b5SMatthias Ringwald /** Microblock Control Member. */
225*1b2596b5SMatthias Ringwald uint32_t mbr_ubc;
226*1b2596b5SMatthias Ringwald /** Source Address Member. */
227*1b2596b5SMatthias Ringwald uint32_t mbr_sa;
228*1b2596b5SMatthias Ringwald /** Destination Address Member. */
229*1b2596b5SMatthias Ringwald uint32_t mbr_da;
230*1b2596b5SMatthias Ringwald } lld_view1;
231*1b2596b5SMatthias Ringwald
232*1b2596b5SMatthias Ringwald /**
233*1b2596b5SMatthias Ringwald * \brief Structure for storing parameters for DMA view2 that can be
234*1b2596b5SMatthias Ringwald * performed by the DMA Master transfer.
235*1b2596b5SMatthias Ringwald */
236*1b2596b5SMatthias Ringwald typedef struct {
237*1b2596b5SMatthias Ringwald /** Next Descriptor Address number. */
238*1b2596b5SMatthias Ringwald uint32_t mbr_nda;
239*1b2596b5SMatthias Ringwald /** Microblock Control Member. */
240*1b2596b5SMatthias Ringwald uint32_t mbr_ubc;
241*1b2596b5SMatthias Ringwald /** Source Address Member. */
242*1b2596b5SMatthias Ringwald uint32_t mbr_sa;
243*1b2596b5SMatthias Ringwald /** Destination Address Member. */
244*1b2596b5SMatthias Ringwald uint32_t mbr_da;
245*1b2596b5SMatthias Ringwald /** Configuration Register. */
246*1b2596b5SMatthias Ringwald uint32_t mbr_cfg;
247*1b2596b5SMatthias Ringwald } lld_view2;
248*1b2596b5SMatthias Ringwald
249*1b2596b5SMatthias Ringwald /**
250*1b2596b5SMatthias Ringwald * \brief Structure for storing parameters for DMA view3 that can be
251*1b2596b5SMatthias Ringwald * performed by the DMA Master transfer.
252*1b2596b5SMatthias Ringwald */
253*1b2596b5SMatthias Ringwald typedef struct {
254*1b2596b5SMatthias Ringwald /** Next Descriptor Address number. */
255*1b2596b5SMatthias Ringwald uint32_t mbr_nda;
256*1b2596b5SMatthias Ringwald /** Microblock Control Member. */
257*1b2596b5SMatthias Ringwald uint32_t mbr_ubc;
258*1b2596b5SMatthias Ringwald /** Source Address Member. */
259*1b2596b5SMatthias Ringwald uint32_t mbr_sa;
260*1b2596b5SMatthias Ringwald /** Destination Address Member. */
261*1b2596b5SMatthias Ringwald uint32_t mbr_da;
262*1b2596b5SMatthias Ringwald /** Configuration Register. */
263*1b2596b5SMatthias Ringwald uint32_t mbr_cfg;
264*1b2596b5SMatthias Ringwald /** Block Control Member. */
265*1b2596b5SMatthias Ringwald uint32_t mbr_bc;
266*1b2596b5SMatthias Ringwald /** Data Stride Member. */
267*1b2596b5SMatthias Ringwald uint32_t mbr_ds;
268*1b2596b5SMatthias Ringwald /** Source Microblock Stride Member. */
269*1b2596b5SMatthias Ringwald uint32_t mbr_sus;
270*1b2596b5SMatthias Ringwald /** Destination Microblock Stride Member. */
271*1b2596b5SMatthias Ringwald uint32_t mbr_dus;
272*1b2596b5SMatthias Ringwald } lld_view3;
273*1b2596b5SMatthias Ringwald
274*1b2596b5SMatthias Ringwald /**
275*1b2596b5SMatthias Ringwald * \brief Get XDMAC global type.
276*1b2596b5SMatthias Ringwald *
277*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
278*1b2596b5SMatthias Ringwald */
xdmac_get_type(Xdmac * xdmac)279*1b2596b5SMatthias Ringwald static inline uint32_t xdmac_get_type( Xdmac *xdmac)
280*1b2596b5SMatthias Ringwald {
281*1b2596b5SMatthias Ringwald Assert(xdmac);
282*1b2596b5SMatthias Ringwald return xdmac->XDMAC_GTYPE;
283*1b2596b5SMatthias Ringwald }
284*1b2596b5SMatthias Ringwald
285*1b2596b5SMatthias Ringwald /**
286*1b2596b5SMatthias Ringwald * \brief Get XDMAC global configuration.
287*1b2596b5SMatthias Ringwald *
288*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
289*1b2596b5SMatthias Ringwald */
xdmac_get_config(Xdmac * xdmac)290*1b2596b5SMatthias Ringwald static inline uint32_t xdmac_get_config(Xdmac *xdmac)
291*1b2596b5SMatthias Ringwald {
292*1b2596b5SMatthias Ringwald Assert(xdmac);
293*1b2596b5SMatthias Ringwald return xdmac->XDMAC_GCFG;
294*1b2596b5SMatthias Ringwald }
295*1b2596b5SMatthias Ringwald
296*1b2596b5SMatthias Ringwald /**
297*1b2596b5SMatthias Ringwald * \brief Get XDMAC global weighted arbiter configuration.
298*1b2596b5SMatthias Ringwald *
299*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
300*1b2596b5SMatthias Ringwald */
xdmac_get_arbiter(Xdmac * xdmac)301*1b2596b5SMatthias Ringwald static inline uint32_t xdmac_get_arbiter(Xdmac *xdmac)
302*1b2596b5SMatthias Ringwald {
303*1b2596b5SMatthias Ringwald Assert(xdmac);
304*1b2596b5SMatthias Ringwald return xdmac->XDMAC_GWAC;
305*1b2596b5SMatthias Ringwald }
306*1b2596b5SMatthias Ringwald
307*1b2596b5SMatthias Ringwald /**
308*1b2596b5SMatthias Ringwald * \brief Enables XDMAC global interrupt.
309*1b2596b5SMatthias Ringwald *
310*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
311*1b2596b5SMatthias Ringwald * \param[in] mask A bitmask of channels to be enabled interrupt.
312*1b2596b5SMatthias Ringwald */
xdmac_enable_interrupt(Xdmac * xdmac,uint32_t mask)313*1b2596b5SMatthias Ringwald static inline void xdmac_enable_interrupt(Xdmac *xdmac, uint32_t mask)
314*1b2596b5SMatthias Ringwald {
315*1b2596b5SMatthias Ringwald Assert(xdmac);
316*1b2596b5SMatthias Ringwald xdmac->XDMAC_GIE = ( XDMAC_GIE_IE0 << mask) ;
317*1b2596b5SMatthias Ringwald }
318*1b2596b5SMatthias Ringwald
319*1b2596b5SMatthias Ringwald /**
320*1b2596b5SMatthias Ringwald * \brief Disables XDMAC global interrupt
321*1b2596b5SMatthias Ringwald *
322*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
323*1b2596b5SMatthias Ringwald * \param[in] mask A bitmask of channels to be disabled interrupt.
324*1b2596b5SMatthias Ringwald */
xdmac_disable_interrupt(Xdmac * xdmac,uint32_t mask)325*1b2596b5SMatthias Ringwald static inline void xdmac_disable_interrupt(Xdmac *xdmac, uint32_t mask)
326*1b2596b5SMatthias Ringwald {
327*1b2596b5SMatthias Ringwald Assert(xdmac);
328*1b2596b5SMatthias Ringwald xdmac->XDMAC_GID = (XDMAC_GID_ID0 << mask);
329*1b2596b5SMatthias Ringwald }
330*1b2596b5SMatthias Ringwald
331*1b2596b5SMatthias Ringwald /**
332*1b2596b5SMatthias Ringwald * \brief Get XDMAC global interrupt mask.
333*1b2596b5SMatthias Ringwald *
334*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
335*1b2596b5SMatthias Ringwald */
xdmac_get_interrupt_mask(Xdmac * xdmac)336*1b2596b5SMatthias Ringwald static inline uint32_t xdmac_get_interrupt_mask(Xdmac *xdmac)
337*1b2596b5SMatthias Ringwald {
338*1b2596b5SMatthias Ringwald Assert(xdmac);
339*1b2596b5SMatthias Ringwald return (xdmac->XDMAC_GIM);
340*1b2596b5SMatthias Ringwald }
341*1b2596b5SMatthias Ringwald
342*1b2596b5SMatthias Ringwald /**
343*1b2596b5SMatthias Ringwald * \brief Get XDMAC global interrupt status.
344*1b2596b5SMatthias Ringwald *
345*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
346*1b2596b5SMatthias Ringwald */
xdmac_get_interrupt_status(Xdmac * xdmac)347*1b2596b5SMatthias Ringwald static inline uint32_t xdmac_get_interrupt_status(Xdmac *xdmac)
348*1b2596b5SMatthias Ringwald {
349*1b2596b5SMatthias Ringwald Assert(xdmac);
350*1b2596b5SMatthias Ringwald return (xdmac->XDMAC_GIS);
351*1b2596b5SMatthias Ringwald }
352*1b2596b5SMatthias Ringwald
353*1b2596b5SMatthias Ringwald /**
354*1b2596b5SMatthias Ringwald * \brief enables the relevant channel of given XDMAC.
355*1b2596b5SMatthias Ringwald *
356*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
357*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23)
358*1b2596b5SMatthias Ringwald */
xdmac_channel_enable(Xdmac * xdmac,uint32_t channel_num)359*1b2596b5SMatthias Ringwald static inline void xdmac_channel_enable(Xdmac *xdmac, uint32_t channel_num)
360*1b2596b5SMatthias Ringwald {
361*1b2596b5SMatthias Ringwald Assert(xdmac);
362*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
363*1b2596b5SMatthias Ringwald xdmac->XDMAC_GE = (XDMAC_GE_EN0 << channel_num);
364*1b2596b5SMatthias Ringwald }
365*1b2596b5SMatthias Ringwald
366*1b2596b5SMatthias Ringwald /**
367*1b2596b5SMatthias Ringwald * \brief Disables the relevant channel of given XDMAC.
368*1b2596b5SMatthias Ringwald *
369*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
370*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23)
371*1b2596b5SMatthias Ringwald */
xdmac_channel_disable(Xdmac * xdmac,uint32_t channel_num)372*1b2596b5SMatthias Ringwald static inline void xdmac_channel_disable(Xdmac *xdmac, uint32_t channel_num)
373*1b2596b5SMatthias Ringwald {
374*1b2596b5SMatthias Ringwald Assert(xdmac);
375*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
376*1b2596b5SMatthias Ringwald xdmac->XDMAC_GD =(XDMAC_GD_DI0 << channel_num);
377*1b2596b5SMatthias Ringwald }
378*1b2596b5SMatthias Ringwald
379*1b2596b5SMatthias Ringwald /**
380*1b2596b5SMatthias Ringwald * \brief Get Global channel status of given XDMAC.
381*1b2596b5SMatthias Ringwald * \note: When set to 1, this bit indicates that the channel x is enabled.
382*1b2596b5SMatthias Ringwald If a channel disable request is issued, this bit remains asserted
383*1b2596b5SMatthias Ringwald until pending transaction is completed.
384*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
385*1b2596b5SMatthias Ringwald */
xdmac_channel_get_status(Xdmac * xdmac)386*1b2596b5SMatthias Ringwald static inline uint32_t xdmac_channel_get_status(Xdmac *xdmac)
387*1b2596b5SMatthias Ringwald {
388*1b2596b5SMatthias Ringwald Assert(xdmac);
389*1b2596b5SMatthias Ringwald return xdmac->XDMAC_GS;
390*1b2596b5SMatthias Ringwald }
391*1b2596b5SMatthias Ringwald
392*1b2596b5SMatthias Ringwald /**
393*1b2596b5SMatthias Ringwald * \brief Suspend the relevant channel's read.
394*1b2596b5SMatthias Ringwald *
395*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
396*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
397*1b2596b5SMatthias Ringwald */
xdmac_channel_read_suspend(Xdmac * xdmac,uint32_t channel_num)398*1b2596b5SMatthias Ringwald static inline void xdmac_channel_read_suspend(Xdmac *xdmac, uint32_t channel_num)
399*1b2596b5SMatthias Ringwald {
400*1b2596b5SMatthias Ringwald Assert(xdmac);
401*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
402*1b2596b5SMatthias Ringwald xdmac->XDMAC_GRS |= XDMAC_GRS_RS0 << channel_num;
403*1b2596b5SMatthias Ringwald }
404*1b2596b5SMatthias Ringwald
405*1b2596b5SMatthias Ringwald /**
406*1b2596b5SMatthias Ringwald * \brief Suspend the relevant channel's write.
407*1b2596b5SMatthias Ringwald *
408*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
409*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
410*1b2596b5SMatthias Ringwald */
xdmac_channel_write_suspend(Xdmac * xdmac,uint32_t channel_num)411*1b2596b5SMatthias Ringwald static inline void xdmac_channel_write_suspend(Xdmac *xdmac, uint32_t channel_num)
412*1b2596b5SMatthias Ringwald {
413*1b2596b5SMatthias Ringwald Assert(xdmac);
414*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
415*1b2596b5SMatthias Ringwald xdmac->XDMAC_GWS |= XDMAC_GWS_WS0 << channel_num;
416*1b2596b5SMatthias Ringwald }
417*1b2596b5SMatthias Ringwald
418*1b2596b5SMatthias Ringwald /**
419*1b2596b5SMatthias Ringwald * \brief Suspend the relevant channel's read & write.
420*1b2596b5SMatthias Ringwald *
421*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
422*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
423*1b2596b5SMatthias Ringwald */
xdmac_channel_readwrite_suspend(Xdmac * xdmac,uint32_t channel_num)424*1b2596b5SMatthias Ringwald static inline void xdmac_channel_readwrite_suspend(Xdmac *xdmac, uint32_t channel_num)
425*1b2596b5SMatthias Ringwald {
426*1b2596b5SMatthias Ringwald Assert(xdmac);
427*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
428*1b2596b5SMatthias Ringwald xdmac->XDMAC_GRWS = (XDMAC_GRWS_RWS0 << channel_num);
429*1b2596b5SMatthias Ringwald }
430*1b2596b5SMatthias Ringwald
431*1b2596b5SMatthias Ringwald /**
432*1b2596b5SMatthias Ringwald * \brief Resume the relevant channel's read & write.
433*1b2596b5SMatthias Ringwald *
434*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
435*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
436*1b2596b5SMatthias Ringwald */
xdmac_channel_readwrite_resume(Xdmac * xdmac,uint32_t channel_num)437*1b2596b5SMatthias Ringwald static inline void xdmac_channel_readwrite_resume(Xdmac *xdmac, uint32_t channel_num)
438*1b2596b5SMatthias Ringwald {
439*1b2596b5SMatthias Ringwald Assert(xdmac);
440*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
441*1b2596b5SMatthias Ringwald xdmac->XDMAC_GRWR = (XDMAC_GRWR_RWR0 << channel_num);
442*1b2596b5SMatthias Ringwald }
443*1b2596b5SMatthias Ringwald
444*1b2596b5SMatthias Ringwald /**
445*1b2596b5SMatthias Ringwald * \brief Set software transfer request on the relevant channel.
446*1b2596b5SMatthias Ringwald *
447*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
448*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
449*1b2596b5SMatthias Ringwald */
xdmac_channel_software_request(Xdmac * xdmac,uint32_t channel_num)450*1b2596b5SMatthias Ringwald static inline void xdmac_channel_software_request(Xdmac *xdmac, uint32_t channel_num)
451*1b2596b5SMatthias Ringwald {
452*1b2596b5SMatthias Ringwald Assert(xdmac);
453*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
454*1b2596b5SMatthias Ringwald xdmac->XDMAC_GSWR = (XDMAC_GSWR_SWREQ0 << channel_num);
455*1b2596b5SMatthias Ringwald }
456*1b2596b5SMatthias Ringwald
457*1b2596b5SMatthias Ringwald /**
458*1b2596b5SMatthias Ringwald * \brief Get software transfer status of the relevant channel.
459*1b2596b5SMatthias Ringwald *
460*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
461*1b2596b5SMatthias Ringwald */
xdmac_get_software_request_status(Xdmac * xdmac)462*1b2596b5SMatthias Ringwald static inline uint32_t xdmac_get_software_request_status(Xdmac *xdmac)
463*1b2596b5SMatthias Ringwald {
464*1b2596b5SMatthias Ringwald Assert(xdmac);
465*1b2596b5SMatthias Ringwald return xdmac->XDMAC_GSWS;
466*1b2596b5SMatthias Ringwald }
467*1b2596b5SMatthias Ringwald
468*1b2596b5SMatthias Ringwald /**
469*1b2596b5SMatthias Ringwald * \brief Enable interrupt with mask on the relevant channel of given XDMA.
470*1b2596b5SMatthias Ringwald *
471*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
472*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
473*1b2596b5SMatthias Ringwald * \param[in] mask Interrupt mask.
474*1b2596b5SMatthias Ringwald */
xdmac_channel_enable_interrupt(Xdmac * xdmac,uint32_t channel_num,uint32_t mask)475*1b2596b5SMatthias Ringwald static inline void xdmac_channel_enable_interrupt(Xdmac *xdmac, uint32_t channel_num, uint32_t mask)
476*1b2596b5SMatthias Ringwald {
477*1b2596b5SMatthias Ringwald Assert(xdmac);
478*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
479*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CIE = mask;
480*1b2596b5SMatthias Ringwald }
481*1b2596b5SMatthias Ringwald
482*1b2596b5SMatthias Ringwald /**
483*1b2596b5SMatthias Ringwald * \brief Disable interrupt with mask on the relevant channel of given XDMA.
484*1b2596b5SMatthias Ringwald *
485*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
486*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
487*1b2596b5SMatthias Ringwald * \param[in] mask Interrupt mask.
488*1b2596b5SMatthias Ringwald */
xdmac_channel_disable_interrupt(Xdmac * xdmac,uint32_t channel_num,uint32_t mask)489*1b2596b5SMatthias Ringwald static inline void xdmac_channel_disable_interrupt(Xdmac *xdmac, uint32_t channel_num, uint32_t mask)
490*1b2596b5SMatthias Ringwald {
491*1b2596b5SMatthias Ringwald Assert(xdmac);
492*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
493*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CID = mask;
494*1b2596b5SMatthias Ringwald }
495*1b2596b5SMatthias Ringwald
496*1b2596b5SMatthias Ringwald /**
497*1b2596b5SMatthias Ringwald * \brief Get interrupt mask for the relevant channel of given XDMA.
498*1b2596b5SMatthias Ringwald *
499*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
500*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
501*1b2596b5SMatthias Ringwald */
xdmac_channel_get_interrupt_mask(Xdmac * xdmac,uint32_t channel_num)502*1b2596b5SMatthias Ringwald static inline uint32_t xdmac_channel_get_interrupt_mask(Xdmac *xdmac, uint32_t channel_num)
503*1b2596b5SMatthias Ringwald {
504*1b2596b5SMatthias Ringwald Assert(xdmac);
505*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
506*1b2596b5SMatthias Ringwald return xdmac->XDMAC_CHID[channel_num].XDMAC_CIM;
507*1b2596b5SMatthias Ringwald }
508*1b2596b5SMatthias Ringwald
509*1b2596b5SMatthias Ringwald /**
510*1b2596b5SMatthias Ringwald * \brief Get interrupt status for the relevant channel of given XDMA.
511*1b2596b5SMatthias Ringwald *
512*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
513*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
514*1b2596b5SMatthias Ringwald */
xdmac_channel_get_interrupt_status(Xdmac * xdmac,uint32_t channel_num)515*1b2596b5SMatthias Ringwald static inline uint32_t xdmac_channel_get_interrupt_status(Xdmac *xdmac, uint32_t channel_num)
516*1b2596b5SMatthias Ringwald {
517*1b2596b5SMatthias Ringwald Assert(xdmac);
518*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
519*1b2596b5SMatthias Ringwald return xdmac->XDMAC_CHID[channel_num].XDMAC_CIS;
520*1b2596b5SMatthias Ringwald }
521*1b2596b5SMatthias Ringwald
522*1b2596b5SMatthias Ringwald /**
523*1b2596b5SMatthias Ringwald * \brief Set software flush request on the relevant channel.
524*1b2596b5SMatthias Ringwald *
525*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer.
526*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23).
527*1b2596b5SMatthias Ringwald */
xdmac_channel_software_flush_request(Xdmac * xdmac,uint32_t channel_num)528*1b2596b5SMatthias Ringwald static inline void xdmac_channel_software_flush_request(Xdmac *xdmac, uint32_t channel_num)
529*1b2596b5SMatthias Ringwald {
530*1b2596b5SMatthias Ringwald Assert(xdmac);
531*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
532*1b2596b5SMatthias Ringwald xdmac->XDMAC_GSWF = (XDMAC_GSWF_SWF0 << channel_num);
533*1b2596b5SMatthias Ringwald while( !(xdmac_channel_get_interrupt_status(xdmac, channel_num) & XDMAC_CIS_FIS) );
534*1b2596b5SMatthias Ringwald }
535*1b2596b5SMatthias Ringwald
536*1b2596b5SMatthias Ringwald /**
537*1b2596b5SMatthias Ringwald * \brief Set source address for the relevant channel of given XDMA.
538*1b2596b5SMatthias Ringwald *
539*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
540*1b2596b5SMatthias Ringwald * \param[in] channel_num DMA Channel number (range 0 to 23)
541*1b2596b5SMatthias Ringwald * \param[in] src_addr Source address
542*1b2596b5SMatthias Ringwald */
xdmac_channel_set_source_addr(Xdmac * xdmac,uint32_t channel_num,uint32_t src_addr)543*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_source_addr(Xdmac *xdmac, uint32_t channel_num, uint32_t src_addr)
544*1b2596b5SMatthias Ringwald {
545*1b2596b5SMatthias Ringwald Assert(xdmac);
546*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
547*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CSA = src_addr;
548*1b2596b5SMatthias Ringwald }
549*1b2596b5SMatthias Ringwald
550*1b2596b5SMatthias Ringwald /**
551*1b2596b5SMatthias Ringwald * \brief Set destination address for the relevant channel of given XDMA.
552*1b2596b5SMatthias Ringwald *
553*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
554*1b2596b5SMatthias Ringwald * \param[in] channel_num DMA Channel number (range 0 to 23)
555*1b2596b5SMatthias Ringwald * \param[in] dst_addr Destination address
556*1b2596b5SMatthias Ringwald */
xdmac_channel_set_destination_addr(Xdmac * xdmac,uint32_t channel_num,uint32_t dst_addr)557*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_destination_addr(Xdmac *xdmac, uint32_t channel_num, uint32_t dst_addr)
558*1b2596b5SMatthias Ringwald {
559*1b2596b5SMatthias Ringwald Assert(xdmac);
560*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
561*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CDA = dst_addr;
562*1b2596b5SMatthias Ringwald }
563*1b2596b5SMatthias Ringwald
564*1b2596b5SMatthias Ringwald /**
565*1b2596b5SMatthias Ringwald * \brief Set next descriptor's address & interface for the relevant channel of given XDMA.
566*1b2596b5SMatthias Ringwald *
567*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
568*1b2596b5SMatthias Ringwald * \param[in] channel_num DMA Channel number (range 0 to 23)
569*1b2596b5SMatthias Ringwald * \param[in] desc_addr Address of next descriptor.
570*1b2596b5SMatthias Ringwald * \param[in] ndaif Interface of next descriptor.
571*1b2596b5SMatthias Ringwald */
xdmac_channel_set_descriptor_addr(Xdmac * xdmac,uint32_t channel_num,uint32_t desc_addr,uint8_t ndaif)572*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_descriptor_addr(Xdmac *xdmac, uint32_t channel_num,
573*1b2596b5SMatthias Ringwald uint32_t desc_addr, uint8_t ndaif)
574*1b2596b5SMatthias Ringwald {
575*1b2596b5SMatthias Ringwald Assert(xdmac);
576*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
577*1b2596b5SMatthias Ringwald Assert(ndaif<2);
578*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CNDA = (desc_addr & 0xFFFFFFFC) | ndaif;
579*1b2596b5SMatthias Ringwald }
580*1b2596b5SMatthias Ringwald
581*1b2596b5SMatthias Ringwald /**
582*1b2596b5SMatthias Ringwald * \brief Set next descriptor's configuration for the relevant channel of given XDMA.
583*1b2596b5SMatthias Ringwald *
584*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
585*1b2596b5SMatthias Ringwald * \param[in] channel_num DMA Channel number (range 0 to 23)
586*1b2596b5SMatthias Ringwald * \param[in] config Configuration of next descriptor.
587*1b2596b5SMatthias Ringwald */
xdmac_channel_set_descriptor_control(Xdmac * xdmac,uint32_t channel_num,uint32_t config)588*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_descriptor_control(Xdmac *xdmac, uint32_t channel_num, uint32_t config)
589*1b2596b5SMatthias Ringwald {
590*1b2596b5SMatthias Ringwald Assert(xdmac);
591*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
592*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CNDC = config;
593*1b2596b5SMatthias Ringwald }
594*1b2596b5SMatthias Ringwald
595*1b2596b5SMatthias Ringwald /**
596*1b2596b5SMatthias Ringwald * \brief Set microblock length for the relevant channel of given XDMA.
597*1b2596b5SMatthias Ringwald *
598*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
599*1b2596b5SMatthias Ringwald * \param[in] channel_num DMA Channel number (range 0 to 23)
600*1b2596b5SMatthias Ringwald * \param[in] ublen Microblock length.
601*1b2596b5SMatthias Ringwald */
xdmac_channel_set_microblock_control(Xdmac * xdmac,uint32_t channel_num,uint32_t ublen)602*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_microblock_control(Xdmac *xdmac, uint32_t channel_num, uint32_t ublen)
603*1b2596b5SMatthias Ringwald {
604*1b2596b5SMatthias Ringwald Assert(xdmac);
605*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
606*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CUBC = XDMAC_CUBC_UBLEN(ublen);
607*1b2596b5SMatthias Ringwald }
608*1b2596b5SMatthias Ringwald
609*1b2596b5SMatthias Ringwald /**
610*1b2596b5SMatthias Ringwald * \brief Set block length for the relevant channel of given XDMA.
611*1b2596b5SMatthias Ringwald *
612*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
613*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23)
614*1b2596b5SMatthias Ringwald * \param[in] blen Block length.
615*1b2596b5SMatthias Ringwald */
xdmac_channel_set_block_control(Xdmac * xdmac,uint32_t channel_num,uint32_t blen)616*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_block_control(Xdmac *xdmac, uint32_t channel_num, uint32_t blen)
617*1b2596b5SMatthias Ringwald {
618*1b2596b5SMatthias Ringwald Assert(xdmac);
619*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
620*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CBC = XDMAC_CBC_BLEN(blen);
621*1b2596b5SMatthias Ringwald }
622*1b2596b5SMatthias Ringwald
623*1b2596b5SMatthias Ringwald /**
624*1b2596b5SMatthias Ringwald * \brief Set configuration for the relevant channel of given XDMA.
625*1b2596b5SMatthias Ringwald *
626*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
627*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23)
628*1b2596b5SMatthias Ringwald * \param[in] config Channel configuration.
629*1b2596b5SMatthias Ringwald */
xdmac_channel_set_config(Xdmac * xdmac,uint32_t channel_num,uint32_t config)630*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_config(Xdmac *xdmac, uint32_t channel_num, uint32_t config)
631*1b2596b5SMatthias Ringwald {
632*1b2596b5SMatthias Ringwald Assert(xdmac);
633*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
634*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CC = config;
635*1b2596b5SMatthias Ringwald }
636*1b2596b5SMatthias Ringwald
637*1b2596b5SMatthias Ringwald /**
638*1b2596b5SMatthias Ringwald * \brief Set the relevant channel's data stride memory pattern of given XDMA.
639*1b2596b5SMatthias Ringwald *
640*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
641*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23)
642*1b2596b5SMatthias Ringwald * \param[in] dds_msp Data stride memory pattern.
643*1b2596b5SMatthias Ringwald */
xdmac_channel_set_datastride_mempattern(Xdmac * xdmac,uint32_t channel_num,uint32_t dds_msp)644*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_datastride_mempattern(Xdmac *xdmac, uint32_t channel_num, uint32_t dds_msp)
645*1b2596b5SMatthias Ringwald {
646*1b2596b5SMatthias Ringwald Assert(xdmac);
647*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
648*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CDS_MSP = dds_msp;
649*1b2596b5SMatthias Ringwald }
650*1b2596b5SMatthias Ringwald
651*1b2596b5SMatthias Ringwald /**
652*1b2596b5SMatthias Ringwald * \brief Set the relevant channel's source microblock stride of given XDMA.
653*1b2596b5SMatthias Ringwald *
654*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
655*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23)
656*1b2596b5SMatthias Ringwald * \param[in] subs Source microblock stride.
657*1b2596b5SMatthias Ringwald */
xdmac_channel_set_source_microblock_stride(Xdmac * xdmac,uint32_t channel_num,uint32_t subs)658*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_source_microblock_stride(Xdmac *xdmac,
659*1b2596b5SMatthias Ringwald uint32_t channel_num, uint32_t subs)
660*1b2596b5SMatthias Ringwald {
661*1b2596b5SMatthias Ringwald Assert(xdmac);
662*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
663*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CSUS = XDMAC_CSUS_SUBS(subs);
664*1b2596b5SMatthias Ringwald }
665*1b2596b5SMatthias Ringwald
666*1b2596b5SMatthias Ringwald /**
667*1b2596b5SMatthias Ringwald * \brief Set the relevant channel's destination microblock stride of given XDMA.
668*1b2596b5SMatthias Ringwald *
669*1b2596b5SMatthias Ringwald * \param[out] xdmac Module hardware register base address pointer
670*1b2596b5SMatthias Ringwald * \param[in] channel_num XDMA Channel number (range 0 to 23)
671*1b2596b5SMatthias Ringwald * \param[in] dubs Destination microblock stride.
672*1b2596b5SMatthias Ringwald */
xdmac_channel_set_destination_microblock_stride(Xdmac * xdmac,uint32_t channel_num,uint32_t dubs)673*1b2596b5SMatthias Ringwald static inline void xdmac_channel_set_destination_microblock_stride(Xdmac *xdmac,
674*1b2596b5SMatthias Ringwald uint32_t channel_num, uint32_t dubs)
675*1b2596b5SMatthias Ringwald {
676*1b2596b5SMatthias Ringwald Assert(xdmac);
677*1b2596b5SMatthias Ringwald Assert(channel_num < XDMACCHID_NUMBER);
678*1b2596b5SMatthias Ringwald xdmac->XDMAC_CHID[channel_num].XDMAC_CDUS = XDMAC_CDUS_DUBS(dubs);
679*1b2596b5SMatthias Ringwald }
680*1b2596b5SMatthias Ringwald
681*1b2596b5SMatthias Ringwald void xdmac_configure_transfer(Xdmac *xdmac, uint32_t channel_num,
682*1b2596b5SMatthias Ringwald xdmac_channel_config_t *p_cfg);
683*1b2596b5SMatthias Ringwald
684*1b2596b5SMatthias Ringwald /** @cond */
685*1b2596b5SMatthias Ringwald /**INDENT-OFF**/
686*1b2596b5SMatthias Ringwald #ifdef __cplusplus
687*1b2596b5SMatthias Ringwald }
688*1b2596b5SMatthias Ringwald #endif
689*1b2596b5SMatthias Ringwald /**INDENT-ON**/
690*1b2596b5SMatthias Ringwald /** @endcond */
691*1b2596b5SMatthias Ringwald
692*1b2596b5SMatthias Ringwald /** @} */
693*1b2596b5SMatthias Ringwald
694*1b2596b5SMatthias Ringwald /**
695*1b2596b5SMatthias Ringwald * \page asfdoc_sam_drivers_xdmac_extra Extra Information for Extensible Direct Memory Access Controller Driver
696*1b2596b5SMatthias Ringwald *
697*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_extra_acronyms Acronyms
698*1b2596b5SMatthias Ringwald * Below is a table listing the acronyms used in this module, along with their
699*1b2596b5SMatthias Ringwald * intended meanings.
700*1b2596b5SMatthias Ringwald *
701*1b2596b5SMatthias Ringwald * <table>
702*1b2596b5SMatthias Ringwald * <tr>
703*1b2596b5SMatthias Ringwald * <th>Acronym</th>
704*1b2596b5SMatthias Ringwald * <th>Definition</th>
705*1b2596b5SMatthias Ringwald * </tr>
706*1b2596b5SMatthias Ringwald * <tr>
707*1b2596b5SMatthias Ringwald * <td>AHB</td>
708*1b2596b5SMatthias Ringwald * <td>AMBA High-performance Bus</td>
709*1b2596b5SMatthias Ringwald * </tr>
710*1b2596b5SMatthias Ringwald * <tr>
711*1b2596b5SMatthias Ringwald * <td>AMBA</td>
712*1b2596b5SMatthias Ringwald * <td>Advanced Microcontroller Bus Architecture</td>
713*1b2596b5SMatthias Ringwald * </tr>
714*1b2596b5SMatthias Ringwald * <tr>
715*1b2596b5SMatthias Ringwald * <td>FIFO</td>
716*1b2596b5SMatthias Ringwald * <td>First In First Out</td>
717*1b2596b5SMatthias Ringwald * </tr>
718*1b2596b5SMatthias Ringwald * <tr>
719*1b2596b5SMatthias Ringwald * <td>LLD</td>
720*1b2596b5SMatthias Ringwald * <td>Linked List Descriptor</td>
721*1b2596b5SMatthias Ringwald * </tr>
722*1b2596b5SMatthias Ringwald * <tr>
723*1b2596b5SMatthias Ringwald * <td>QSG</td>
724*1b2596b5SMatthias Ringwald * <td>Quick Start Guide</td>
725*1b2596b5SMatthias Ringwald * </tr>
726*1b2596b5SMatthias Ringwald * </table>
727*1b2596b5SMatthias Ringwald *
728*1b2596b5SMatthias Ringwald *
729*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_extra_dependencies Dependencies
730*1b2596b5SMatthias Ringwald * This driver has the following dependencies:
731*1b2596b5SMatthias Ringwald *
732*1b2596b5SMatthias Ringwald * - None
733*1b2596b5SMatthias Ringwald *
734*1b2596b5SMatthias Ringwald *
735*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_extra_errata Errata
736*1b2596b5SMatthias Ringwald * There are no errata related to this driver.
737*1b2596b5SMatthias Ringwald *
738*1b2596b5SMatthias Ringwald *
739*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_extra_history Module History
740*1b2596b5SMatthias Ringwald * An overview of the module history is presented in the table below, with
741*1b2596b5SMatthias Ringwald * details on the enhancements and fixes made to the module since its first
742*1b2596b5SMatthias Ringwald * release. The current version of this corresponds to the newest version in
743*1b2596b5SMatthias Ringwald * the table.
744*1b2596b5SMatthias Ringwald *
745*1b2596b5SMatthias Ringwald * <table>
746*1b2596b5SMatthias Ringwald * <tr>
747*1b2596b5SMatthias Ringwald * <th>Changelog</th>
748*1b2596b5SMatthias Ringwald * </tr>
749*1b2596b5SMatthias Ringwald * <tr>
750*1b2596b5SMatthias Ringwald * <td>Initial document release</td>
751*1b2596b5SMatthias Ringwald * </tr>
752*1b2596b5SMatthias Ringwald * </table>
753*1b2596b5SMatthias Ringwald */
754*1b2596b5SMatthias Ringwald
755*1b2596b5SMatthias Ringwald /**
756*1b2596b5SMatthias Ringwald * \page asfdoc_sam_drivers_xdmac_exqsg Examples for Direct Memory Access Controller Driver
757*1b2596b5SMatthias Ringwald *
758*1b2596b5SMatthias Ringwald * This is a list of the available Quick Start Guides (QSGs) and example
759*1b2596b5SMatthias Ringwald * applications for \ref asfdoc_sam_drivers_xdmac_group. QSGs are simple examples with
760*1b2596b5SMatthias Ringwald * step-by-step instructions to configure and use this driver in a selection of
761*1b2596b5SMatthias Ringwald * use cases. Note that QSGs can be compiled as a standalone application or be
762*1b2596b5SMatthias Ringwald * added to the user application.
763*1b2596b5SMatthias Ringwald *
764*1b2596b5SMatthias Ringwald * - \subpage asfdoc_sam_drivers_xdmac_qsg
765*1b2596b5SMatthias Ringwald * - \subpage asfdoc_sam_drivers_xdmac_example
766*1b2596b5SMatthias Ringwald *
767*1b2596b5SMatthias Ringwald * \page asfdoc_sam_drivers_xdmac_document_revision_history Document Revision History
768*1b2596b5SMatthias Ringwald *
769*1b2596b5SMatthias Ringwald * <table>
770*1b2596b5SMatthias Ringwald * <tr>
771*1b2596b5SMatthias Ringwald * <th>Doc. Rev.</td>
772*1b2596b5SMatthias Ringwald * <th>Date</td>
773*1b2596b5SMatthias Ringwald * <th>Comments</td>
774*1b2596b5SMatthias Ringwald * </tr>
775*1b2596b5SMatthias Ringwald * <tr>
776*1b2596b5SMatthias Ringwald * <td>XXXXXA</td>
777*1b2596b5SMatthias Ringwald * <td>08/2015</td>
778*1b2596b5SMatthias Ringwald * <td>Initial document release</td>
779*1b2596b5SMatthias Ringwald * </tr>
780*1b2596b5SMatthias Ringwald * </table>
781*1b2596b5SMatthias Ringwald *
782*1b2596b5SMatthias Ringwald */
783*1b2596b5SMatthias Ringwald
784*1b2596b5SMatthias Ringwald /**
785*1b2596b5SMatthias Ringwald * \page asfdoc_sam_drivers_xdmac_qsg Quick Start Guide for the XDMAC driver
786*1b2596b5SMatthias Ringwald *
787*1b2596b5SMatthias Ringwald * This is the quick start guide for the \ref asfdoc_sam_drivers_xdmac_group, with
788*1b2596b5SMatthias Ringwald * step-by-step instructions on how to configure and use the driver for
789*1b2596b5SMatthias Ringwald * a specific use case.The code examples can be copied into e.g the main
790*1b2596b5SMatthias Ringwald * application loop or any other function that will need to control the
791*1b2596b5SMatthias Ringwald * XDMAC module.
792*1b2596b5SMatthias Ringwald *
793*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_qsg_use_cases Use Cases
794*1b2596b5SMatthias Ringwald * - \ref asfdoc_sam_drivers_xdmac_qsg_basic
795*1b2596b5SMatthias Ringwald *
796*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_qsg_basic XDMAC Basic Usage
797*1b2596b5SMatthias Ringwald *
798*1b2596b5SMatthias Ringwald * This use case will demonstrate how to config the XDMAC module to
799*1b2596b5SMatthias Ringwald * perform a single memory to memory transfer.
800*1b2596b5SMatthias Ringwald *
801*1b2596b5SMatthias Ringwald *
802*1b2596b5SMatthias Ringwald * \section asfdoc_sam_drivers_xdmac_qsg_basic_setup Setup Steps
803*1b2596b5SMatthias Ringwald *
804*1b2596b5SMatthias Ringwald * \subsection asfdoc_sam_drivers_xdmac_qsg_basic_prereq Prerequisites
805*1b2596b5SMatthias Ringwald *
806*1b2596b5SMatthias Ringwald * This module requires the following service
807*1b2596b5SMatthias Ringwald * - \ref clk_group "System Clock Management (sysclock)"
808*1b2596b5SMatthias Ringwald *
809*1b2596b5SMatthias Ringwald * \subsection asfdoc_sam_drivers_xdmac_qsg_basic_setup_code Setup Code
810*1b2596b5SMatthias Ringwald *
811*1b2596b5SMatthias Ringwald * Add these macros and global variable to the top of your application's C-file:
812*1b2596b5SMatthias Ringwald * \snippet xdmac_example.c xdmac_define_channel
813*1b2596b5SMatthias Ringwald * \snippet xdmac_example.c xdmac_define_buffer
814*1b2596b5SMatthias Ringwald *
815*1b2596b5SMatthias Ringwald * Add this to the main loop or a setup function:
816*1b2596b5SMatthias Ringwald * \snippet xdmac_example.c xdmac_configure_transfer
817*1b2596b5SMatthias Ringwald *
818*1b2596b5SMatthias Ringwald * \subsection asfdoc_sam_drivers_xdmac_qsg_basic_setup_workflow Workflow
819*1b2596b5SMatthias Ringwald *
820*1b2596b5SMatthias Ringwald * -# Configure XDMAC transfer:
821*1b2596b5SMatthias Ringwald * \snippet xdmac_example.c xdmac_configure_transfer
822*1b2596b5SMatthias Ringwald * -# Enable the XDMAC interrupt:
823*1b2596b5SMatthias Ringwald * \snippet xdmac_example.c xdmac_enable_interrupt
824*1b2596b5SMatthias Ringwald * \snippet xdmac_example.c xdmac_channel_enable_interrupt
825*1b2596b5SMatthias Ringwald * -# Eanble the channel:
826*1b2596b5SMatthias Ringwald * \snippet xdmac_example.c xdmac_channel_enable
827*1b2596b5SMatthias Ringwald *
828*1b2596b5SMatthias Ringwald */
829*1b2596b5SMatthias Ringwald
830*1b2596b5SMatthias Ringwald #endif /* XDMAC_H_INCLUDED */
831