1*1b2596b5SMatthias Ringwald /**
2*1b2596b5SMatthias Ringwald * \file
3*1b2596b5SMatthias Ringwald *
4*1b2596b5SMatthias Ringwald * \brief Matrix driver for SAM.
5*1b2596b5SMatthias Ringwald *
6*1b2596b5SMatthias Ringwald * Copyright (c) 2012-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 #include "matrix.h"
48*1b2596b5SMatthias Ringwald
49*1b2596b5SMatthias Ringwald /* / @cond 0 */
50*1b2596b5SMatthias Ringwald /**INDENT-OFF**/
51*1b2596b5SMatthias Ringwald #ifdef __cplusplus
52*1b2596b5SMatthias Ringwald extern "C" {
53*1b2596b5SMatthias Ringwald #endif
54*1b2596b5SMatthias Ringwald /**INDENT-ON**/
55*1b2596b5SMatthias Ringwald /* / @endcond */
56*1b2596b5SMatthias Ringwald
57*1b2596b5SMatthias Ringwald /**
58*1b2596b5SMatthias Ringwald * \defgroup sam_drivers_matrix_group Matrix (MATRIX)
59*1b2596b5SMatthias Ringwald *
60*1b2596b5SMatthias Ringwald * \par Purpose
61*1b2596b5SMatthias Ringwald *
62*1b2596b5SMatthias Ringwald * The Bus Matrix implements a multi-layer AHB that enables parallel access
63*1b2596b5SMatthias Ringwald * paths between multiple AHB masters and slaves in a system, which increases
64*1b2596b5SMatthias Ringwald * the overall bandwidth.
65*1b2596b5SMatthias Ringwald *
66*1b2596b5SMatthias Ringwald * @{
67*1b2596b5SMatthias Ringwald */
68*1b2596b5SMatthias Ringwald
69*1b2596b5SMatthias Ringwald #if SAM4C
70*1b2596b5SMatthias Ringwald #ifdef SAM4C_0
71*1b2596b5SMatthias Ringwald #define MATRIX MATRIX0
72*1b2596b5SMatthias Ringwald #else
73*1b2596b5SMatthias Ringwald #define MATRIX MATRIX1
74*1b2596b5SMatthias Ringwald #endif
75*1b2596b5SMatthias Ringwald #endif
76*1b2596b5SMatthias Ringwald
77*1b2596b5SMatthias Ringwald #if SAM4CP
78*1b2596b5SMatthias Ringwald #ifdef SAM4CP_0
79*1b2596b5SMatthias Ringwald #define MATRIX MATRIX0
80*1b2596b5SMatthias Ringwald #else
81*1b2596b5SMatthias Ringwald #define MATRIX MATRIX1
82*1b2596b5SMatthias Ringwald #endif
83*1b2596b5SMatthias Ringwald #endif
84*1b2596b5SMatthias Ringwald
85*1b2596b5SMatthias Ringwald #if SAM4CM
86*1b2596b5SMatthias Ringwald #ifdef SAM4CM_0
87*1b2596b5SMatthias Ringwald #define MATRIX MATRIX0
88*1b2596b5SMatthias Ringwald #else
89*1b2596b5SMatthias Ringwald #define MATRIX MATRIX1
90*1b2596b5SMatthias Ringwald #endif
91*1b2596b5SMatthias Ringwald #endif
92*1b2596b5SMatthias Ringwald
93*1b2596b5SMatthias Ringwald #ifndef MATRIX_WPMR_WPKEY_PASSWD
94*1b2596b5SMatthias Ringwald #define MATRIX_WPMR_WPKEY_PASSWD MATRIX_WPMR_WPKEY(0x4D4154U)
95*1b2596b5SMatthias Ringwald #endif
96*1b2596b5SMatthias Ringwald
97*1b2596b5SMatthias Ringwald /**
98*1b2596b5SMatthias Ringwald * \brief Set undefined length burst type of the specified master.
99*1b2596b5SMatthias Ringwald *
100*1b2596b5SMatthias Ringwald * \param ul_id Master index.
101*1b2596b5SMatthias Ringwald * \param burst_type Undefined length burst type.
102*1b2596b5SMatthias Ringwald */
matrix_set_master_burst_type(uint32_t ul_id,burst_type_t burst_type)103*1b2596b5SMatthias Ringwald void matrix_set_master_burst_type(uint32_t ul_id, burst_type_t burst_type)
104*1b2596b5SMatthias Ringwald {
105*1b2596b5SMatthias Ringwald #if (SAMV70 || SAMS70|| SAME70)
106*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
107*1b2596b5SMatthias Ringwald volatile uint32_t *p_MCFG;
108*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
109*1b2596b5SMatthias Ringwald uint32_t ul_dlt;
110*1b2596b5SMatthias Ringwald
111*1b2596b5SMatthias Ringwald ul_dlt = (uint32_t)&(p_matrix->MATRIX_MCFG1);
112*1b2596b5SMatthias Ringwald ul_dlt = ul_dlt - (uint32_t)&(p_matrix->MATRIX_MCFG0);
113*1b2596b5SMatthias Ringwald
114*1b2596b5SMatthias Ringwald p_MCFG = (volatile uint32_t *)((uint32_t)&(p_matrix->MATRIX_MCFG0) +
115*1b2596b5SMatthias Ringwald ul_id * ul_dlt);
116*1b2596b5SMatthias Ringwald
117*1b2596b5SMatthias Ringwald ul_reg = *p_MCFG & (~MATRIX_MCFG0_ULBT_Msk);
118*1b2596b5SMatthias Ringwald *p_MCFG = ul_reg | (uint32_t)burst_type;
119*1b2596b5SMatthias Ringwald #else
120*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
121*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
122*1b2596b5SMatthias Ringwald
123*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_MCFG[ul_id] & (~MATRIX_MCFG_ULBT_Msk);
124*1b2596b5SMatthias Ringwald p_matrix->MATRIX_MCFG[ul_id] = ul_reg | (uint32_t)burst_type;
125*1b2596b5SMatthias Ringwald #endif
126*1b2596b5SMatthias Ringwald }
127*1b2596b5SMatthias Ringwald
128*1b2596b5SMatthias Ringwald /**
129*1b2596b5SMatthias Ringwald * \brief Get undefined length burst type of the specified master.
130*1b2596b5SMatthias Ringwald *
131*1b2596b5SMatthias Ringwald * \param ul_id Master index.
132*1b2596b5SMatthias Ringwald *
133*1b2596b5SMatthias Ringwald * \return Undefined length burst type.
134*1b2596b5SMatthias Ringwald */
matrix_get_master_burst_type(uint32_t ul_id)135*1b2596b5SMatthias Ringwald burst_type_t matrix_get_master_burst_type(uint32_t ul_id)
136*1b2596b5SMatthias Ringwald {
137*1b2596b5SMatthias Ringwald #if (SAMV70 || SAMS70|| SAME70)
138*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
139*1b2596b5SMatthias Ringwald volatile uint32_t *p_MCFG;
140*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
141*1b2596b5SMatthias Ringwald uint32_t ul_dlt;
142*1b2596b5SMatthias Ringwald
143*1b2596b5SMatthias Ringwald ul_dlt = (uint32_t)&(p_matrix->MATRIX_MCFG1);
144*1b2596b5SMatthias Ringwald ul_dlt = ul_dlt - (uint32_t)&(p_matrix->MATRIX_MCFG0);
145*1b2596b5SMatthias Ringwald
146*1b2596b5SMatthias Ringwald p_MCFG = (volatile uint32_t *)((uint32_t)&(p_matrix->MATRIX_MCFG0) +
147*1b2596b5SMatthias Ringwald ul_id * ul_dlt);
148*1b2596b5SMatthias Ringwald
149*1b2596b5SMatthias Ringwald ul_reg = *p_MCFG & (~MATRIX_MCFG0_ULBT_Msk);
150*1b2596b5SMatthias Ringwald return (burst_type_t)ul_reg;
151*1b2596b5SMatthias Ringwald #else
152*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
153*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
154*1b2596b5SMatthias Ringwald
155*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_MCFG[ul_id] & (MATRIX_MCFG_ULBT_Msk);
156*1b2596b5SMatthias Ringwald return (burst_type_t)ul_reg;
157*1b2596b5SMatthias Ringwald #endif
158*1b2596b5SMatthias Ringwald }
159*1b2596b5SMatthias Ringwald
160*1b2596b5SMatthias Ringwald /**
161*1b2596b5SMatthias Ringwald * \brief Set slot cycle of the specified slave.
162*1b2596b5SMatthias Ringwald *
163*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
164*1b2596b5SMatthias Ringwald * \param ul_slot_cycle Number of slot cycle.
165*1b2596b5SMatthias Ringwald */
matrix_set_slave_slot_cycle(uint32_t ul_id,uint32_t ul_slot_cycle)166*1b2596b5SMatthias Ringwald void matrix_set_slave_slot_cycle(uint32_t ul_id, uint32_t ul_slot_cycle)
167*1b2596b5SMatthias Ringwald {
168*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
169*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
170*1b2596b5SMatthias Ringwald
171*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_SCFG[ul_id] & (~MATRIX_SCFG_SLOT_CYCLE_Msk);
172*1b2596b5SMatthias Ringwald p_matrix->MATRIX_SCFG[ul_id] = ul_reg | MATRIX_SCFG_SLOT_CYCLE(
173*1b2596b5SMatthias Ringwald ul_slot_cycle);
174*1b2596b5SMatthias Ringwald }
175*1b2596b5SMatthias Ringwald
176*1b2596b5SMatthias Ringwald /**
177*1b2596b5SMatthias Ringwald * \brief Get slot cycle of the specified slave.
178*1b2596b5SMatthias Ringwald *
179*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
180*1b2596b5SMatthias Ringwald *
181*1b2596b5SMatthias Ringwald * \return Number of slot cycle.
182*1b2596b5SMatthias Ringwald */
matrix_get_slave_slot_cycle(uint32_t ul_id)183*1b2596b5SMatthias Ringwald uint32_t matrix_get_slave_slot_cycle(uint32_t ul_id)
184*1b2596b5SMatthias Ringwald {
185*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
186*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
187*1b2596b5SMatthias Ringwald
188*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_SCFG[ul_id] & (MATRIX_SCFG_SLOT_CYCLE_Msk);
189*1b2596b5SMatthias Ringwald return (ul_reg >> MATRIX_SCFG_SLOT_CYCLE_Pos);
190*1b2596b5SMatthias Ringwald }
191*1b2596b5SMatthias Ringwald
192*1b2596b5SMatthias Ringwald /**
193*1b2596b5SMatthias Ringwald * \brief Set default master type of the specified slave.
194*1b2596b5SMatthias Ringwald *
195*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
196*1b2596b5SMatthias Ringwald * \param type Default master type.
197*1b2596b5SMatthias Ringwald */
matrix_set_slave_default_master_type(uint32_t ul_id,defaut_master_t type)198*1b2596b5SMatthias Ringwald void matrix_set_slave_default_master_type(uint32_t ul_id, defaut_master_t type)
199*1b2596b5SMatthias Ringwald {
200*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
201*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
202*1b2596b5SMatthias Ringwald
203*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_SCFG[ul_id] & (~MATRIX_SCFG_DEFMSTR_TYPE_Msk);
204*1b2596b5SMatthias Ringwald p_matrix->MATRIX_SCFG[ul_id] = ul_reg | (uint32_t)type;
205*1b2596b5SMatthias Ringwald }
206*1b2596b5SMatthias Ringwald
207*1b2596b5SMatthias Ringwald /**
208*1b2596b5SMatthias Ringwald * \brief Get default master type of the specified slave.
209*1b2596b5SMatthias Ringwald *
210*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
211*1b2596b5SMatthias Ringwald *
212*1b2596b5SMatthias Ringwald * \return Default master type.
213*1b2596b5SMatthias Ringwald */
matrix_get_slave_default_master_type(uint32_t ul_id)214*1b2596b5SMatthias Ringwald defaut_master_t matrix_get_slave_default_master_type(uint32_t ul_id)
215*1b2596b5SMatthias Ringwald {
216*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
217*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
218*1b2596b5SMatthias Ringwald
219*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_SCFG[ul_id] & (MATRIX_SCFG_DEFMSTR_TYPE_Msk);
220*1b2596b5SMatthias Ringwald return (defaut_master_t)ul_reg;
221*1b2596b5SMatthias Ringwald }
222*1b2596b5SMatthias Ringwald
223*1b2596b5SMatthias Ringwald /**
224*1b2596b5SMatthias Ringwald * \brief Set fixed default master of the specified slave.
225*1b2596b5SMatthias Ringwald *
226*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
227*1b2596b5SMatthias Ringwald * \param ul_fixed_id Fixed default master index.
228*1b2596b5SMatthias Ringwald */
matrix_set_slave_fixed_default_master(uint32_t ul_id,uint32_t ul_fixed_id)229*1b2596b5SMatthias Ringwald void matrix_set_slave_fixed_default_master(uint32_t ul_id, uint32_t ul_fixed_id)
230*1b2596b5SMatthias Ringwald {
231*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
232*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
233*1b2596b5SMatthias Ringwald
234*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_SCFG[ul_id] &
235*1b2596b5SMatthias Ringwald (~MATRIX_SCFG_FIXED_DEFMSTR_Msk);
236*1b2596b5SMatthias Ringwald p_matrix->MATRIX_SCFG[ul_id]
237*1b2596b5SMatthias Ringwald = ul_reg | MATRIX_SCFG_FIXED_DEFMSTR(ul_fixed_id);
238*1b2596b5SMatthias Ringwald }
239*1b2596b5SMatthias Ringwald
240*1b2596b5SMatthias Ringwald /**
241*1b2596b5SMatthias Ringwald * \brief Get fixed default master of the specified slave.
242*1b2596b5SMatthias Ringwald *
243*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
244*1b2596b5SMatthias Ringwald *
245*1b2596b5SMatthias Ringwald * \return Fixed default master index.
246*1b2596b5SMatthias Ringwald */
matrix_get_slave_fixed_default_master(uint32_t ul_id)247*1b2596b5SMatthias Ringwald uint32_t matrix_get_slave_fixed_default_master(uint32_t ul_id)
248*1b2596b5SMatthias Ringwald {
249*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
250*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
251*1b2596b5SMatthias Ringwald
252*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_SCFG[ul_id] & (MATRIX_SCFG_FIXED_DEFMSTR_Msk);
253*1b2596b5SMatthias Ringwald return (ul_reg >> MATRIX_SCFG_FIXED_DEFMSTR_Pos);
254*1b2596b5SMatthias Ringwald }
255*1b2596b5SMatthias Ringwald
256*1b2596b5SMatthias Ringwald #if !SAM4E && !SAM4C && !SAM4CP && !SAM4CM && \
257*1b2596b5SMatthias Ringwald !SAMV71 && !SAMV70 && !SAMS70 && !SAME70
258*1b2596b5SMatthias Ringwald /**
259*1b2596b5SMatthias Ringwald * \brief Set slave arbitration type of the specified slave.
260*1b2596b5SMatthias Ringwald *
261*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
262*1b2596b5SMatthias Ringwald * \param type Arbitration type.
263*1b2596b5SMatthias Ringwald */
matrix_set_slave_arbitration_type(uint32_t ul_id,arbitration_type_t type)264*1b2596b5SMatthias Ringwald void matrix_set_slave_arbitration_type(uint32_t ul_id, arbitration_type_t type)
265*1b2596b5SMatthias Ringwald {
266*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
267*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
268*1b2596b5SMatthias Ringwald
269*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_SCFG[ul_id] & (~MATRIX_SCFG_ARBT_Msk);
270*1b2596b5SMatthias Ringwald p_matrix->MATRIX_SCFG[ul_id] = ul_reg | (uint32_t)type;
271*1b2596b5SMatthias Ringwald }
272*1b2596b5SMatthias Ringwald
273*1b2596b5SMatthias Ringwald /**
274*1b2596b5SMatthias Ringwald * \brief Get slave arbitration type of the specified slave.
275*1b2596b5SMatthias Ringwald *
276*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
277*1b2596b5SMatthias Ringwald *
278*1b2596b5SMatthias Ringwald * \return Arbitration type.
279*1b2596b5SMatthias Ringwald */
matrix_get_slave_arbitration_type(uint32_t ul_id)280*1b2596b5SMatthias Ringwald arbitration_type_t matrix_get_slave_arbitration_type(uint32_t ul_id)
281*1b2596b5SMatthias Ringwald {
282*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
283*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
284*1b2596b5SMatthias Ringwald
285*1b2596b5SMatthias Ringwald ul_reg = p_matrix->MATRIX_SCFG[ul_id] & (MATRIX_SCFG_ARBT_Msk);
286*1b2596b5SMatthias Ringwald return (arbitration_type_t)ul_reg;
287*1b2596b5SMatthias Ringwald }
288*1b2596b5SMatthias Ringwald
289*1b2596b5SMatthias Ringwald #endif
290*1b2596b5SMatthias Ringwald
291*1b2596b5SMatthias Ringwald /**
292*1b2596b5SMatthias Ringwald * \brief Set priority for the specified slave access.
293*1b2596b5SMatthias Ringwald *
294*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
295*1b2596b5SMatthias Ringwald * \param ul_prio Bitmask OR of priorities of master x.
296*1b2596b5SMatthias Ringwald */
matrix_set_slave_priority(uint32_t ul_id,uint32_t ul_prio)297*1b2596b5SMatthias Ringwald void matrix_set_slave_priority(uint32_t ul_id, uint32_t ul_prio)
298*1b2596b5SMatthias Ringwald {
299*1b2596b5SMatthias Ringwald #if (SAMV71 || SAMV70|| SAME70)
300*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
301*1b2596b5SMatthias Ringwald p_matrix->MATRIX_PR[ul_id].MATRIX_PRAS = ul_prio;
302*1b2596b5SMatthias Ringwald #else
303*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
304*1b2596b5SMatthias Ringwald volatile uint32_t *p_PRAS;
305*1b2596b5SMatthias Ringwald uint32_t ul_dlt;
306*1b2596b5SMatthias Ringwald
307*1b2596b5SMatthias Ringwald ul_dlt = (uint32_t)&(p_matrix->MATRIX_PRAS1);
308*1b2596b5SMatthias Ringwald ul_dlt = ul_dlt - (uint32_t)&(p_matrix->MATRIX_PRAS0);
309*1b2596b5SMatthias Ringwald
310*1b2596b5SMatthias Ringwald p_PRAS = (volatile uint32_t *)((uint32_t)&(p_matrix->MATRIX_PRAS0) +
311*1b2596b5SMatthias Ringwald ul_id * ul_dlt);
312*1b2596b5SMatthias Ringwald
313*1b2596b5SMatthias Ringwald *p_PRAS = ul_prio;
314*1b2596b5SMatthias Ringwald #endif
315*1b2596b5SMatthias Ringwald }
316*1b2596b5SMatthias Ringwald
317*1b2596b5SMatthias Ringwald /**
318*1b2596b5SMatthias Ringwald * \brief Get priority for the specified slave access.
319*1b2596b5SMatthias Ringwald *
320*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
321*1b2596b5SMatthias Ringwald *
322*1b2596b5SMatthias Ringwald * \return Bitmask OR of priorities of master x.
323*1b2596b5SMatthias Ringwald */
matrix_get_slave_priority(uint32_t ul_id)324*1b2596b5SMatthias Ringwald uint32_t matrix_get_slave_priority(uint32_t ul_id)
325*1b2596b5SMatthias Ringwald {
326*1b2596b5SMatthias Ringwald #if (SAMV71 || SAMV70|| SAME70)
327*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
328*1b2596b5SMatthias Ringwald return p_matrix->MATRIX_PR[ul_id].MATRIX_PRAS;
329*1b2596b5SMatthias Ringwald #else
330*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
331*1b2596b5SMatthias Ringwald volatile uint32_t *p_PRAS;
332*1b2596b5SMatthias Ringwald uint32_t ul_dlt;
333*1b2596b5SMatthias Ringwald
334*1b2596b5SMatthias Ringwald ul_dlt = (uint32_t)&(p_matrix->MATRIX_PRAS1);
335*1b2596b5SMatthias Ringwald ul_dlt = ul_dlt - (uint32_t)&(p_matrix->MATRIX_PRAS0);
336*1b2596b5SMatthias Ringwald
337*1b2596b5SMatthias Ringwald p_PRAS = (volatile uint32_t *)((uint32_t)&(p_matrix->MATRIX_PRAS0) +
338*1b2596b5SMatthias Ringwald ul_id * ul_dlt);
339*1b2596b5SMatthias Ringwald
340*1b2596b5SMatthias Ringwald return (*p_PRAS);
341*1b2596b5SMatthias Ringwald #endif
342*1b2596b5SMatthias Ringwald }
343*1b2596b5SMatthias Ringwald
344*1b2596b5SMatthias Ringwald #if (SAMV71 || SAMV70|| SAME70 || SAMS70)
345*1b2596b5SMatthias Ringwald /**
346*1b2596b5SMatthias Ringwald * \brief Set priority for the specified slave access.
347*1b2596b5SMatthias Ringwald *
348*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
349*1b2596b5SMatthias Ringwald * \param ul_prio_b Bitmask OR of priorities of master x.
350*1b2596b5SMatthias Ringwald */
matrix_set_slave_priority_b(uint32_t ul_id,uint32_t ul_prio_b)351*1b2596b5SMatthias Ringwald void matrix_set_slave_priority_b(uint32_t ul_id, uint32_t ul_prio_b)
352*1b2596b5SMatthias Ringwald {
353*1b2596b5SMatthias Ringwald #if (SAMV71 || SAMV70|| SAME70)
354*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
355*1b2596b5SMatthias Ringwald p_matrix->MATRIX_PR[ul_id].MATRIX_PRBS = ul_prio_b;
356*1b2596b5SMatthias Ringwald #else
357*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
358*1b2596b5SMatthias Ringwald volatile uint32_t *p_PRAS;
359*1b2596b5SMatthias Ringwald uint32_t ul_dlt;
360*1b2596b5SMatthias Ringwald
361*1b2596b5SMatthias Ringwald ul_dlt = (uint32_t)&(p_matrix->MATRIX_PRBS1);
362*1b2596b5SMatthias Ringwald ul_dlt = ul_dlt - (uint32_t)&(p_matrix->MATRIX_PRBS0);
363*1b2596b5SMatthias Ringwald
364*1b2596b5SMatthias Ringwald p_PRAS = (volatile uint32_t *)((uint32_t)&(p_matrix->MATRIX_PRBS0) +
365*1b2596b5SMatthias Ringwald ul_id * ul_dlt);
366*1b2596b5SMatthias Ringwald
367*1b2596b5SMatthias Ringwald *p_PRAS = ul_prio;
368*1b2596b5SMatthias Ringwald #endif
369*1b2596b5SMatthias Ringwald }
370*1b2596b5SMatthias Ringwald
371*1b2596b5SMatthias Ringwald /**
372*1b2596b5SMatthias Ringwald * \brief Get priority for the specified slave access.
373*1b2596b5SMatthias Ringwald *
374*1b2596b5SMatthias Ringwald * \param ul_id Slave index.
375*1b2596b5SMatthias Ringwald *
376*1b2596b5SMatthias Ringwald * \return Bitmask OR of priorities of master x.
377*1b2596b5SMatthias Ringwald */
matrix_get_slave_priority_b(uint32_t ul_id)378*1b2596b5SMatthias Ringwald uint32_t matrix_get_slave_priority_b(uint32_t ul_id)
379*1b2596b5SMatthias Ringwald {
380*1b2596b5SMatthias Ringwald #if (SAMV71 || SAMV70|| SAME70)
381*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
382*1b2596b5SMatthias Ringwald return p_matrix->MATRIX_PR[ul_id].MATRIX_PRBS;
383*1b2596b5SMatthias Ringwald #else
384*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
385*1b2596b5SMatthias Ringwald volatile uint32_t *p_PRAS;
386*1b2596b5SMatthias Ringwald uint32_t ul_dlt;
387*1b2596b5SMatthias Ringwald
388*1b2596b5SMatthias Ringwald ul_dlt = (uint32_t)&(p_matrix->MATRIX_PRBS1);
389*1b2596b5SMatthias Ringwald ul_dlt = ul_dlt - (uint32_t)&(p_matrix->MATRIX_PRBS0);
390*1b2596b5SMatthias Ringwald
391*1b2596b5SMatthias Ringwald p_PRAS = (volatile uint32_t *)((uint32_t)&(p_matrix->MATRIX_PRBS0) +
392*1b2596b5SMatthias Ringwald ul_id * ul_dlt);
393*1b2596b5SMatthias Ringwald
394*1b2596b5SMatthias Ringwald return (*p_PRAS);
395*1b2596b5SMatthias Ringwald #endif
396*1b2596b5SMatthias Ringwald }
397*1b2596b5SMatthias Ringwald #endif
398*1b2596b5SMatthias Ringwald
399*1b2596b5SMatthias Ringwald #if (SAM3XA || SAM3U || SAM4E ||\
400*1b2596b5SMatthias Ringwald SAMV71 || SAMV70 || SAMS70 || SAME70)
401*1b2596b5SMatthias Ringwald /**
402*1b2596b5SMatthias Ringwald * \brief Set bus matrix master remap.
403*1b2596b5SMatthias Ringwald *
404*1b2596b5SMatthias Ringwald * \param ul_remap Bitmask OR of RCBx: 0 for disable, 1 for enable.
405*1b2596b5SMatthias Ringwald */
matrix_set_master_remap(uint32_t ul_remap)406*1b2596b5SMatthias Ringwald void matrix_set_master_remap(uint32_t ul_remap)
407*1b2596b5SMatthias Ringwald {
408*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
409*1b2596b5SMatthias Ringwald
410*1b2596b5SMatthias Ringwald p_matrix->MATRIX_MRCR = ul_remap;
411*1b2596b5SMatthias Ringwald }
412*1b2596b5SMatthias Ringwald
413*1b2596b5SMatthias Ringwald /**
414*1b2596b5SMatthias Ringwald * \brief Get bus matrix master remap.
415*1b2596b5SMatthias Ringwald *
416*1b2596b5SMatthias Ringwald * \return Bitmask OR of RCBx: 0 for disable, 1 for enable.
417*1b2596b5SMatthias Ringwald */
matrix_get_master_remap(void)418*1b2596b5SMatthias Ringwald uint32_t matrix_get_master_remap(void)
419*1b2596b5SMatthias Ringwald {
420*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
421*1b2596b5SMatthias Ringwald
422*1b2596b5SMatthias Ringwald return (p_matrix->MATRIX_MRCR);
423*1b2596b5SMatthias Ringwald }
424*1b2596b5SMatthias Ringwald
425*1b2596b5SMatthias Ringwald #endif
426*1b2596b5SMatthias Ringwald
427*1b2596b5SMatthias Ringwald #if (SAM3S || SAM3XA || SAM3N || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM || \
428*1b2596b5SMatthias Ringwald SAMV71 || SAMV70 || SAMS70 || SAME70)
429*1b2596b5SMatthias Ringwald /**
430*1b2596b5SMatthias Ringwald * \brief Set system IO.
431*1b2596b5SMatthias Ringwald *
432*1b2596b5SMatthias Ringwald * \param ul_io Bitmask OR of SYSIOx.
433*1b2596b5SMatthias Ringwald */
matrix_set_system_io(uint32_t ul_io)434*1b2596b5SMatthias Ringwald void matrix_set_system_io(uint32_t ul_io)
435*1b2596b5SMatthias Ringwald {
436*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
437*1b2596b5SMatthias Ringwald
438*1b2596b5SMatthias Ringwald #if (SAM4C || SAM4CP || SAM4CM)
439*1b2596b5SMatthias Ringwald
440*1b2596b5SMatthias Ringwald p_matrix->MATRIX_SYSIO = ul_io;
441*1b2596b5SMatthias Ringwald
442*1b2596b5SMatthias Ringwald #elif (SAMV71 || SAMV70 || SAMS70 || SAME70)
443*1b2596b5SMatthias Ringwald
444*1b2596b5SMatthias Ringwald p_matrix->CCFG_SYSIO &= 0xFFFF0000;
445*1b2596b5SMatthias Ringwald p_matrix->CCFG_SYSIO |= (ul_io & 0xFFFF);
446*1b2596b5SMatthias Ringwald
447*1b2596b5SMatthias Ringwald #else
448*1b2596b5SMatthias Ringwald
449*1b2596b5SMatthias Ringwald p_matrix->CCFG_SYSIO = ul_io;
450*1b2596b5SMatthias Ringwald
451*1b2596b5SMatthias Ringwald #endif
452*1b2596b5SMatthias Ringwald
453*1b2596b5SMatthias Ringwald }
454*1b2596b5SMatthias Ringwald
455*1b2596b5SMatthias Ringwald /**
456*1b2596b5SMatthias Ringwald * \brief Get system IO.
457*1b2596b5SMatthias Ringwald *
458*1b2596b5SMatthias Ringwald * \return Bitmask OR of SYSIOx.
459*1b2596b5SMatthias Ringwald */
matrix_get_system_io(void)460*1b2596b5SMatthias Ringwald uint32_t matrix_get_system_io(void)
461*1b2596b5SMatthias Ringwald {
462*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
463*1b2596b5SMatthias Ringwald
464*1b2596b5SMatthias Ringwald #if (SAM4C || SAM4CP || SAM4CM)
465*1b2596b5SMatthias Ringwald
466*1b2596b5SMatthias Ringwald return (p_matrix->MATRIX_SYSIO);
467*1b2596b5SMatthias Ringwald
468*1b2596b5SMatthias Ringwald #elif (SAMV71 || SAMV70 || SAMS70 || SAME70)
469*1b2596b5SMatthias Ringwald
470*1b2596b5SMatthias Ringwald return (p_matrix->CCFG_SYSIO & 0xFFFF);
471*1b2596b5SMatthias Ringwald
472*1b2596b5SMatthias Ringwald #else
473*1b2596b5SMatthias Ringwald
474*1b2596b5SMatthias Ringwald return (p_matrix->CCFG_SYSIO);
475*1b2596b5SMatthias Ringwald
476*1b2596b5SMatthias Ringwald #endif
477*1b2596b5SMatthias Ringwald }
478*1b2596b5SMatthias Ringwald
479*1b2596b5SMatthias Ringwald #endif
480*1b2596b5SMatthias Ringwald
481*1b2596b5SMatthias Ringwald #if (SAM3S || SAM4S || SAM4E || SAM4C || SAM4CP || SAM4CM || \
482*1b2596b5SMatthias Ringwald SAMV71 || SAMV70 || SAMS70 || SAME70)
483*1b2596b5SMatthias Ringwald /**
484*1b2596b5SMatthias Ringwald * \brief Set NAND Flash Chip Select configuration register.
485*1b2596b5SMatthias Ringwald *
486*1b2596b5SMatthias Ringwald * \param ul_cs Bitmask OR of SMC_NFCSx: 0 if NCSx is not assigned,
487*1b2596b5SMatthias Ringwald * 1 if NCSx is assigned.
488*1b2596b5SMatthias Ringwald */
matrix_set_nandflash_cs(uint32_t ul_cs)489*1b2596b5SMatthias Ringwald void matrix_set_nandflash_cs(uint32_t ul_cs)
490*1b2596b5SMatthias Ringwald {
491*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
492*1b2596b5SMatthias Ringwald
493*1b2596b5SMatthias Ringwald
494*1b2596b5SMatthias Ringwald #if (SAM4C || SAM4CP || SAM4CM)
495*1b2596b5SMatthias Ringwald
496*1b2596b5SMatthias Ringwald p_matrix->MATRIX_SMCNFCS = ul_cs;
497*1b2596b5SMatthias Ringwald
498*1b2596b5SMatthias Ringwald #else
499*1b2596b5SMatthias Ringwald
500*1b2596b5SMatthias Ringwald p_matrix->CCFG_SMCNFCS = ul_cs;
501*1b2596b5SMatthias Ringwald
502*1b2596b5SMatthias Ringwald #endif
503*1b2596b5SMatthias Ringwald }
504*1b2596b5SMatthias Ringwald
505*1b2596b5SMatthias Ringwald /**
506*1b2596b5SMatthias Ringwald * \brief Get NAND Flash Chip Select configuration register.
507*1b2596b5SMatthias Ringwald *
508*1b2596b5SMatthias Ringwald * \return Bitmask OR of SMC_NFCSx.
509*1b2596b5SMatthias Ringwald */
matrix_get_nandflash_cs(void)510*1b2596b5SMatthias Ringwald uint32_t matrix_get_nandflash_cs(void)
511*1b2596b5SMatthias Ringwald {
512*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
513*1b2596b5SMatthias Ringwald
514*1b2596b5SMatthias Ringwald #if (SAM4C || SAM4CP || SAM4CM)
515*1b2596b5SMatthias Ringwald
516*1b2596b5SMatthias Ringwald return (p_matrix->MATRIX_SMCNFCS);
517*1b2596b5SMatthias Ringwald
518*1b2596b5SMatthias Ringwald #else
519*1b2596b5SMatthias Ringwald
520*1b2596b5SMatthias Ringwald return (p_matrix->CCFG_SMCNFCS);
521*1b2596b5SMatthias Ringwald
522*1b2596b5SMatthias Ringwald #endif
523*1b2596b5SMatthias Ringwald }
524*1b2596b5SMatthias Ringwald
525*1b2596b5SMatthias Ringwald #endif
526*1b2596b5SMatthias Ringwald
527*1b2596b5SMatthias Ringwald #if (!SAMG)
528*1b2596b5SMatthias Ringwald /**
529*1b2596b5SMatthias Ringwald * \brief Enable or disable write protect of MATRIX registers.
530*1b2596b5SMatthias Ringwald *
531*1b2596b5SMatthias Ringwald * \param ul_enable 1 to enable, 0 to disable.
532*1b2596b5SMatthias Ringwald */
matrix_set_writeprotect(uint32_t ul_enable)533*1b2596b5SMatthias Ringwald void matrix_set_writeprotect(uint32_t ul_enable)
534*1b2596b5SMatthias Ringwald {
535*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
536*1b2596b5SMatthias Ringwald
537*1b2596b5SMatthias Ringwald if (ul_enable) {
538*1b2596b5SMatthias Ringwald p_matrix->MATRIX_WPMR = MATRIX_WPMR_WPKEY_PASSWD | MATRIX_WPMR_WPEN;
539*1b2596b5SMatthias Ringwald } else {
540*1b2596b5SMatthias Ringwald p_matrix->MATRIX_WPMR = MATRIX_WPMR_WPKEY_PASSWD;
541*1b2596b5SMatthias Ringwald }
542*1b2596b5SMatthias Ringwald }
543*1b2596b5SMatthias Ringwald
544*1b2596b5SMatthias Ringwald /**
545*1b2596b5SMatthias Ringwald * \brief Get write protect status.
546*1b2596b5SMatthias Ringwald *
547*1b2596b5SMatthias Ringwald * \return Write protect status.
548*1b2596b5SMatthias Ringwald */
matrix_get_writeprotect_status(void)549*1b2596b5SMatthias Ringwald uint32_t matrix_get_writeprotect_status(void)
550*1b2596b5SMatthias Ringwald {
551*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
552*1b2596b5SMatthias Ringwald
553*1b2596b5SMatthias Ringwald return (p_matrix->MATRIX_WPSR);
554*1b2596b5SMatthias Ringwald }
555*1b2596b5SMatthias Ringwald #endif
556*1b2596b5SMatthias Ringwald
557*1b2596b5SMatthias Ringwald #if SAMG55
558*1b2596b5SMatthias Ringwald /**
559*1b2596b5SMatthias Ringwald * \brief Set USB device mode.
560*1b2596b5SMatthias Ringwald *
561*1b2596b5SMatthias Ringwald */
matrix_set_usb_device(void)562*1b2596b5SMatthias Ringwald void matrix_set_usb_device(void)
563*1b2596b5SMatthias Ringwald {
564*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
565*1b2596b5SMatthias Ringwald
566*1b2596b5SMatthias Ringwald p_matrix->CCFG_SYSIO &= ~(CCFG_SYSIO_SYSIO10 | CCFG_SYSIO_SYSIO11);
567*1b2596b5SMatthias Ringwald
568*1b2596b5SMatthias Ringwald p_matrix->CCFG_USBMR |= CCFG_USBMR_DEVICE;
569*1b2596b5SMatthias Ringwald }
570*1b2596b5SMatthias Ringwald
571*1b2596b5SMatthias Ringwald /**
572*1b2596b5SMatthias Ringwald * \brief Set USB device mode.
573*1b2596b5SMatthias Ringwald *
574*1b2596b5SMatthias Ringwald */
matrix_set_usb_host(void)575*1b2596b5SMatthias Ringwald void matrix_set_usb_host(void)
576*1b2596b5SMatthias Ringwald {
577*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
578*1b2596b5SMatthias Ringwald
579*1b2596b5SMatthias Ringwald p_matrix->CCFG_SYSIO &= ~(CCFG_SYSIO_SYSIO10 | CCFG_SYSIO_SYSIO11);
580*1b2596b5SMatthias Ringwald
581*1b2596b5SMatthias Ringwald p_matrix->CCFG_USBMR &= ~CCFG_USBMR_DEVICE;
582*1b2596b5SMatthias Ringwald }
583*1b2596b5SMatthias Ringwald #endif
584*1b2596b5SMatthias Ringwald
585*1b2596b5SMatthias Ringwald #if (SAMV71 || SAMV70|| SAME70)
586*1b2596b5SMatthias Ringwald /**
587*1b2596b5SMatthias Ringwald * \brief Set CAN0 DMA base address.
588*1b2596b5SMatthias Ringwald *
589*1b2596b5SMatthias Ringwald * \param base_addr the 16-bit MSB of the CAN0 DMA base address.
590*1b2596b5SMatthias Ringwald */
matrix_set_can0_addr(uint32_t base_addr)591*1b2596b5SMatthias Ringwald void matrix_set_can0_addr(uint32_t base_addr)
592*1b2596b5SMatthias Ringwald {
593*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
594*1b2596b5SMatthias Ringwald p_matrix->CCFG_CAN0 = CCFG_CAN0_CAN0DMABA(base_addr);
595*1b2596b5SMatthias Ringwald }
596*1b2596b5SMatthias Ringwald
597*1b2596b5SMatthias Ringwald /**
598*1b2596b5SMatthias Ringwald * \brief Set CAN1 DMA base address.
599*1b2596b5SMatthias Ringwald *
600*1b2596b5SMatthias Ringwald * \param base_addr the 16-bit MSB of the CAN1 DMA base address.
601*1b2596b5SMatthias Ringwald */
matrix_set_can1_addr(uint32_t base_addr)602*1b2596b5SMatthias Ringwald void matrix_set_can1_addr(uint32_t base_addr)
603*1b2596b5SMatthias Ringwald {
604*1b2596b5SMatthias Ringwald Matrix *p_matrix = MATRIX;
605*1b2596b5SMatthias Ringwald volatile uint32_t ul_reg;
606*1b2596b5SMatthias Ringwald
607*1b2596b5SMatthias Ringwald ul_reg = p_matrix->CCFG_SYSIO & (~CCFG_SYSIO_CAN1DMABA_Msk);
608*1b2596b5SMatthias Ringwald p_matrix->CCFG_SYSIO = ul_reg | CCFG_SYSIO_CAN1DMABA(base_addr);
609*1b2596b5SMatthias Ringwald }
610*1b2596b5SMatthias Ringwald #endif
611*1b2596b5SMatthias Ringwald
612*1b2596b5SMatthias Ringwald /* @} */
613*1b2596b5SMatthias Ringwald
614*1b2596b5SMatthias Ringwald /* / @cond 0 */
615*1b2596b5SMatthias Ringwald /**INDENT-OFF**/
616*1b2596b5SMatthias Ringwald #ifdef __cplusplus
617*1b2596b5SMatthias Ringwald }
618*1b2596b5SMatthias Ringwald #endif
619*1b2596b5SMatthias Ringwald /**INDENT-ON**/
620*1b2596b5SMatthias Ringwald /* / @endcond */
621