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
35 /// Provides the low-level initialization function that gets called on chip
\r
40 /// LowLevelInit() is called in #board_cstartup_xxx.c#.
\r
41 //------------------------------------------------------------------------------
\r
43 //------------------------------------------------------------------------------
\r
45 //------------------------------------------------------------------------------
\r
48 #include "board_memories.h"
\r
49 #include "board_lowlevel.h"
\r
50 #include <pio/pio.h>
\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
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
67 // Define clock timeout
\r
68 #define CLOCK_TIMEOUT 0xFFFFFFFF
\r
70 #define AT91C_SUPC_SR_OSCSEL_CRYST 0x80UL
\r
71 #define AT91C_SUPC_CR_XTALSEL_CRYSTAL_SEL 0x08UL
\r
73 void SetDefaultMaster(unsigned char enable);
\r
75 //------------------------------------------------------------------------------
\r
77 //------------------------------------------------------------------------------
\r
79 //------------------------------------------------------------------------------
\r
81 //------------------------------------------------------------------------------
\r
83 //------------------------------------------------------------------------------
\r
84 // Exported functions
\r
85 //------------------------------------------------------------------------------
\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
95 unsigned int timeout = 0;
\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
102 /* Watchdog initialization
\r
103 *************************/
\r
104 AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
\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
111 while (!(AT91C_BASE_SUPC->SUPC_SR & AT91C_SUPC_SR_OSCSEL_CRYST) && (timeout++ < CLOCK_TIMEOUT));
\r
114 /* Initialize main oscillator
\r
115 ****************************/
\r
117 if(!(AT91C_BASE_PMC->PMC_MOR & AT91C_CKGR_MOSCSEL))
\r
119 AT91C_BASE_PMC->PMC_MOR = (0x37 << 16) | BOARD_OSCOUNT | AT91C_CKGR_MOSCRCEN | AT91C_CKGR_MOSCXTEN;
\r
121 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCXTS) && (timeout++ < CLOCK_TIMEOUT));
\r
125 AT91C_BASE_PMC->PMC_MOR = (0x37 << 16) | BOARD_OSCOUNT | AT91C_CKGR_MOSCRCEN | AT91C_CKGR_MOSCXTEN | AT91C_CKGR_MOSCSEL;
\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
130 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT));
\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
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
139 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (timeout++ < CLOCK_TIMEOUT));
\r
141 /* Initialize PLLA */
\r
142 AT91C_BASE_PMC->PMC_PLLAR = BOARD_PLLR;
\r
144 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKA) && (timeout++ < CLOCK_TIMEOUT));
\r
146 /* Initialize UTMI for USB usage */
\r
147 AT91C_BASE_CKGR->CKGR_UCKR |= (AT91C_CKGR_UPLLCOUNT & (3 << 20)) | AT91C_CKGR_UPLLEN;
\r
149 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCKU) && (timeout++ < CLOCK_TIMEOUT));
\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
155 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (timeout++ < CLOCK_TIMEOUT));
\r
157 AT91C_BASE_PMC->PMC_MCKR = BOARD_MCKR;
\r
159 while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (timeout++ < CLOCK_TIMEOUT));
\r
161 /* Enable clock for UART
\r
162 ************************/
\r
163 AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_DBGU);
\r
165 /* Optimize CPU setting for speed */
\r
166 SetDefaultMaster(1);
\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
176 AT91PS_HMATRIX2 pMatrix = AT91C_BASE_MATRIX;
\r
178 // Set default master
\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
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
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
194 // Clear default master: SRAM0 -> Cortex-M3 System
\r
195 pMatrix->HMATRIX2_SCFG0 &= (~AT91C_MATRIX_DEFMSTR_TYPE);
\r
197 // Clear default master: SRAM1 -> Cortex-M3 System
\r
198 pMatrix->HMATRIX2_SCFG1 &= (~AT91C_MATRIX_DEFMSTR_TYPE);
\r
200 // Clear default master: Internal flash0 -> Cortex-M3 Instruction/Data
\r
201 pMatrix->HMATRIX2_SCFG3 &= (~AT91C_MATRIX_DEFMSTR_TYPE);
\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
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