]> git.sur5r.net Git - freertos/blob - Demo/Common/drivers/Atmel/at91lib/boards/at91sam9xe-ek/board_lowlevel.c
Atmel provided hardware specifics.
[freertos] / Demo / Common / drivers / Atmel / at91lib / boards / at91sam9xe-ek / 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 //         Headers\r
32 //------------------------------------------------------------------------------\r
33 \r
34 #include "board.h"\r
35 #include "board_memories.h"\r
36 \r
37 //------------------------------------------------------------------------------\r
38 //         Local definitions\r
39 //------------------------------------------------------------------------------\r
40 \r
41 //------------------------------------------------------------------------------\r
42 /// \page "SAM9XE - Oscillator & PLL Parameters"\r
43 /// This page lists the parameters which are set for the PLL and main\r
44 /// oscillator configuration.\r
45 ///\r
46 /// !Parameters\r
47 /// - BOARD_OSCOUNT\r
48 /// - BOARD_CKGR_PLLA\r
49 /// - BOARD_PLLACOUNT\r
50 /// - BOARD_MULA\r
51 /// - BOARD_DIVA\r
52 /// - BOARD_CKGR_PLLB\r
53 /// - BOARD_PLLBCOUNT\r
54 /// - BOARD_MULB\r
55 /// - BOARD_DIVB\r
56 /// - BOARD_USBDIV\r
57 /// - BOARD_PRESCALER\r
58 \r
59 /// Main oscillator startup time (in number of slow clock ticks). \r
60 #define BOARD_OSCOUNT           (AT91C_CKGR_OSCOUNT & (64 << 8))\r
61 \r
62 /// PLLA frequency range.\r
63 #define BOARD_CKGR_PLLA         (AT91C_CKGR_SRCA | AT91C_CKGR_OUTA_2)\r
64 /// PLLA startup time (in number of slow clock ticks).\r
65 #define BOARD_PLLACOUNT         (63 << 8)\r
66 /// PLLA MUL value.\r
67 #define BOARD_MULA              (AT91C_CKGR_MULA & (96 << 16))\r
68 /// PLLA DIV value.\r
69 #define BOARD_DIVA              (AT91C_CKGR_DIVA & 9)\r
70 \r
71 /// PLLB frequency range\r
72 #define BOARD_CKGR_PLLB         AT91C_CKGR_OUTB_1\r
73 /// PLLB startup time (in number of slow clock ticks).\r
74 #define BOARD_PLLBCOUNT         BOARD_PLLACOUNT\r
75 /// PLLB MUL value.\r
76 #define BOARD_MULB              (124 << 16)\r
77 /// PLLB DIV value.\r
78 #define BOARD_DIVB              12\r
79 \r
80 /// USB PLL divisor value to obtain a 48MHz clock.\r
81 #define BOARD_USBDIV            AT91C_CKGR_USBDIV_2\r
82 /// Master clock prescaler value.\r
83 #define BOARD_PRESCALER         AT91C_PMC_MDIV_2\r
84 //------------------------------------------------------------------------------\r
85 \r
86 //------------------------------------------------------------------------------\r
87 //         Local functions\r
88 //------------------------------------------------------------------------------\r
89 \r
90 //------------------------------------------------------------------------------\r
91 /// Default spurious interrupt handler\r
92 //------------------------------------------------------------------------------\r
93 void DefaultSpuriousHandler(void)\r
94 {\r
95     while (1);\r
96 }\r
97 \r
98 //------------------------------------------------------------------------------\r
99 /// Default handler for fast interrupt requests.\r
100 //------------------------------------------------------------------------------\r
101 void DefaultFiqHandler(void)\r
102 {\r
103     while (1);\r
104 }\r
105 \r
106 //------------------------------------------------------------------------------\r
107 /// Default handler for standard interrupt requests.\r
108 //------------------------------------------------------------------------------\r
109 void DefaultIrqHandler(void)\r
110 {\r
111     while (1);\r
112 }\r
113 \r
114 //------------------------------------------------------------------------------\r
115 //         Global functions\r
116 //------------------------------------------------------------------------------\r
117 \r
118 //------------------------------------------------------------------------------\r
119 /// Performs the low-level initialization of the chip.\r
120 //------------------------------------------------------------------------------\r
121 void LowLevelInit(void)\r
122 {\r
123     unsigned char i;\r
124 \r
125     // Set flash wait states\r
126     //----------------------\r
127     AT91C_BASE_EFC->EFC_FMR = 6 << 8;\r
128 \r
129 //#if !defined(sdram)\r
130     // Initialize main oscillator\r
131     //---------------------------\r
132     AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN;\r
133     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));\r
134 \r
135     // Initialize PLLA at 200MHz (198.656)\r
136     AT91C_BASE_PMC->PMC_PLLAR = BOARD_CKGR_PLLA\r
137                                 | BOARD_PLLACOUNT\r
138                                 | BOARD_MULA\r
139                                 | BOARD_DIVA;\r
140     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA));\r
141 \r
142     // Initialize PLLB for USB usage\r
143     AT91C_BASE_PMC->PMC_PLLBR = BOARD_USBDIV\r
144                                 | BOARD_CKGR_PLLB\r
145                                 | BOARD_PLLBCOUNT\r
146                                 | BOARD_MULB\r
147                                 | BOARD_DIVB;\r
148     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB));\r
149 \r
150     // Wait for the master clock if it was already initialized\r
151     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));\r
152 \r
153     // Switch to fast clock\r
154     //---------------------\r
155     // Switch to main oscillator + prescaler\r
156     AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER;\r
157     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));\r
158 \r
159     // Switch to PLL + prescaler\r
160     AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLLA_CLK;\r
161     while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));\r
162 //#endif //#if !defined(sdram)\r
163 \r
164     // Initialize AIC\r
165     //---------------\r
166     AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;\r
167     AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) DefaultFiqHandler;\r
168     for (i = 1; i < 31; i++) {\r
169 \r
170         AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) DefaultIrqHandler;\r
171     }\r
172     AT91C_BASE_AIC->AIC_SPU = (unsigned int) DefaultSpuriousHandler;\r
173 \r
174     // Unstack nested interrupts\r
175     for (i = 0; i < 8 ; i++) {\r
176 \r
177         AT91C_BASE_AIC->AIC_EOICR = 0;\r
178     }\r
179 \r
180     // Watchdog initialization\r
181     //------------------------\r
182     AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;\r
183 \r
184     // Remap\r
185     //------\r
186     BOARD_RemapRam();\r
187 \r
188     // Disable RTT and PIT interrupts (potential problem when program A\r
189     // configures RTT, then program B wants to use PIT only, interrupts\r
190     // from the RTT will still occur since they both use AT91C_ID_SYS)\r
191     AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN);\r
192     AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN;\r
193 }\r
194 \r