xref: /btstack/port/samv71-xplained-atwilc3000/ASF/sam/drivers/mpu/mpu.h (revision 1b2596b5303dd8caeea8565532c93cca8dab8cc4)
1*1b2596b5SMatthias Ringwald /**
2*1b2596b5SMatthias Ringwald  * \file
3*1b2596b5SMatthias Ringwald  *
4*1b2596b5SMatthias Ringwald  * \brief SAMV70/SAMV71/SAME70/SAMS70-XULTRA board mpu config.
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 
48*1b2596b5SMatthias Ringwald #ifndef _MPU_H_
49*1b2596b5SMatthias Ringwald #define _MPU_H_
50*1b2596b5SMatthias Ringwald 
51*1b2596b5SMatthias Ringwald #include "compiler.h"
52*1b2596b5SMatthias Ringwald 
53*1b2596b5SMatthias Ringwald /*----------------------------------------------------------------------------
54*1b2596b5SMatthias Ringwald  *        Definitions
55*1b2596b5SMatthias Ringwald  *----------------------------------------------------------------------------*/
56*1b2596b5SMatthias Ringwald #define ARM_MODE_USR            0x10
57*1b2596b5SMatthias Ringwald 
58*1b2596b5SMatthias Ringwald #define PRIVILEGE_MODE 0
59*1b2596b5SMatthias Ringwald #define USER_MODE      1
60*1b2596b5SMatthias Ringwald 
61*1b2596b5SMatthias Ringwald #define MPU_DEFAULT_ITCM_REGION                 ( 1 )
62*1b2596b5SMatthias Ringwald #define MPU_DEFAULT_IFLASH_REGION               ( 2 )
63*1b2596b5SMatthias Ringwald #define MPU_DEFAULT_DTCM_REGION                 ( 3 )
64*1b2596b5SMatthias Ringwald #define MPU_DEFAULT_SRAM_REGION_1               ( 4 )
65*1b2596b5SMatthias Ringwald #define MPU_DEFAULT_SRAM_REGION_2               ( 5 )
66*1b2596b5SMatthias Ringwald #define MPU_PERIPHERALS_REGION                  ( 6 )
67*1b2596b5SMatthias Ringwald #define MPU_EXT_EBI_REGION                      ( 7 )
68*1b2596b5SMatthias Ringwald #define MPU_DEFAULT_SDRAM_REGION                ( 8 )
69*1b2596b5SMatthias Ringwald #define MPU_QSPIMEM_REGION                      ( 9 )
70*1b2596b5SMatthias Ringwald #define MPU_USBHSRAM_REGION                     ( 10 )
71*1b2596b5SMatthias Ringwald #if defined MPU_HAS_NOCACHE_REGION
72*1b2596b5SMatthias Ringwald #define MPU_NOCACHE_SRAM_REGION                 ( 11 )
73*1b2596b5SMatthias Ringwald #endif
74*1b2596b5SMatthias Ringwald 
75*1b2596b5SMatthias Ringwald #define MPU_REGION_VALID                        ( 0x10 )
76*1b2596b5SMatthias Ringwald #define MPU_REGION_ENABLE                       ( 0x01 )
77*1b2596b5SMatthias Ringwald #define MPU_REGION_DISABLE                      ( 0x0 )
78*1b2596b5SMatthias Ringwald 
79*1b2596b5SMatthias Ringwald #define MPU_ENABLE                              ( 0x1 << MPU_CTRL_ENABLE_Pos)
80*1b2596b5SMatthias Ringwald #define MPU_HFNMIENA                            ( 0x1 << MPU_CTRL_HFNMIENA_Pos )
81*1b2596b5SMatthias Ringwald #define MPU_PRIVDEFENA                          ( 0x1 << MPU_CTRL_PRIVDEFENA_Pos )
82*1b2596b5SMatthias Ringwald 
83*1b2596b5SMatthias Ringwald 
84*1b2596b5SMatthias Ringwald #define MPU_REGION_BUFFERABLE                   ( 0x01 << MPU_RASR_B_Pos )
85*1b2596b5SMatthias Ringwald #define MPU_REGION_CACHEABLE                    ( 0x01 << MPU_RASR_C_Pos )
86*1b2596b5SMatthias Ringwald #define MPU_REGION_SHAREABLE                    ( 0x01 << MPU_RASR_S_Pos )
87*1b2596b5SMatthias Ringwald 
88*1b2596b5SMatthias Ringwald #define MPU_REGION_EXECUTE_NEVER                ( 0x01 << MPU_RASR_XN_Pos )
89*1b2596b5SMatthias Ringwald 
90*1b2596b5SMatthias Ringwald #define MPU_AP_NO_ACCESS                        ( 0x00 << MPU_RASR_AP_Pos )
91*1b2596b5SMatthias Ringwald #define MPU_AP_PRIVILEGED_READ_WRITE            ( 0x01 << MPU_RASR_AP_Pos )
92*1b2596b5SMatthias Ringwald #define MPU_AP_UNPRIVILEGED_READONLY            ( 0x02 << MPU_RASR_AP_Pos )
93*1b2596b5SMatthias Ringwald #define MPU_AP_FULL_ACCESS                      ( 0x03 << MPU_RASR_AP_Pos )
94*1b2596b5SMatthias Ringwald #define MPU_AP_RES                              ( 0x04 << MPU_RASR_AP_Pos )
95*1b2596b5SMatthias Ringwald #define MPU_AP_PRIVILEGED_READONLY              ( 0x05 << MPU_RASR_AP_Pos )
96*1b2596b5SMatthias Ringwald #define MPU_AP_READONLY                         ( 0x06 << MPU_RASR_AP_Pos )
97*1b2596b5SMatthias Ringwald #define MPU_AP_READONLY2                        ( 0x07 << MPU_RASR_AP_Pos )
98*1b2596b5SMatthias Ringwald 
99*1b2596b5SMatthias Ringwald #define MPU_TEX_B000                            ( 0x01 << MPU_RASR_TEX_Pos )
100*1b2596b5SMatthias Ringwald #define MPU_TEX_B001                            ( 0x01 << MPU_RASR_TEX_Pos )
101*1b2596b5SMatthias Ringwald #define MPU_TEX_B010                            ( 0x01 << MPU_RASR_TEX_Pos )
102*1b2596b5SMatthias Ringwald #define MPU_TEX_B011                            ( 0x01 << MPU_RASR_TEX_Pos )
103*1b2596b5SMatthias Ringwald #define MPU_TEX_B100                            ( 0x01 << MPU_RASR_TEX_Pos )
104*1b2596b5SMatthias Ringwald #define MPU_TEX_B101                            ( 0x01 << MPU_RASR_TEX_Pos )
105*1b2596b5SMatthias Ringwald #define MPU_TEX_B110                            ( 0x01 << MPU_RASR_TEX_Pos )
106*1b2596b5SMatthias Ringwald #define MPU_TEX_B111                            ( 0x01 << MPU_RASR_TEX_Pos )
107*1b2596b5SMatthias Ringwald 
108*1b2596b5SMatthias Ringwald #define SHAREABLE       1
109*1b2596b5SMatthias Ringwald #define NON_SHAREABLE   0
110*1b2596b5SMatthias Ringwald 
111*1b2596b5SMatthias Ringwald #define INNER_NORMAL_WB_RWA_TYPE(x)   (( 0x04 << MPU_RASR_TEX_Pos ) | ( DISABLE  << MPU_RASR_C_Pos ) | ( ENABLE  << MPU_RASR_B_Pos )  | ( x << MPU_RASR_S_Pos ))
112*1b2596b5SMatthias Ringwald #define INNER_NORMAL_WB_NWA_TYPE(x)   (( 0x04 << MPU_RASR_TEX_Pos ) | ( ENABLE  << MPU_RASR_C_Pos )  | ( ENABLE  << MPU_RASR_B_Pos )  | ( x << MPU_RASR_S_Pos ))
113*1b2596b5SMatthias Ringwald #define STRONGLY_ORDERED_SHAREABLE_TYPE      (( 0x00 << MPU_RASR_TEX_Pos ) | ( DISABLE << MPU_RASR_C_Pos ) | ( DISABLE << MPU_RASR_B_Pos ))     // DO not care //
114*1b2596b5SMatthias Ringwald #define SHAREABLE_DEVICE_TYPE                (( 0x00 << MPU_RASR_TEX_Pos ) | ( DISABLE << MPU_RASR_C_Pos ) | ( ENABLE  << MPU_RASR_B_Pos ))     // DO not care //
115*1b2596b5SMatthias Ringwald 
116*1b2596b5SMatthias Ringwald 
117*1b2596b5SMatthias Ringwald /* Default memory map
118*1b2596b5SMatthias Ringwald    Address range          Memory region          Memory type      Shareability   Cache policy
119*1b2596b5SMatthias Ringwald    0x00000000- 0x1FFFFFFF Code                   Normal           Non-shareable  WT
120*1b2596b5SMatthias Ringwald    0x20000000- 0x3FFFFFFF SRAM                   Normal           Non-shareable  WBWA
121*1b2596b5SMatthias Ringwald    0x40000000- 0x5FFFFFFF Peripheral             Device           Non-shareable  -
122*1b2596b5SMatthias Ringwald    0x60000000- 0x7FFFFFFF RAM                    Normal           Non-shareable  WBWA
123*1b2596b5SMatthias Ringwald    0x80000000- 0x9FFFFFFF RAM                    Normal           Non-shareable  WT
124*1b2596b5SMatthias Ringwald    0xA0000000- 0xBFFFFFFF Device                 Device           Shareable
125*1b2596b5SMatthias Ringwald    0xC0000000- 0xDFFFFFFF Device                 Device           Non Shareable
126*1b2596b5SMatthias Ringwald    0xE0000000- 0xFFFFFFFF System                  -                     -
127*1b2596b5SMatthias Ringwald    */
128*1b2596b5SMatthias Ringwald 
129*1b2596b5SMatthias Ringwald /********* IFLASH memory macros *********************/
130*1b2596b5SMatthias Ringwald #define ITCM_START_ADDRESS                  0x00000000UL
131*1b2596b5SMatthias Ringwald #define ITCM_END_ADDRESS                    0x003FFFFFUL
132*1b2596b5SMatthias Ringwald #define IFLASH_START_ADDRESS                0x00400000UL
133*1b2596b5SMatthias Ringwald #define IFLASH_END_ADDRESS                  0x005FFFFFUL
134*1b2596b5SMatthias Ringwald 
135*1b2596b5SMatthias Ringwald 
136*1b2596b5SMatthias Ringwald #define IFLASH_PRIVILEGE_START_ADDRESS      (IFLASH_START_ADDRESS)
137*1b2596b5SMatthias Ringwald #define IFLASH_PRIVILEGE_END_ADDRESS        (IFLASH_START_ADDRESS + 0xFFF)
138*1b2596b5SMatthias Ringwald 
139*1b2596b5SMatthias Ringwald #define IFLASH_UNPRIVILEGE_START_ADDRESS    (IFLASH_PRIVILEGE_END_ADDRESS + 1)
140*1b2596b5SMatthias Ringwald #define IFLASH_UNPRIVILEGE_END_ADDRESS      (IFLASH_END_ADDRESS)
141*1b2596b5SMatthias Ringwald 
142*1b2596b5SMatthias Ringwald /**************** DTCM  *******************************/
143*1b2596b5SMatthias Ringwald #define DTCM_START_ADDRESS                  0x20000000UL
144*1b2596b5SMatthias Ringwald #define DTCM_END_ADDRESS                    0x203FFFFFUL
145*1b2596b5SMatthias Ringwald 
146*1b2596b5SMatthias Ringwald 
147*1b2596b5SMatthias Ringwald /******* SRAM memory macros ***************************/
148*1b2596b5SMatthias Ringwald 
149*1b2596b5SMatthias Ringwald #define SRAM_START_ADDRESS                  0x20400000UL
150*1b2596b5SMatthias Ringwald #define SRAM_END_ADDRESS                    0x2045FFFFUL
151*1b2596b5SMatthias Ringwald 
152*1b2596b5SMatthias Ringwald #if defined MPU_HAS_NOCACHE_REGION
153*1b2596b5SMatthias Ringwald #define NOCACHE_SRAM_REGION_SIZE            0x1000
154*1b2596b5SMatthias Ringwald #endif
155*1b2596b5SMatthias Ringwald 
156*1b2596b5SMatthias Ringwald /* Regions should be a 2^(N+1)  where 4 < N < 31 */
157*1b2596b5SMatthias Ringwald #define SRAM_FIRST_START_ADDRESS            (SRAM_START_ADDRESS)
158*1b2596b5SMatthias Ringwald #define SRAM_FIRST_END_ADDRESS              (SRAM_FIRST_START_ADDRESS + 0x3FFFF)        // (2^18) 256 KB
159*1b2596b5SMatthias Ringwald 
160*1b2596b5SMatthias Ringwald #if defined MPU_HAS_NOCACHE_REGION
161*1b2596b5SMatthias Ringwald #define SRAM_SECOND_START_ADDRESS           (SRAM_FIRST_END_ADDRESS+1)
162*1b2596b5SMatthias Ringwald #define SRAM_SECOND_END_ADDRESS             (SRAM_END_ADDRESS - NOCACHE_SRAM_REGION_SIZE )              // (2^17) 128 - 0x1000 KB
163*1b2596b5SMatthias Ringwald #define SRAM_NOCACHE_START_ADDRESS          (SRAM_SECOND_END_ADDRESS + 1)
164*1b2596b5SMatthias Ringwald #define SRAM_NOCACHE_END_ADDRESS            (SRAM_END_ADDRESS )
165*1b2596b5SMatthias Ringwald #else
166*1b2596b5SMatthias Ringwald #define SRAM_SECOND_START_ADDRESS           (SRAM_FIRST_END_ADDRESS + 1)
167*1b2596b5SMatthias Ringwald #define SRAM_SECOND_END_ADDRESS             (SRAM_END_ADDRESS)                          // (2^17) 128 KB
168*1b2596b5SMatthias Ringwald #endif
169*1b2596b5SMatthias Ringwald /************** Peripherals memory region macros ********/
170*1b2596b5SMatthias Ringwald #define PERIPHERALS_START_ADDRESS            0x40000000UL
171*1b2596b5SMatthias Ringwald #define PERIPHERALS_END_ADDRESS              0x5FFFFFFFUL
172*1b2596b5SMatthias Ringwald 
173*1b2596b5SMatthias Ringwald /******* Ext EBI memory macros ***************************/
174*1b2596b5SMatthias Ringwald #define EXT_EBI_START_ADDRESS                0x60000000UL
175*1b2596b5SMatthias Ringwald #define EXT_EBI_END_ADDRESS                  0x6FFFFFFFUL
176*1b2596b5SMatthias Ringwald 
177*1b2596b5SMatthias Ringwald /******* Ext-SRAM memory macros ***************************/
178*1b2596b5SMatthias Ringwald #define SDRAM_START_ADDRESS                  0x70000000UL
179*1b2596b5SMatthias Ringwald #define SDRAM_END_ADDRESS                    0x7FFFFFFFUL
180*1b2596b5SMatthias Ringwald 
181*1b2596b5SMatthias Ringwald /******* QSPI macros ***************************/
182*1b2596b5SMatthias Ringwald #define QSPI_START_ADDRESS                   0x80000000UL
183*1b2596b5SMatthias Ringwald #define QSPI_END_ADDRESS                     0x9FFFFFFFUL
184*1b2596b5SMatthias Ringwald 
185*1b2596b5SMatthias Ringwald /************** USBHS_RAM region macros ******************/
186*1b2596b5SMatthias Ringwald #define USBHSRAM_START_ADDRESS               0xA0100000UL
187*1b2596b5SMatthias Ringwald #define USBHSRAM_END_ADDRESS                 0xA01FFFFFUL
188*1b2596b5SMatthias Ringwald 
189*1b2596b5SMatthias Ringwald /*----------------------------------------------------------------------------
190*1b2596b5SMatthias Ringwald  *        Export functions
191*1b2596b5SMatthias Ringwald  *----------------------------------------------------------------------------*/
192*1b2596b5SMatthias Ringwald void mpu_enable(uint32_t dw_mpu_enable);
193*1b2596b5SMatthias Ringwald void mpu_set_region(uint32_t dw_region_base_addr, uint32_t dw_region_attr);
194*1b2596b5SMatthias Ringwald void mpu_set_region_num(uint32_t dw_region_num);
195*1b2596b5SMatthias Ringwald void mpu_disable_region(void);
196*1b2596b5SMatthias Ringwald uint32_t mpu_cal_mpu_region_size(uint32_t dw_actual_size_in_bytes);
197*1b2596b5SMatthias Ringwald void mpu_update_regions(uint32_t dw_region_num, uint32_t dw_region_base_addr, uint32_t dw_region_attr);
198*1b2596b5SMatthias Ringwald 
199*1b2596b5SMatthias Ringwald #endif /* #ifndef _MPU_H_ */