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