]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_ATSAM3X_Atmel_Studio/src/asf/sam/utils/cmsis/sam3x/source/templates/system_sam3x.c
Add SAM3X-EK demo.
[freertos] / FreeRTOS / Demo / CORTEX_ATSAM3X_Atmel_Studio / src / asf / sam / utils / cmsis / sam3x / source / templates / system_sam3x.c
1 /**\r
2  * \file\r
3  *\r
4  * \brief Provides the low-level initialization functions that called \r
5  * on chip startup.\r
6  *\r
7  * Copyright (c) 2011 - 2012 Atmel Corporation. All rights reserved.\r
8  *\r
9  * \asf_license_start\r
10  *\r
11  * \page License\r
12  *\r
13  * Redistribution and use in source and binary forms, with or without\r
14  * modification, are permitted provided that the following conditions are met:\r
15  *\r
16  * 1. Redistributions of source code must retain the above copyright notice,\r
17  *    this list of conditions and the following disclaimer.\r
18  *\r
19  * 2. Redistributions in binary form must reproduce the above copyright notice,\r
20  *    this list of conditions and the following disclaimer in the documentation\r
21  *    and/or other materials provided with the distribution.\r
22  *\r
23  * 3. The name of Atmel may not be used to endorse or promote products derived\r
24  *    from this software without specific prior written permission.\r
25  *\r
26  * 4. This software may only be redistributed and used in connection with an\r
27  *    Atmel microcontroller product.\r
28  *\r
29  * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED\r
30  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
31  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
32  * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR\r
33  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
34  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
35  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
36  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r
37  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
38  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
39  * POSSIBILITY OF SUCH DAMAGE.\r
40  *\r
41  * \asf_license_stop\r
42  *\r
43  */\r
44 \r
45 #include "system_sam3x.h"\r
46 #include "sam3xa.h"\r
47 \r
48 /* @cond 0 */\r
49 /**INDENT-OFF**/\r
50 #ifdef __cplusplus\r
51 extern "C" {\r
52 #endif\r
53 /**INDENT-ON**/\r
54 /* @endcond */\r
55 \r
56 /* Clock settings (84MHz) */\r
57 #define SYS_BOARD_OSCOUNT   (CKGR_MOR_MOSCXTST(0x8))\r
58 #define SYS_BOARD_PLLAR     (CKGR_PLLAR_ONE \\r
59                                                         | CKGR_PLLAR_MULA(0xdUL) \\r
60                                                         | CKGR_PLLAR_PLLACOUNT(0x3fUL) \\r
61                                                         | CKGR_PLLAR_DIVA(0x1UL))\r
62 #define SYS_BOARD_MCKR      (PMC_MCKR_PRES_CLK_2 | PMC_MCKR_CSS_PLLA_CLK)\r
63 \r
64 /* Clock Definitions */\r
65 #define SYS_UTMIPLL                     (480000000UL)   /* UTMI PLL frequency */\r
66 \r
67 #define SYS_CKGR_MOR_KEY_VALUE  CKGR_MOR_KEY(0x37) /* Key to unlock MOR register */\r
68 \r
69 /* FIXME: should be generated by sock */\r
70 uint32_t SystemCoreClock = CHIP_FREQ_MAINCK_RC_4MHZ;\r
71 \r
72 /**\r
73  * \brief Setup the microcontroller system.\r
74  * Initialize the System and update the SystemFrequency variable.\r
75  */\r
76 void SystemInit(void)\r
77 {\r
78         /* Set FWS according to SYS_BOARD_MCKR configuration */\r
79         EFC0->EEFC_FMR = EEFC_FMR_FWS(4);\r
80         EFC1->EEFC_FMR = EEFC_FMR_FWS(4);\r
81 \r
82         /* Initialize main oscillator */\r
83         if (!(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL)) {\r
84                 PMC->CKGR_MOR = SYS_CKGR_MOR_KEY_VALUE | SYS_BOARD_OSCOUNT | \r
85                                              CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN;\r
86                 while (!(PMC->PMC_SR & PMC_SR_MOSCXTS)) {\r
87                 }\r
88         }\r
89 \r
90         /* Switch to 3-20MHz Xtal oscillator */\r
91         PMC->CKGR_MOR = SYS_CKGR_MOR_KEY_VALUE | SYS_BOARD_OSCOUNT | \r
92                                    CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL;\r
93 \r
94         while (!(PMC->PMC_SR & PMC_SR_MOSCSELS)) {\r
95         }\r
96         PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) | \r
97                                      PMC_MCKR_CSS_MAIN_CLK;\r
98         while (!(PMC->PMC_SR & PMC_SR_MCKRDY)) {\r
99         }\r
100 \r
101         /* Initialize PLLA */\r
102         PMC->CKGR_PLLAR = SYS_BOARD_PLLAR;\r
103         while (!(PMC->PMC_SR & PMC_SR_LOCKA)) {\r
104         }\r
105 \r
106         /* Switch to main clock */\r
107         PMC->PMC_MCKR = (SYS_BOARD_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;\r
108         while (!(PMC->PMC_SR & PMC_SR_MCKRDY)) {\r
109         }\r
110 \r
111         /* Switch to PLLA */\r
112         PMC->PMC_MCKR = SYS_BOARD_MCKR;\r
113         while (!(PMC->PMC_SR & PMC_SR_MCKRDY)) {\r
114         }\r
115 \r
116         SystemCoreClock = CHIP_FREQ_CPU_MAX;\r
117 }\r
118 \r
119 void SystemCoreClockUpdate(void)\r
120 {\r
121         /* Determine clock frequency according to clock register values */\r
122         switch (PMC->PMC_MCKR & PMC_MCKR_CSS_Msk) {\r
123         case PMC_MCKR_CSS_SLOW_CLK:     /* Slow clock */\r
124                 if (SUPC->SUPC_SR & SUPC_SR_OSCSEL) {\r
125                         SystemCoreClock = CHIP_FREQ_XTAL_32K;\r
126                 } else {\r
127                         SystemCoreClock = CHIP_FREQ_SLCK_RC;\r
128                 }\r
129                 break;\r
130         case PMC_MCKR_CSS_MAIN_CLK:     /* Main clock */\r
131                 if (PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) {\r
132                         SystemCoreClock = CHIP_FREQ_XTAL_12M;\r
133                 } else {\r
134                         SystemCoreClock = CHIP_FREQ_MAINCK_RC_4MHZ;\r
135 \r
136                         switch (PMC->CKGR_MOR & CKGR_MOR_MOSCRCF_Msk) {\r
137                         case CKGR_MOR_MOSCRCF_4_MHz:\r
138                                 break;\r
139                         case CKGR_MOR_MOSCRCF_8_MHz:\r
140                                 SystemCoreClock *= 2U;\r
141                                 break;\r
142                         case CKGR_MOR_MOSCRCF_12_MHz:\r
143                                 SystemCoreClock *= 3U;\r
144                                 break;\r
145                         default:\r
146                                 break;\r
147                         }\r
148                 }\r
149                 break;\r
150         case PMC_MCKR_CSS_PLLA_CLK:     /* PLLA clock */\r
151         case PMC_MCKR_CSS_UPLL_CLK:     /* UPLL clock */\r
152                 if (PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) {\r
153                         SystemCoreClock = CHIP_FREQ_XTAL_12M;\r
154                 } else {\r
155                         SystemCoreClock = CHIP_FREQ_MAINCK_RC_4MHZ;\r
156 \r
157                         switch (PMC->CKGR_MOR & CKGR_MOR_MOSCRCF_Msk) {\r
158                         case CKGR_MOR_MOSCRCF_4_MHz:\r
159                                 break;\r
160                         case CKGR_MOR_MOSCRCF_8_MHz:\r
161                                 SystemCoreClock *= 2U;\r
162                                 break;\r
163                         case CKGR_MOR_MOSCRCF_12_MHz:\r
164                                 SystemCoreClock *= 3U;\r
165                                 break;\r
166                         default:\r
167                                 break;\r
168                         }\r
169                 }\r
170                 if ((PMC->PMC_MCKR & PMC_MCKR_CSS_Msk) == PMC_MCKR_CSS_PLLA_CLK) {\r
171                         SystemCoreClock *= ((((PMC->CKGR_PLLAR) & CKGR_PLLAR_MULA_Msk) >> \r
172                                                             CKGR_PLLAR_MULA_Pos) + 1U);\r
173                         SystemCoreClock /= ((((PMC->CKGR_PLLAR) & CKGR_PLLAR_DIVA_Msk) >> \r
174                                                              CKGR_PLLAR_DIVA_Pos));\r
175                 } else {\r
176                         SystemCoreClock = SYS_UTMIPLL / 2U;\r
177                 }\r
178                 break;\r
179         }\r
180 \r
181         if ((PMC->PMC_MCKR & PMC_MCKR_PRES_Msk) == PMC_MCKR_PRES_CLK_3) {\r
182                 SystemCoreClock /= 3U;\r
183         } else {\r
184                 SystemCoreClock >>= ((PMC->PMC_MCKR & PMC_MCKR_PRES_Msk) >> \r
185                                                   PMC_MCKR_PRES_Pos);\r
186         }\r
187 }\r
188 \r
189 /** \r
190  * Initialize flash.\r
191  */\r
192 void system_init_flash(uint32_t ul_clk)\r
193 {\r
194         /* Set FWS for embedded Flash access according to operating frequency */\r
195         if (ul_clk < CHIP_FREQ_FWS_0) {\r
196                 EFC0->EEFC_FMR = EEFC_FMR_FWS(0);\r
197                 EFC1->EEFC_FMR = EEFC_FMR_FWS(0);\r
198         } else if (ul_clk < CHIP_FREQ_FWS_1) {\r
199                 EFC0->EEFC_FMR = EEFC_FMR_FWS(1);\r
200                 EFC1->EEFC_FMR = EEFC_FMR_FWS(1);\r
201         } else if (ul_clk < CHIP_FREQ_FWS_2) {\r
202                 EFC0->EEFC_FMR = EEFC_FMR_FWS(2);\r
203                 EFC1->EEFC_FMR = EEFC_FMR_FWS(2);\r
204         } else if (ul_clk < CHIP_FREQ_FWS_3) {\r
205                 EFC0->EEFC_FMR = EEFC_FMR_FWS(3);\r
206                 EFC1->EEFC_FMR = EEFC_FMR_FWS(3);\r
207         } else {\r
208                 EFC0->EEFC_FMR = EEFC_FMR_FWS(4);\r
209                 EFC1->EEFC_FMR = EEFC_FMR_FWS(4);\r
210         }\r
211 }\r
212 \r
213 /* @cond 0 */\r
214 /**INDENT-OFF**/\r
215 #ifdef __cplusplus\r
216 }\r
217 #endif\r
218 /**INDENT-ON**/\r
219 /* @endcond */\r