]> git.sur5r.net Git - freertos/blob - Demo/CORTEX_AT91SAM3U256_IAR/system/board_lowlevel.c
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / CORTEX_AT91SAM3U256_IAR / system / board_lowlevel.c
1 /* ----------------------------------------------------------------------------\r
2  *         ATMEL Microcontroller Software Support\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2008, 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 /// \unit\r
32 ///\r
33 /// !Purpose\r
34 ///\r
35 /// Provides the low-level initialization function that gets called on chip\r
36 /// startup.\r
37 ///\r
38 /// !Usage\r
39 ///\r
40 /// LowLevelInit() is called in #board_cstartup_xxx.c#.\r
41 //------------------------------------------------------------------------------\r
42 \r
43 //------------------------------------------------------------------------------\r
44 //         Headers\r
45 //------------------------------------------------------------------------------\r
46 \r
47 #include "board.h"\r
48 #include "board_memories.h"\r
49 #include "board_lowlevel.h"\r
50 #include <pio/pio.h>\r
51 \r
52 //------------------------------------------------------------------------------\r
53 //         Local definitions\r
54 //------------------------------------------------------------------------------\r
55 // Settings at 48/48MHz\r
56 #define AT91C_CKGR_MUL_SHIFT         16\r
57 #define AT91C_CKGR_OUT_SHIFT         14\r
58 #define AT91C_CKGR_PLLCOUNT_SHIFT     8\r
59 #define AT91C_CKGR_DIV_SHIFT          0\r
60 \r
61 #define BOARD_OSCOUNT         (AT91C_CKGR_MOSCXTST & (0x3F << 8))\r
62 #define BOARD_PLLR ((1 << 29) | (0x7 << AT91C_CKGR_MUL_SHIFT) \\r
63         | (0x0 << AT91C_CKGR_OUT_SHIFT) |(0x3f << AT91C_CKGR_PLLCOUNT_SHIFT) \\r
64         | (0x1 << AT91C_CKGR_DIV_SHIFT))\r
65 #define BOARD_MCKR ( AT91C_PMC_PRES_CLK_2 | AT91C_PMC_CSS_PLLA_CLK)\r
66 \r
67 // Define clock timeout\r
68 #define CLOCK_TIMEOUT           0xFFFFFFFF\r
69 \r
70 #define AT91C_SUPC_SR_OSCSEL_CRYST 0x80UL\r
71 #define AT91C_SUPC_CR_XTALSEL_CRYSTAL_SEL 0x08UL\r
72 \r
73 void SetDefaultMaster(unsigned char enable);\r
74 \r
75 //------------------------------------------------------------------------------\r
76 //         Local variables\r
77 //------------------------------------------------------------------------------\r
78 \r
79 //------------------------------------------------------------------------------\r
80 //         Local functions\r
81 //------------------------------------------------------------------------------\r
82 \r
83 //------------------------------------------------------------------------------\r
84 //         Exported functions\r
85 //------------------------------------------------------------------------------\r
86 \r
87 //------------------------------------------------------------------------------\r
88 /// After POR, at91sam3u device is running on 4MHz internal RC\r
89 /// At the end of the LowLevelInit procedure MCK = 48MHz PLLA = 96 CPU=48MHz\r
90 /// Performs the low-level initialization of the chip. This includes EFC, master\r
91 /// clock, IRQ & watchdog configuration.\r
92 //------------------------------------------------------------------------------\r
93 void LowLevelInit(void)\r
94 {\r
95     unsigned int timeout = 0;\r
96 \r
97     /* Set 2 WS for Embedded Flash Access\r
98      ************************************/\r
99     AT91C_BASE_EFC0->EFC_FMR = AT91C_EFC_FWS_2WS;\r
100     AT91C_BASE_EFC1->EFC_FMR = AT91C_EFC_FWS_2WS;\r
101 \r
102     /* Watchdog initialization\r
103      *************************/\r
104     AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;\r
105 \r
106     /* Select external slow clock\r
107      ****************************/\r
108     if ((AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_SR_OSCSEL_CRYST) != AT91C_SUPC_SR_OSCSEL_CRYST) {\r
109         AT91C_BASE_SUPC->SUPC_CR = AT91C_SUPC_CR_XTALSEL_CRYSTAL_SEL | (0xA5UL << 24UL);\r
110         timeout = 0;\r
111         while (!(AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_SR_OSCSEL_CRYST) && (timeout++ < CLOCK_TIMEOUT));\r
112     }\r
113 \r
114     /* Initialize main oscillator\r
115      ****************************/\r
116 \r
117         if(!(AT91C_BASE_PMC->PMC_MOR & AT91C_CKGR_MOSCSEL))\r
118         {\r
119                 AT91C_BASE_PMC->PMC_MOR = (0x37 << 16) | BOARD_OSCOUNT | AT91C_CKGR_MOSCRCEN | AT91C_CKGR_MOSCXTEN;\r
120                 timeout = 0;\r
121                 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCXTS) && (timeout++ < CLOCK_TIMEOUT));\r
122         }       \r
123         else\r
124     {\r
125                 AT91C_BASE_PMC->PMC_MOR = (0x37 << 16) | BOARD_OSCOUNT | AT91C_CKGR_MOSCRCEN | AT91C_CKGR_MOSCXTEN | AT91C_CKGR_MOSCSEL;\r
126         timeout = 0;\r
127         while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCRCS) && (timeout++ < CLOCK_TIMEOUT));\r
128         AT91C_BASE_PMC->PMC_MOR = (0x37 << 16) | BOARD_OSCOUNT | AT91C_CKGR_MOSCRCEN | AT91C_CKGR_MOSCXTEN;\r
129         timeout = 0;\r
130         while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT));\r
131     }\r
132 \r
133     /* Switch to moscsel */\r
134     AT91C_BASE_PMC->PMC_MOR = (0x37 << 16) | BOARD_OSCOUNT | AT91C_CKGR_MOSCRCEN | AT91C_CKGR_MOSCXTEN | AT91C_CKGR_MOSCSEL;\r
135     timeout = 0;\r
136     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT));\r
137     AT91C_BASE_PMC->PMC_MCKR = (AT91C_BASE_PMC->PMC_MCKR & ~AT91C_PMC_CSS) | AT91C_PMC_CSS_MAIN_CLK;\r
138     timeout = 0;\r
139     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (timeout++ < CLOCK_TIMEOUT));\r
140 \r
141     /* Initialize PLLA */\r
142     AT91C_BASE_PMC->PMC_PLLAR = BOARD_PLLR;\r
143     timeout = 0;\r
144     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA) && (timeout++ < CLOCK_TIMEOUT));\r
145 \r
146     /* Initialize UTMI for USB usage */\r
147     AT91C_BASE_CKGR->CKGR_UCKR |= (AT91C_CKGR_UPLLCOUNT & (3 << 20)) | AT91C_CKGR_UPLLEN;\r
148     timeout = 0;\r
149     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKU) && (timeout++ < CLOCK_TIMEOUT));\r
150 \r
151     /* Switch to fast clock\r
152      **********************/\r
153     AT91C_BASE_PMC->PMC_MCKR = (BOARD_MCKR & ~AT91C_PMC_CSS) | AT91C_PMC_CSS_MAIN_CLK;\r
154     timeout = 0;\r
155     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (timeout++ < CLOCK_TIMEOUT));\r
156 \r
157     AT91C_BASE_PMC->PMC_MCKR = BOARD_MCKR;\r
158     timeout = 0;\r
159     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (timeout++ < CLOCK_TIMEOUT));\r
160 \r
161     /* Enable clock for UART\r
162      ************************/\r
163     AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_DBGU);\r
164 \r
165     /* Optimize CPU setting for speed */\r
166     SetDefaultMaster(1);\r
167 \r
168 }\r
169 \r
170 //------------------------------------------------------------------------------\r
171 /// Enable or disable default master access\r
172 /// \param enalbe 1 enable defaultMaster settings, 0 disable it.\r
173 //------------------------------------------------------------------------------\r
174 void SetDefaultMaster(unsigned char enable)\r
175 {\r
176     AT91PS_HMATRIX2 pMatrix = AT91C_BASE_MATRIX;\r
177 \r
178     // Set default master\r
179     if (enable == 1) {\r
180 \r
181         // Set default master: SRAM0 -> Cortex-M3 System\r
182         pMatrix->HMATRIX2_SCFG0 |= AT91C_MATRIX_FIXED_DEFMSTR_SCFG0_ARMS |\r
183                                    AT91C_MATRIX_DEFMSTR_TYPE_FIXED_DEFMSTR;\r
184 \r
185         // Set default master: SRAM1 -> Cortex-M3 System\r
186         pMatrix->HMATRIX2_SCFG1 |= AT91C_MATRIX_FIXED_DEFMSTR_SCFG1_ARMS |\r
187                                    AT91C_MATRIX_DEFMSTR_TYPE_FIXED_DEFMSTR;\r
188 \r
189         // Set default master: Internal flash0 -> Cortex-M3 Instruction/Data\r
190         pMatrix->HMATRIX2_SCFG3 |= AT91C_MATRIX_FIXED_DEFMSTR_SCFG3_ARMC |\r
191                                    AT91C_MATRIX_DEFMSTR_TYPE_FIXED_DEFMSTR;\r
192     } else {\r
193 \r
194         // Clear default master: SRAM0 -> Cortex-M3 System\r
195         pMatrix->HMATRIX2_SCFG0 &= (~AT91C_MATRIX_DEFMSTR_TYPE);\r
196 \r
197         // Clear default master: SRAM1 -> Cortex-M3 System\r
198         pMatrix->HMATRIX2_SCFG1 &= (~AT91C_MATRIX_DEFMSTR_TYPE);\r
199 \r
200         // Clear default master: Internal flash0 -> Cortex-M3 Instruction/Data\r
201         pMatrix->HMATRIX2_SCFG3 &= (~AT91C_MATRIX_DEFMSTR_TYPE);\r
202     }\r
203 }\r
204 \r
205 //------------------------------------------------------------------------------\r
206 /// Set flash wait state\r
207 /// \param ws    Value of flash wait state\r
208 //------------------------------------------------------------------------------\r
209 void SetFlashWaitState(unsigned char ws)\r
210 {\r
211     // Set Wait State for Embedded Flash Access\r
212         AT91C_BASE_EFC0->EFC_FMR = ((ws << 8) & AT91C_EFC_FWS);\r
213         AT91C_BASE_EFC1->EFC_FMR = ((ws << 8) & AT91C_EFC_FWS);\r
214 }\r
215 \r