1 /* ----------------------------------------------------------------------------
\r
2 * ATMEL Microcontroller Software Support
\r
3 * ----------------------------------------------------------------------------
\r
4 * Copyright (c) 2008, Atmel Corporation
\r
6 * All rights reserved.
\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
11 * - Redistributions of source code must retain the above copyright notice,
\r
12 * this list of conditions and the disclaimer below.
\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
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
30 //------------------------------------------------------------------------------
\r
32 //------------------------------------------------------------------------------
\r
35 #include "board_memories.h"
\r
37 //------------------------------------------------------------------------------
\r
38 // Local definitions
\r
39 //------------------------------------------------------------------------------
\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
48 /// - BOARD_CKGR_PLLA
\r
49 /// - BOARD_PLLACOUNT
\r
52 /// - BOARD_CKGR_PLLB
\r
53 /// - BOARD_PLLBCOUNT
\r
57 /// - BOARD_PRESCALER
\r
59 /// Main oscillator startup time (in number of slow clock ticks).
\r
60 #define BOARD_OSCOUNT (AT91C_CKGR_OSCOUNT & (64 << 8))
\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
67 #define BOARD_MULA (AT91C_CKGR_MULA & (96 << 16))
\r
69 #define BOARD_DIVA (AT91C_CKGR_DIVA & 9)
\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
76 #define BOARD_MULB (124 << 16)
\r
78 #define BOARD_DIVB 12
\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
86 //------------------------------------------------------------------------------
\r
88 //------------------------------------------------------------------------------
\r
90 //------------------------------------------------------------------------------
\r
91 /// Default spurious interrupt handler
\r
92 //------------------------------------------------------------------------------
\r
93 void DefaultSpuriousHandler(void)
\r
98 //------------------------------------------------------------------------------
\r
99 /// Default handler for fast interrupt requests.
\r
100 //------------------------------------------------------------------------------
\r
101 void DefaultFiqHandler(void)
\r
106 //------------------------------------------------------------------------------
\r
107 /// Default handler for standard interrupt requests.
\r
108 //------------------------------------------------------------------------------
\r
109 void DefaultIrqHandler(void)
\r
114 //------------------------------------------------------------------------------
\r
115 // Global functions
\r
116 //------------------------------------------------------------------------------
\r
118 //------------------------------------------------------------------------------
\r
119 /// Performs the low-level initialization of the chip.
\r
120 //------------------------------------------------------------------------------
\r
121 void LowLevelInit(void)
\r
125 // Set flash wait states
\r
126 //----------------------
\r
127 AT91C_BASE_EFC->EFC_FMR = 6 << 8;
\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
135 // Initialize PLLA at 200MHz (198.656)
\r
136 AT91C_BASE_PMC->PMC_PLLAR = BOARD_CKGR_PLLA
\r
140 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA));
\r
142 // Initialize PLLB for USB usage
\r
143 AT91C_BASE_PMC->PMC_PLLBR = BOARD_USBDIV
\r
148 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKB));
\r
150 // Wait for the master clock if it was already initialized
\r
151 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
\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
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
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
170 AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) DefaultIrqHandler;
\r
172 AT91C_BASE_AIC->AIC_SPU = (unsigned int) DefaultSpuriousHandler;
\r
174 // Unstack nested interrupts
\r
175 for (i = 0; i < 8 ; i++) {
\r
177 AT91C_BASE_AIC->AIC_EOICR = 0;
\r
180 // Watchdog initialization
\r
181 //------------------------
\r
182 AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
\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