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 <pio/pio.h>
\r
37 //------------------------------------------------------------------------------
\r
39 //------------------------------------------------------------------------------
\r
41 /// Reads a register value. Useful to add trace information to read accesses.
\r
42 #define READ(peripheral, register) (peripheral->register)
\r
43 /// Writes data in a register. Useful to add trace information to write accesses.
\r
44 #define WRITE(peripheral, register, value) (peripheral->register = value)
\r
46 //------------------------------------------------------------------------------
\r
48 //------------------------------------------------------------------------------
\r
50 //------------------------------------------------------------------------------
\r
51 /// Changes the mapping of the chip so that the remap area mirrors the
\r
52 /// internal ROM or the EBI CS0 (depending on the BMS input).
\r
53 //------------------------------------------------------------------------------
\r
54 void BOARD_RemapRom(void)
\r
56 WRITE(AT91C_BASE_MATRIX, MATRIX_MRCR, 0);
\r
59 //------------------------------------------------------------------------------
\r
60 /// Changes the mapping of the chip so that the remap area mirrors the
\r
62 //------------------------------------------------------------------------------
\r
63 void BOARD_RemapRam(void)
\r
65 WRITE(AT91C_BASE_MATRIX,
\r
67 (AT91C_MATRIX_RCA926I | AT91C_MATRIX_RCA926D));
\r
70 //------------------------------------------------------------------------------
\r
71 /// Initialize and configure the external SDRAM.
\r
72 //------------------------------------------------------------------------------
\r
73 void BOARD_ConfigureSdram(void)
\r
75 volatile unsigned int i;
\r
76 static const Pin pinsSdram = PINS_SDRAM;
\r
77 volatile unsigned int *pSdram = (unsigned int *) AT91C_EBI_SDRAM;
\r
79 // Enable corresponding PIOs
\r
80 PIO_Configure(&pinsSdram, 1);
\r
82 // Enable EBI chip select for the SDRAM
\r
83 WRITE(AT91C_BASE_MATRIX, MATRIX_EBI, AT91C_MATRIX_CS1A_SDRAMC);
\r
86 // CFG Control Register
\r
87 WRITE(AT91C_BASE_SDRAMC, SDRAMC_CR, AT91C_SDRAMC_NC_9
\r
88 | AT91C_SDRAMC_NR_13
\r
89 | AT91C_SDRAMC_CAS_2
\r
90 | AT91C_SDRAMC_NB_4_BANKS
\r
91 | AT91C_SDRAMC_DBW_32_BITS
\r
92 | AT91C_SDRAMC_TWR_2
\r
93 | AT91C_SDRAMC_TRC_7
\r
94 | AT91C_SDRAMC_TRP_2
\r
95 | AT91C_SDRAMC_TRCD_2
\r
96 | AT91C_SDRAMC_TRAS_5
\r
97 | AT91C_SDRAMC_TXSR_8);
\r
99 for (i = 0; i < 1000; i++);
\r
101 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NOP_CMD); // Perform NOP
\r
102 pSdram[0] = 0x00000000;
\r
104 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_PRCGALL_CMD); // Set PRCHG AL
\r
105 pSdram[0] = 0x00000000; // Perform PRCHG
\r
107 for (i = 0; i < 10000; i++);
\r
109 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 1st CBR
\r
110 pSdram[1] = 0x00000001; // Perform CBR
\r
112 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 2 CBR
\r
113 pSdram[2] = 0x00000002; // Perform CBR
\r
115 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 3 CBR
\r
116 pSdram[3] = 0x00000003; // Perform CBR
\r
118 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 4 CBR
\r
119 pSdram[4] = 0x00000004; // Perform CBR
\r
121 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 5 CBR
\r
122 pSdram[5] = 0x00000005; // Perform CBR
\r
124 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 6 CBR
\r
125 pSdram[6] = 0x00000006; // Perform CBR
\r
127 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 7 CBR
\r
128 pSdram[7] = 0x00000007; // Perform CBR
\r
130 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 8 CBR
\r
131 pSdram[8] = 0x00000008; // Perform CBR
\r
133 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_LMR_CMD); // Set LMR operation
\r
134 pSdram[9] = 0xcafedede; // Perform LMR burst=1, lat=2
\r
136 WRITE(AT91C_BASE_SDRAMC, SDRAMC_TR, (BOARD_MCK * 7) / 1000000); // Set Refresh Timer
\r
138 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NORMAL_CMD); // Set Normal mode
\r
139 pSdram[0] = 0x00000000; // Perform Normal mode
\r
142 //------------------------------------------------------------------------------
\r
143 /// Initialize and configure the SDRAM for a 48 MHz MCK (ROM code clock settings).
\r
144 //------------------------------------------------------------------------------
\r
145 void BOARD_ConfigureSdram48MHz(void)
\r
147 volatile unsigned int i;
\r
148 static const Pin pinsSdram = PINS_SDRAM;
\r
149 volatile unsigned int *pSdram = (unsigned int *) AT91C_EBI_SDRAM;
\r
151 // Enable corresponding PIOs
\r
152 PIO_Configure(&pinsSdram, 1);
\r
154 // Enable EBI chip select for the SDRAM
\r
155 WRITE(AT91C_BASE_MATRIX, MATRIX_EBI, AT91C_MATRIX_CS1A_SDRAMC);
\r
158 // CFG Control Register
\r
159 WRITE(AT91C_BASE_SDRAMC, SDRAMC_CR, AT91C_SDRAMC_NC_9
\r
160 | AT91C_SDRAMC_NR_13
\r
161 | AT91C_SDRAMC_CAS_2
\r
162 | AT91C_SDRAMC_NB_4_BANKS
\r
163 | AT91C_SDRAMC_DBW_32_BITS
\r
164 | AT91C_SDRAMC_TWR_1
\r
165 | AT91C_SDRAMC_TRC_4
\r
166 | AT91C_SDRAMC_TRP_1
\r
167 | AT91C_SDRAMC_TRCD_1
\r
168 | AT91C_SDRAMC_TRAS_2
\r
169 | AT91C_SDRAMC_TXSR_3);
\r
171 for (i = 0; i < 1000; i++);
\r
173 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NOP_CMD); // Perform NOP
\r
174 pSdram[0] = 0x00000000;
\r
176 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_PRCGALL_CMD); // Set PRCHG AL
\r
177 pSdram[0] = 0x00000000; // Perform PRCHG
\r
179 for (i = 0; i < 10000; i++);
\r
181 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 1st CBR
\r
182 pSdram[1] = 0x00000001; // Perform CBR
\r
184 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 2 CBR
\r
185 pSdram[2] = 0x00000002; // Perform CBR
\r
187 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 3 CBR
\r
188 pSdram[3] = 0x00000003; // Perform CBR
\r
190 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 4 CBR
\r
191 pSdram[4] = 0x00000004; // Perform CBR
\r
193 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 5 CBR
\r
194 pSdram[5] = 0x00000005; // Perform CBR
\r
196 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 6 CBR
\r
197 pSdram[6] = 0x00000006; // Perform CBR
\r
199 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 7 CBR
\r
200 pSdram[7] = 0x00000007; // Perform CBR
\r
202 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD); // Set 8 CBR
\r
203 pSdram[8] = 0x00000008; // Perform CBR
\r
205 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_LMR_CMD); // Set LMR operation
\r
206 pSdram[9] = 0xcafedede; // Perform LMR burst=1, lat=2
\r
208 WRITE(AT91C_BASE_SDRAMC, SDRAMC_TR, (48000000 * 7) / 1000000); // Set Refresh Timer
\r
210 WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NORMAL_CMD); // Set Normal mode
\r
211 pSdram[0] = 0x00000000; // Perform Normal mode
\r
214 //------------------------------------------------------------------------------
\r
215 /// Configures the EBI for NandFlash access. Pins must be configured after or
\r
216 /// before calling this function.
\r
217 //------------------------------------------------------------------------------
\r
218 void BOARD_ConfigureNandFlash(unsigned char busWidth)
\r
221 AT91C_BASE_MATRIX->MATRIX_EBI |= AT91C_MATRIX_CS3A_SM;
\r
224 AT91C_BASE_SMC->SMC_SETUP3 = 0x00000000;
\r
225 AT91C_BASE_SMC->SMC_PULSE3 = 0x00030003;
\r
226 AT91C_BASE_SMC->SMC_CYCLE3 = 0x00050005;
\r
227 AT91C_BASE_SMC->SMC_CTRL3 = 0x00002003;
\r
229 if (busWidth == 8) {
\r
231 AT91C_BASE_SMC->SMC_CTRL3 |= AT91C_SMC_DBW_WIDTH_EIGTH_BITS;
\r
233 else if (busWidth == 16) {
\r
235 AT91C_BASE_SMC->SMC_CTRL3 |= AT91C_SMC_DBW_WIDTH_SIXTEEN_BITS;
\r
239 //------------------------------------------------------------------------------
\r
240 /// Configures the EBI for NandFlash access at 48MHz. Pins must be configured
\r
241 /// after or before calling this function.
\r
242 //------------------------------------------------------------------------------
\r
243 void BOARD_ConfigureNandFlash48MHz(unsigned char busWidth)
\r
246 AT91C_BASE_CCFG->CCFG_EBICSA |= AT91C_EBI_CS3A_SM;
\r
249 AT91C_BASE_SMC->SMC_SETUP3 = 0x00010001;
\r
250 AT91C_BASE_SMC->SMC_PULSE3 = 0x04030302;
\r
251 AT91C_BASE_SMC->SMC_CYCLE3 = 0x00070004;
\r
252 AT91C_BASE_SMC->SMC_CTRL3 = (AT91C_SMC_READMODE
\r
253 | AT91C_SMC_WRITEMODE
\r
254 | AT91C_SMC_NWAITM_NWAIT_DISABLE
\r
255 | ((0x1 << 16) & AT91C_SMC_TDF));
\r
257 if (busWidth == 8) {
\r
259 AT91C_BASE_SMC->SMC_CTRL3 |= AT91C_SMC_DBW_WIDTH_EIGTH_BITS;
\r
261 else if (busWidth == 16) {
\r
263 AT91C_BASE_SMC->SMC_CTRL3 |= AT91C_SMC_DBW_WIDTH_SIXTEEN_BITS;
\r
267 //------------------------------------------------------------------------------
\r
268 /// Configures the EBI for NorFlash access at 48MHz.
\r
269 /// \Param busWidth Bus width
\r
270 //------------------------------------------------------------------------------
\r
271 void BOARD_ConfigureNorFlash48MHz(unsigned char busWidth)
\r
274 AT91C_BASE_SMC->SMC_SETUP0 = 0x00000001;
\r
275 AT91C_BASE_SMC->SMC_PULSE0 = 0x07070703;
\r
276 AT91C_BASE_SMC->SMC_CYCLE0 = 0x00070007;
\r
277 AT91C_BASE_SMC->SMC_CTRL0 = (AT91C_SMC_READMODE
\r
278 | AT91C_SMC_WRITEMODE
\r
279 | AT91C_SMC_NWAITM_NWAIT_DISABLE
\r
280 | ((0x1 << 16) & AT91C_SMC_TDF));
\r
282 if (busWidth == 8) {
\r
284 AT91C_BASE_SMC->SMC_CTRL0 |= AT91C_SMC_DBW_WIDTH_EIGTH_BITS;
\r
286 else if (busWidth == 16) {
\r
288 AT91C_BASE_SMC->SMC_CTRL0 |= AT91C_SMC_DBW_WIDTH_SIXTEEN_BITS;
\r
290 else if (busWidth == 32) {
\r
292 AT91C_BASE_SMC->SMC_CTRL0 |= AT91C_SMC_DBW_WIDTH_THIRTY_TWO_BITS;
\r
296 //------------------------------------------------------------------------------
\r
297 /// Set flash wait states in the EFC for 48MHz
\r
298 //------------------------------------------------------------------------------
\r
299 void BOARD_ConfigureFlash48MHz(void)
\r
301 // Set flash wait states
\r
302 //----------------------
\r
303 AT91C_BASE_EFC->EFC_FMR = 6 << 8;
\r