]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil/libboard_samv7-ek/source/board_lowlevel.c
Final V8.2.1 release ready for tagging:
[freertos] / FreeRTOS / Demo / CORTEX_M7_SAMV71_Xplained_IAR_Keil / libboard_samv7-ek / source / board_lowlevel.c
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2012, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 /**\r
31  * \file\r
32  *\r
33  * Provides the low-level initialization function that called on chip startup.\r
34  */\r
35 \r
36 /*----------------------------------------------------------------------------\r
37  *        Headers\r
38  *----------------------------------------------------------------------------*/\r
39 \r
40 #include "board.h"\r
41 \r
42 \r
43 /*----------------------------------------------------------------------------\r
44  *        Exported functions\r
45  *----------------------------------------------------------------------------*/\r
46 /* Default memory map\r
47    Address range          Memory region          Memory type      Shareability   Cache policy\r
48    0x00000000- 0x1FFFFFFF Code                   Normal           Non-shareable  WT\r
49    0x20000000- 0x3FFFFFFF SRAM                   Normal           Non-shareable  WBWA\r
50    0x40000000- 0x5FFFFFFF Peripheral             Device           Non-shareable  -\r
51    0x60000000- 0x7FFFFFFF External RAM           Normal           Non-shareable  WBWA\r
52    0x80000000- 0x9FFFFFFF WTb\r
53    0xA0000000- 0xBFFFFFFF External device Devicea Shareable\r
54    0xC0000000- 0xDFFFFFFF Non-shareablea\r
55    0xE0000000- 0xE00FFFFF Private Peripheral Bus Strongly ordered Shareablea -\r
56    0xE0100000- 0xFFFFFFFF Vendor-specific device Device           Non-shareablea -\r
57    */\r
58 \r
59 /**\r
60  * \brief Setup a memory region.\r
61  */\r
62 void _SetupMemoryRegion( void )\r
63 {\r
64 \r
65         return;\r
66 \r
67 #ifdef BELOW_CODE_REMOVED_FOR_REASON_STATED_IN_WARNING_MESSAGE_ABOVE\r
68     uint32_t dwRegionBaseAddr;\r
69     uint32_t dwRegionAttr;\r
70 \r
71 \r
72 /* ITCM memory region --- Normal */\r
73 /* #define ITCM_START_ADDRESS                  0x00000000UL\r
74    #define ITCM_END_ADDRESS                    0x00400000UL\r
75 */\r
76     dwRegionBaseAddr =\r
77         ITCM_START_ADDRESS |\r
78         MPU_REGION_VALID |\r
79         MPU_DEFAULT_ITCM_REGION;\r
80 \r
81     dwRegionAttr =\r
82         MPU_AP_PRIVILEGED_READ_WRITE |\r
83         MPU_TEX_WRITE_THROUGH |\r
84         MPU_REGION_CACHEABLE |\r
85         MPU_RASR_SRD_Msk |\r
86         MPU_CalMPURegionSize(ITCM_END_ADDRESS - ITCM_START_ADDRESS) |\r
87         MPU_REGION_ENABLE;\r
88 \r
89     MPU_SetRegion( dwRegionBaseAddr, dwRegionAttr);\r
90 \r
91 /* Internal flash privilege memory region --- Normal */\r
92 /* #define IFLASH_START_ADDRESS                0x00400000UL\r
93    #define IFLASH_END_ADDRESS                  0x00600000UL\r
94 */\r
95     dwRegionBaseAddr =\r
96         IFLASH_START_ADDRESS |\r
97         MPU_REGION_VALID |\r
98         MPU_DEFAULT_IFLASH_REGION;  //2\r
99 \r
100     dwRegionAttr =\r
101         MPU_AP_FULL_ACCESS |\r
102         MPU_REGION_CACHEABLE |\r
103         MPU_TEX_WRITE_THROUGH |\r
104         MPU_RASR_SRD_Msk |\r
105         MPU_CalMPURegionSize(IFLASH_END_ADDRESS - IFLASH_START_ADDRESS) |\r
106         MPU_REGION_ENABLE;\r
107 \r
108     MPU_SetRegion( dwRegionBaseAddr, dwRegionAttr);\r
109 \r
110 \r
111     /* DTCM memory region */\r
112     dwRegionBaseAddr =\r
113         DTCM_START_ADDRESS |\r
114         MPU_REGION_VALID |\r
115         MPU_DEFAULT_DTCM_REGION; //3\r
116 \r
117     dwRegionAttr =\r
118         MPU_AP_PRIVILEGED_READ_WRITE |\r
119         MPU_REGION_CACHEABLE |\r
120         MPU_REGION_BUFFERABLE |\r
121         MPU_TEX_WRITE_BACK_ALLOCATE |\r
122         MPU_RASR_SRD_Msk |\r
123         MPU_CalMPURegionSize(DTCM_END_ADDRESS - DTCM_START_ADDRESS) |\r
124         MPU_REGION_ENABLE;\r
125 \r
126     MPU_SetRegion( dwRegionBaseAddr, dwRegionAttr);\r
127 \r
128 \r
129     /* SRAM memory privilege region */\r
130     dwRegionBaseAddr =\r
131         SRAM_PRIVILEGE_START_ADDRESS |\r
132         MPU_REGION_VALID |\r
133         MPU_DEFAULT_PRAM_REGION; //4\r
134 \r
135     dwRegionAttr =\r
136         MPU_AP_FULL_ACCESS |\r
137         MPU_REGION_CACHEABLE |\r
138         MPU_REGION_BUFFERABLE |\r
139         MPU_REGION_SHAREABLE |\r
140         MPU_TEX_WRITE_BACK_ALLOCATE|\r
141         MPU_RASR_SRD_Msk |\r
142         MPU_CalMPURegionSize(SRAM_PRIVILEGE_END_ADDRESS - SRAM_PRIVILEGE_START_ADDRESS) |\r
143         MPU_REGION_ENABLE;\r
144 \r
145     MPU_SetRegion( dwRegionBaseAddr, dwRegionAttr);\r
146 \r
147     /* SRAM memory un-privilege region */\r
148     dwRegionBaseAddr =\r
149         SRAM_UNPRIVILEGE_START_ADDRESS |\r
150         MPU_REGION_VALID |\r
151         MPU_DEFAULT_UPRAM_REGION; //5\r
152 \r
153     dwRegionAttr =\r
154         MPU_AP_PRIVILEGED_READ_WRITE |\r
155         MPU_REGION_CACHEABLE |\r
156         MPU_REGION_BUFFERABLE |\r
157         MPU_TEX_WRITE_BACK_ALLOCATE|\r
158         MPU_RASR_SRD_Msk |\r
159         MPU_CalMPURegionSize(SRAM_UNPRIVILEGE_END_ADDRESS - SRAM_UNPRIVILEGE_START_ADDRESS) |\r
160         MPU_REGION_ENABLE;\r
161 \r
162     MPU_SetRegion( dwRegionBaseAddr, dwRegionAttr);\r
163 \r
164 \r
165 /* Peripheral memory region ---- Device */\r
166 /* #define PERIPHERALS_START_ADDRESS               0x40000000UL\r
167    #define PERIPHERALS_END_ADDRESS                 0x400E2000UL\r
168 */\r
169     dwRegionBaseAddr =\r
170         PERIPHERALS_START_ADDRESS |\r
171         MPU_REGION_VALID |\r
172         MPU_PERIPHERALS_REGION;  //6\r
173 \r
174     dwRegionAttr = MPU_AP_FULL_ACCESS |\r
175         MPU_REGION_EXECUTE_NEVER |\r
176         MPU_RASR_SRD_Msk |\r
177         MPU_CalMPURegionSize(PERIPHERALS_END_ADDRESS - PERIPHERALS_START_ADDRESS) |\r
178         MPU_REGION_ENABLE;\r
179 \r
180     MPU_SetRegion( dwRegionBaseAddr, dwRegionAttr);\r
181 \r
182 /* USBHS_ram memory region -External device */\r
183 /*  #define USBHSRAM_START_ADDRESS                  0xA0100000UL\r
184     #define USBHSRAM_END_ADDRESS                    0xA0200000UL\r
185 */\r
186     dwRegionBaseAddr =\r
187         USBHSRAM_START_ADDRESS |\r
188         MPU_REGION_VALID |\r
189         MPU_USBHSRAM_REGION;  //7\r
190 \r
191     dwRegionAttr =\r
192         MPU_AP_FULL_ACCESS |\r
193         MPU_REGION_EXECUTE_NEVER |\r
194         MPU_REGION_SHAREABLE |\r
195         MPU_RASR_SRD_Msk |\r
196         MPU_CalMPURegionSize(USBHSRAM_END_ADDRESS - USBHSRAM_START_ADDRESS) |\r
197         MPU_REGION_ENABLE;\r
198 \r
199     MPU_SetRegion( dwRegionBaseAddr, dwRegionAttr);\r
200 \r
201 /* QSPI memory region -External RAM -- normal */\r
202 /* #define QSPI_START_ADDRESS                      0x80000000UL\r
203    #define QSPI_END_ADDRESS                        0x9FFFFFFFUL\r
204 */\r
205     dwRegionBaseAddr =\r
206         QSPI_START_ADDRESS |\r
207         MPU_REGION_VALID |\r
208         MPU_QSPIMEM_REGION;\r
209 \r
210     dwRegionAttr =\r
211         MPU_AP_FULL_ACCESS |\r
212         MPU_REGION_EXECUTE_NEVER |\r
213         MPU_REGION_CACHEABLE |\r
214         MPU_REGION_BUFFERABLE |\r
215         MPU_TEX_WRITE_BACK_ALLOCATE|\r
216         MPU_RASR_SRD_Msk |\r
217         MPU_CalMPURegionSize(QSPI_END_ADDRESS - QSPI_START_ADDRESS) |\r
218         MPU_REGION_ENABLE;\r
219 \r
220     MPU_SetRegion( dwRegionBaseAddr, dwRegionAttr);\r
221 \r
222 #ifdef SDRAM_VALID\r
223     /* SDRAM memory region */\r
224     dwRegionBaseAddr =\r
225         SDRAM_START_ADDRESS |\r
226         MPU_REGION_VALID |\r
227         MPU_SDRAM_REGION;\r
228 \r
229     dwRegionAttr =\r
230         MPU_REGION_READ_WRITE |\r
231         MPU_REGION_CACHEABLE |\r
232         MPU_REGION_BUFFERABLE |\r
233         MPU_RASR_SRD_Msk |\r
234         MPU_CalMPURegionSize(SDRAM_END_ADDRESS - SDRAM_START_ADDRESS) |\r
235         MPU_REGION_ENABLE;\r
236 \r
237     MPU_SetRegion( dwRegionBaseAddr, dwRegionAttr);\r
238 \r
239 #endif\r
240 \r
241     /* Enable the memory management fault , Bus Fault, Usage Fault exception */\r
242     SCB->SHCSR |= (SCB_SHCSR_MEMFAULTENA_Msk | SCB_SHCSR_BUSFAULTENA_Msk | SCB_SHCSR_USGFAULTENA_Msk);\r
243 \r
244     /* Enable the MPU region */\r
245     MPU_Enable( MPU_ENABLE | MPU_BGENABLE );\r
246 #endif /* BELOW_CODE_REMOVED_FOR_REASON_STATED_IN_WARNING_MESSAGE_ABOVE */\r
247 }\r
248 \r
249 \r
250 \r
251 /**\r
252  * \brief Performs the low-level initialization of the chip.\r
253  * This includes EFC and master clock configuration.\r
254  * It also enable a low level on the pin NRST triggers a user reset.\r
255  */\r
256 extern WEAK void LowLevelInit( void )\r
257 {\r
258     /* Set 6 FWS for Embedded Flash Access */\r
259     EFC->EEFC_FMR = EEFC_FMR_FWS(6);\r
260     if (!(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) )  /* Main Oscillator Selection */\r
261     {\r
262         SUPC_SelectExtCrystal32K();\r
263         PMC_DisableAllClocks();\r
264         PMC_SetMckSelection(PMC_MCKR_CSS_SLOW_CLK, PMC_MCKR_PRES_CLK_1);\r
265         /* Then, enable Main XTAL oscillator */\r
266         PMC_EnableExtOsc();\r
267         PMC_SelectExtOsc();\r
268         PMC_SetMckSelection(PMC_MCKR_CSS_MAIN_CLK, PMC_MCKR_PRES_CLK_1);\r
269         /* wait Main CLK Ready */\r
270         while(!(PMC->CKGR_MCFR & CKGR_MCFR_MAINFRDY));\r
271         /* Then, cofigure PLLA and switch clock */\r
272         PMC_ConfigureMckWithPlla(0x16, 0x1, PMC_MCKR_PRES_CLK_1);\r
273         PMC->PMC_MCKR |= 1 << 8;\r
274         while( !(PMC->PMC_SR & PMC_SR_MCKRDY) );\r
275     }\r
276 \r
277     _SetupMemoryRegion();\r
278 \r
279 }\r