]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M4F_M0_LPC43xx_Keil/system/emc_LPC43xx.c
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS / Demo / CORTEX_M4F_M0_LPC43xx_Keil / system / emc_LPC43xx.c
1 /***********************************************************************\r
2  * $Id: emc_LPC43xx.c 8389 2011-10-19 13:53:14Z nxp28536 $   emc_LPC43xx.c\r
3  *\r
4  * Project: NXP LPC43xx Common\r
5  *\r
6  * Description:  Initialisation of the external memory interface and\r
7  *               configuration for the specific memories connected to\r
8  *               the LPC43xx\r
9  *\r
10  * Copyright(C) 2011, NXP Semiconductor\r
11  * All rights reserved.\r
12  *\r
13  ***********************************************************************\r
14  * Software that is described herein is for illustrative purposes only\r
15  * which provides customers with programming information regarding the\r
16  * products. This software is supplied "AS IS" without any warranties.\r
17  * NXP Semiconductors assumes no responsibility or liability for the\r
18  * use of the software, conveys no license or title under any patent,\r
19  * copyright, or mask work right to the product. NXP Semiconductors\r
20  * reserves the right to make changes in the software without\r
21  * notification. NXP Semiconductors also make no representation or\r
22  * warranty that such application will be suitable for the specified\r
23  * use without further testing or modification.\r
24  **********************************************************************/\r
25 \r
26 #include "LPC43xx.h"\r
27 #include "system_LPC43xx.h"\r
28 #include "scu.h"\r
29 #include "config.h"\r
30 #include "platform_config.h"\r
31 \r
32 #include "emc_LPC43xx.h"\r
33 \r
34 \r
35 /**********************************************************************\r
36  ** Function prototypes\r
37 **********************************************************************/\r
38 #define DELAY_1usFreq  (1000000)        // 1MHz equivalent to 1usec\r
39 static uint32_t delayBase1us;           // calculated depending on M4/EMI frequency\r
40 static void vDelay(uint32_t u32Delay);  // delay function\r
41 \r
42 \r
43 \r
44 /****************************************************************************************\r
45 * Call the required memory setup functions from here\r
46 *\r
47 *\r
48 ****************************************************************************************/\r
49 void EMC_Init( void )\r
50 {\r
51         // The address/data pins for the memory interface are required for the static and for\r
52         // dynamic memories\r
53         EMC_Config_Pinmux();\r
54 \r
55         // Initialise the control signals for static memories\r
56 #if (USE_EXT_STATIC_MEM == YES)\r
57 \r
58     // Initialise the control signals for static memories\r
59     EMC_Config_Static();\r
60 \r
61 //    #if (USE_EXT_DYNAMIC_MEM == NO)\r
62 //      LPC_EMC->CONTROL = 0x00000001;   // Enable the external memory controller       \r
63 //        LPC_EMC->CONFIG = 0;  \r
64 //        // Buffers for the static memories are enabled as well. If there is SDRAM as well,\r
65 //        // then this is done after the initialisation for the dynamic memory interface.\r
66 //      LPC_EMC->STATICCONFIG0 = 0x00080081;    \r
67 //    #endif\r
68 \r
69 #endif\r
70 \r
71 #if (USE_EXT_DYNAMIC_MEM == YES)\r
72 \r
73         // The setup for dynamic memories (SDRAM)\r
74     EMC_Init_SRDRAM(SDRAM_BASE, PART_WIDTH, PART_SIZE, EXT_WIDTH, COL_ADDR_BITS);\r
75 \r
76 #elif (USE_EXT_DYNAMIC_MEM == NO)\r
77 \r
78     LPC_EMC->CONTROL = 0x00000001;   // Enable the external memory controller   \r
79         LPC_EMC->CONFIG = 0;    \r
80 \r
81 #endif\r
82           \r
83         // Buffers for the static memories can now be enabled as well. In a system with static and dynamic memory\r
84         // this should only been done after the SDRAM initialisation --> here\r
85         LPC_EMC->STATICCONFIG0 = 0x00080081;\r
86 \r
87 }\r
88 \r
89 \r
90 /****************************************************************************************\r
91 * Set up the address/data pins for external memory interface in LP43xx\r
92 *\r
93 * Modify this function in case not all of the address/data pins are needed.\r
94 ****************************************************************************************/\r
95 void EMC_Config_Pinmux(void)\r
96 {\r
97         \r
98   // Disable the external memory controller before changing pin control configuration\r
99   LPC_EMC->CONTROL = 0x00000000;\r
100 \r
101 // EMC_OUT         (PUP_CLEAR | SLEWRATE_FAST | FILTER_DISABLE) \r
102 // EMC_IO          (PUP_CLEAR | SLEWRATE_FAST | INBUF_ENABLE | FILTER_DISABLE)\r
103 \r
104   // Data line configuration\r
105   scu_pinmux(0x1,  7, EMC_IO, FUNC3);  // P1_7:   D0\r
106   scu_pinmux(0x1,  8, EMC_IO, FUNC3);  // P1_8:   D1\r
107   scu_pinmux(0x1,  9, EMC_IO, FUNC3);  // P1_9:   D2\r
108   scu_pinmux(0x1, 10, EMC_IO, FUNC3);  // P1_10:  D3\r
109   scu_pinmux(0x1, 11, EMC_IO, FUNC3);  // P1_11:  D4\r
110   scu_pinmux(0x1, 12, EMC_IO, FUNC3);  // P1_12:  D5\r
111   scu_pinmux(0x1, 13, EMC_IO, FUNC3);  // P1_13:  D6\r
112   scu_pinmux(0x1, 14, EMC_IO, FUNC3);  // P1_14:  D7\r
113   scu_pinmux(0x5,  4, EMC_IO, FUNC2);  // P5_4:   D8\r
114   scu_pinmux(0x5,  5, EMC_IO, FUNC2);  // P5_5:   D9\r
115   scu_pinmux(0x5,  6, EMC_IO, FUNC2);  // P5_6:   D10\r
116   scu_pinmux(0x5,  7, EMC_IO, FUNC2);  // P5_7:  D11\r
117   scu_pinmux(0x5,  0, EMC_IO, FUNC2);  // P5_0:  D12\r
118   scu_pinmux(0x5,  1, EMC_IO, FUNC2);  // P5_1:  D13\r
119   scu_pinmux(0x5,  2, EMC_IO, FUNC2);  // P5_2:  D14\r
120   scu_pinmux(0x5,  3, EMC_IO, FUNC2);  // P5_3:  D15\r
121   scu_pinmux(0xD,  2, EMC_IO, FUNC2);  // PD_2:  D16\r
122   scu_pinmux(0xD,  3, EMC_IO, FUNC2);  // PD_3:  D17\r
123   scu_pinmux(0xD,  4, EMC_IO, FUNC2);  // PD_4:  D18\r
124   scu_pinmux(0xD,  5, EMC_IO, FUNC2);  // PD_5:  D19\r
125   scu_pinmux(0xD,  6, EMC_IO, FUNC2);  // PD_6:  D20\r
126   scu_pinmux(0xD,  7, EMC_IO, FUNC2);  // PD_7:  D21\r
127   scu_pinmux(0xD,  8, EMC_IO, FUNC2);  // PD_8:  D22\r
128   scu_pinmux(0xD,  9, EMC_IO, FUNC2);  // PD_9:  D23\r
129   scu_pinmux(0xE,  5, EMC_IO, FUNC3);  // PE_5:  D24\r
130   scu_pinmux(0xE,  6, EMC_IO, FUNC3);  // PE_6:  D25\r
131   scu_pinmux(0xE,  7, EMC_IO, FUNC3);  // PE_7:  D26\r
132   scu_pinmux(0xE,  8, EMC_IO, FUNC3);  // PE_8:  D27\r
133   scu_pinmux(0xE,  9, EMC_IO, FUNC3);  // PE_9:  D28\r
134   scu_pinmux(0xE, 10, EMC_IO, FUNC3);  // PE_10: D29\r
135   scu_pinmux(0xE, 11, EMC_IO, FUNC3);  // PE_11: D30\r
136   scu_pinmux(0xE, 12, EMC_IO, FUNC3);  // PE_12: D31\r
137 \r
138   // Address line configuration\r
139   scu_pinmux(0x2,  9, EMC_IO, FUNC3);  // P2_9: A0\r
140   scu_pinmux(0x2, 10, EMC_IO, FUNC3);  // P2_10: A1\r
141   scu_pinmux(0x2, 11, EMC_IO, FUNC3);  // P2_11: A2\r
142   scu_pinmux(0x2, 12, EMC_IO, FUNC3);  // P2_12: A3\r
143   scu_pinmux(0x2, 13, EMC_IO, FUNC3);  // P2_13: A4\r
144   scu_pinmux(0x1,  0, EMC_IO, FUNC2);  // P1_0: A5\r
145   scu_pinmux(0x1,  1, EMC_IO, FUNC2);  // P1_1: A6\r
146   scu_pinmux(0x1,  2, EMC_IO, FUNC2);  // P1_2: A7\r
147   scu_pinmux(0x2,  8, EMC_IO, FUNC3);  // P2_8: A8\r
148   scu_pinmux(0x2,  7, EMC_IO, FUNC3);  // P2_7: A9\r
149   scu_pinmux(0x2,  6, EMC_IO, FUNC2);  // P2_6: A10\r
150   scu_pinmux(0x2,  2, EMC_IO, FUNC2);  // P2_2: A11\r
151   scu_pinmux(0x2,  1, EMC_IO, FUNC2);  // P2_0: A12\r
152   scu_pinmux(0x2,  0, EMC_IO, FUNC2);  // P2_0: A13\r
153   scu_pinmux(0x6,  8, EMC_IO, FUNC1);  // P6_8: A14\r
154   scu_pinmux(0x6,  7, EMC_IO, FUNC1);  // P6_7: A15\r
155   scu_pinmux(0xD, 16, EMC_IO, FUNC2);  // PD_16: A16\r
156   scu_pinmux(0xD, 15, EMC_IO, FUNC2);  // PD_15: A17\r
157   scu_pinmux(0xE,  0, EMC_IO, FUNC3);  // PE_0: A18\r
158   scu_pinmux(0xE,  1, EMC_IO, FUNC3);  // PE_1: A19\r
159   scu_pinmux(0xE,  2, EMC_IO, FUNC3);  // PE_2: A20\r
160   scu_pinmux(0xE,  3, EMC_IO, FUNC3);  // PE_3: A21\r
161   scu_pinmux(0xE,  4, EMC_IO, FUNC3);  // PE_4: A22\r
162 \r
163   // Control signals for static memory\r
164   scu_pinmux(0x1,  6, EMC_IO, FUNC3);  // P1_6: WE\r
165   scu_pinmux(0x1,  5, EMC_IO, FUNC3);  // P1_5: CS0\r
166   scu_pinmux(0x1,  3, EMC_IO, FUNC3);  // P1_6: OE\r
167   scu_pinmux(0x1,  4, EMC_IO, FUNC3);  // P1_5: BLS0\r
168   scu_pinmux(0x6,  6, EMC_IO, FUNC1);  // P1_6: BLS1\r
169   scu_pinmux(0xD, 12, EMC_IO, FUNC2);  // PD_12: CS2\r
170 \r
171   #if (USE_EXT_DYNAMIC_MEM == YES)\r
172     // Control signals for dynamic memory\r
173     scu_pinmux(0x6,  9, EMC_IO, FUNC3);  // P6_9: DYCS0\r
174     scu_pinmux(0x6,  4, EMC_IO, FUNC3);  // P6_4: CAS\r
175     scu_pinmux(0x6,  5, EMC_IO, FUNC3);  // P6_5: RAS\r
176     scu_pinmux(0x6, 11, EMC_IO, FUNC3);  // P6_11: CKEOUT0\r
177     scu_pinmux(0x6, 12, EMC_IO, FUNC3);  // P6_12: DQMOUT0\r
178     scu_pinmux(0x6, 10, EMC_IO, FUNC3);  // P6_10: DQMOUT1\r
179 \r
180     LPC_SCU_CLK(0) = 0 + EMC_IO;   // EMC_CLK0 signal on pin CLK0 (needed for SDRAM)\r
181     LPC_SCU_CLK(1) = 0 + EMC_IO;\r
182     LPC_SCU_CLK(2) = 0 + EMC_IO;\r
183     LPC_SCU_CLK(3) = 0 + EMC_IO;\r
184   #endif\r
185 \r
186 }\r
187 \r
188 \r
189 /****************************************************************************************\r
190 * Configure CS0 for 70ns 16-bit flash memory on the Hitex board\r
191 * Configure CS2 for 55ns 16-bit SRAM on the Hitex board\r
192 *\r
193 ****************************************************************************************/\r
194 void EMC_Config_Static(void)\r
195 {\r
196 \r
197   // Configure CS0 for flash memory\r
198   // @120MHz there should be 8 or 9 waitstates for the 70ns flash, apparently it works with 7\r
199   LPC_EMC->STATICCONFIG0 = 0x00000081;      // CS0: 16 bit = WE\r
200   LPC_EMC->STATICWAITOEN0 = 0;              // CS0: WAITOEN = 0\r
201 \r
202   #if (PLATFORM == HITEX_A2_BOARD)\r
203 \r
204     LPC_EMC->STATICWAITRD0 = 7;             // CS0: WAITRD = 7 \r
205 \r
206     // The Hitex board has external SRAM on CS2\r
207     // @120MHz there should be 7 waitstates for the 55ns SRAM, it should work with 6\r
208     LPC_EMC->STATICCONFIG0 = 0x00000081;     // CS2: 16 bit = WE\r
209     LPC_EMC->STATICWAITOEN2 = 0;             // CS2: WAITOEN = 0\r
210     LPC_EMC->STATICWAITRD2 = 7;              // CS2: WAITRD = 6\r
211 \r
212   #elif (PLATFORM == NXP_VALIDATION_BOARD)\r
213 \r
214         LPC_EMC->STATICWAITRD0 = check 9;             // CS0: WAITRD = 8 \r
215         // to be added\r
216 \r
217     LPC_EMC->STATICCONFIG0 = check 0x00000081;     // CS2: 16 bit = WE\r
218     LPC_EMC->STATICWAITOEN2 = check 0;             // CS2: WAITOEN = 0\r
219     LPC_EMC->STATICWAITRD2 = check 7;              // CS2: WAITRD = 6\r
220 \r
221   #endif\r
222         \r
223 }\r
224 \r
225 \r
226 // Defines for EMC signal delay settings\r
227 #define EMC_B_ENABLE                    (1 << 19)\r
228 #define EMC_ENABLE                      (1 << 0)\r
229 #define EMC_CE_ENABLE                   (1 << 0)\r
230 #define EMC_CS_ENABLE                   (1 << 1)\r
231 #define EMC_CLOCK_DELAYED_STRATEGY      (0 << 0)\r
232 #define EMC_COMMAND_DELAYED_STRATEGY    (1 << 0)\r
233 #define EMC_COMMAND_DELAYED_STRATEGY2   (2 << 0)\r
234 #define EMC_COMMAND_DELAYED_STRATEGY3   (3 << 0)\r
235 #define EMC_INIT(i)                     ((i) << 7)\r
236 #define EMC_NORMAL                      (0)\r
237 #define EMC_MODE                        (1)\r
238 #define EMC_PRECHARGE_ALL               (2)\r
239 #define EMC_NOP                         (3)\r
240 \r
241 /****************************************************************************************\r
242 * Configure the delays for the SDRAM\r
243 *\r
244 * - on the Hitex board (IS42S16400D-7TL)\r
245 * - on the NXP evaluation board (MT48LC4M32B2)\r
246 * - on the NXP validation board (MT48LC4M32B2)\r
247 *\r
248 ****************************************************************************************/\r
249 #if (PLATFORM == HITEX_A2_BOARD) || (PLATFORM == NXP_VALIDATION_BOARD)\r
250 \r
251 // Defines for SDRAM devices\r
252 #define DOUT_DELAY      0\r
253 #define CLK0_DELAY      5\r
254 #define CLKE0_DELAY     5\r
255 #define RAS_DELAY       0\r
256 #define CAS_DELAY       0\r
257 #define WE_DELAY        0\r
258 #define DYCS0_DELAY     0\r
259 #define DQM0_DELAY      0\r
260 #define FBCLK0_DELAY    0\r
261 #define CCLK_DELAY      0\r
262 #define ADDR_DELAY      0\r
263 #define DIN_DELAY       0\r
264 #define DEN_DELAY       0\r
265 \r
266 #endif\r
267 \r
268 void initEmiDelays(void)\r
269 {\r
270     // eventually configure delays, defaults are zero\r
271 \r
272     // CLK & CLKE0 delay\r
273     *(uint32_t*)(LPC_SCU_BASE + 0xD00) = ((CLK0_DELAY << 16) | (CLKE0_DELAY << 0) );\r
274 \r
275     // EMCCTRLDELAY, address 0x4008 6D04\r
276     *(uint32_t*)(LPC_SCU_BASE + 0xD04) = ((WE_DELAY << 12)| (CAS_DELAY << 4) | (RAS_DELAY << 0) );\r
277 \r
278     // DYCS0_DELAY, address 0x4008 6D08\r
279     *(uint32_t*)(LPC_SCU_BASE + 0xD08) = ((DYCS0_DELAY << 0));\r
280 \r
281     // data out delay for D0 to D31   EMCDOUTDELAY\r
282     *(uint32_t*)(LPC_SCU_BASE + 0xD0C) = ((DOUT_DELAY << 28) | (DOUT_DELAY << 24) | (DOUT_DELAY << 20) | (DOUT_DELAY << 16)|(DQM0_DELAY << 12) | (DQM0_DELAY << 8) | (DQM0_DELAY << 4) | (DQM0_DELAY << 0)) ;\r
283 \r
284     // EMCFBCLKDELAY, address 0x4008 6D10\r
285     *(uint32_t*)(LPC_SCU_BASE + 0xD10) = ((CCLK_DELAY << 16)|(FBCLK0_DELAY << 12) | (FBCLK0_DELAY << 8) | (FBCLK0_DELAY << 4) | (FBCLK0_DELAY << 0)) ;\r
286 \r
287     // EMCADDRDELAY, address 0x4008 6D14, 0x4008 6D18, 0x4008 6D1C)\r
288     *(uint32_t*)(LPC_SCU_BASE + 0xD14) = ((ADDR_DELAY << 28)|(ADDR_DELAY << 24)|(ADDR_DELAY << 20)|(ADDR_DELAY << 16)|(ADDR_DELAY << 12) | (ADDR_DELAY << 8) | (ADDR_DELAY << 4) | (ADDR_DELAY << 0)) ;\r
289     *(uint32_t*)(LPC_SCU_BASE + 0xD18) = ((ADDR_DELAY << 28)|(ADDR_DELAY << 24)|(ADDR_DELAY << 20)|(ADDR_DELAY << 16)|(ADDR_DELAY << 12) | (ADDR_DELAY << 8) | (ADDR_DELAY << 4) | (ADDR_DELAY << 0)) ;\r
290     *(uint32_t*)(LPC_SCU_BASE + 0xD1C) = ((ADDR_DELAY << 28)|(ADDR_DELAY << 24)|(ADDR_DELAY << 20)|(ADDR_DELAY << 16)|(ADDR_DELAY << 12) | (ADDR_DELAY << 8) | (ADDR_DELAY << 4) | (ADDR_DELAY << 0)) ;\r
291 \r
292     // data in delay for D0 to D31   EMCDINDELAY\r
293     *(uint32_t*)(LPC_SCU_BASE + 0xD24) = ((DEN_DELAY << 28)|(DEN_DELAY << 24)|(DEN_DELAY << 20)|(DEN_DELAY << 16)|(DIN_DELAY << 12)|(DIN_DELAY << 8)|(DIN_DELAY << 4)|(DIN_DELAY << 0));\r
294 }\r
295 \r
296 \r
297 \r
298 \r
299 /****************************************************************************************\r
300 * Configure the EMI for the SDRAM\r
301 *\r
302 * - on the Hitex board (IS42S16400D-7TL)\r
303 * - on the NXP validation board (MT48LC4M32B2)\r
304 *\r
305 ****************************************************************************************/\r
306 void EMC_Init_SRDRAM(uint32_t u32BaseAddr, uint32_t u32Width, uint32_t u32Size, uint32_t u32DataBus, uint32_t u32ColAddrBits)\r
307 {\r
308 \r
309         // calculate a 1 usec delay base        \r
310         delayBase1us = M4Frequency / DELAY_1usFreq;\r
311 \r
312         // eventually adjust the CCU delays for EMI (default to zero)\r
313         initEmiDelays();\r
314 \r
315         // Initialize EMC to interface with SDRAM. The EMC needs to run for this.\r
316         LPC_EMC->CONTROL                = 0x00000001;   // (Re-)enable the external memory controller   \r
317         LPC_EMC->CONFIG                 = 0;\r
318 \r
319 #if (PLATFORM == HITEX_A2_BOARD)\r
320 \r
321         LPC_EMC->DYNAMICCONFIG0         = ((u32Width << 7) | (u32Size << 9) | (u32DataBus << 14)); // Selects the configuration information for dynamic memory chip select 0.\r
322         LPC_EMC->DYNAMICRASCAS0         = (2UL << 0) | (2UL << 8); // Selects the RAS and CAS latencies for dynamic memory chip select 0.       \r
323         LPC_EMC->DYNAMICREADCONFIG      = EMC_COMMAND_DELAYED_STRATEGY;  // Configures the dynamic memory read strategy.\r
324         LPC_EMC->DYNAMICRP              = 1; // Selects the precharge command period\r
325         LPC_EMC->DYNAMICRAS             = 3; // Selects the active to precharge command period\r
326         LPC_EMC->DYNAMICSREX            = 5; // Selects the self-refresh exit time\r
327         LPC_EMC->DYNAMICAPR             = 0; // Selects the last-data-out to active command time\r
328         LPC_EMC->DYNAMICDAL             = 4; // Selects the data-in to active command time.\r
329         LPC_EMC->DYNAMICWR              = 1; // Selects the write recovery time\r
330         LPC_EMC->DYNAMICRC              = 5; // Selects the active to active command period\r
331         LPC_EMC->DYNAMICRFC             = 5; // Selects the auto-refresh period\r
332         LPC_EMC->DYNAMICXSR             = 5; // Selects the exit self-refresh to active command time\r
333         LPC_EMC->DYNAMICRRD             = 0; // Selects the active bank A to active bank B latency\r
334         LPC_EMC->DYNAMICMRD             = 0; // Selects the load mode register to active command time\r
335         \r
336         LPC_EMC->DYNAMICCONTROL         = EMC_CE_ENABLE | EMC_CS_ENABLE | EMC_INIT(EMC_NOP);\r
337         vDelay(100);\r
338         \r
339         LPC_EMC->DYNAMICCONTROL         = EMC_CE_ENABLE | EMC_CS_ENABLE | EMC_INIT(EMC_PRECHARGE_ALL);\r
340 \r
341         LPC_EMC->DYNAMICREFRESH         = 2; // Configures dynamic memory refresh operation\r
342         vDelay(100);\r
343         \r
344         LPC_EMC->DYNAMICREFRESH         = 83; // Configures dynamic memory refresh operation\r
345         \r
346         LPC_EMC->DYNAMICCONTROL         = EMC_CE_ENABLE | EMC_CS_ENABLE | EMC_INIT(EMC_MODE);\r
347         \r
348         // Write configuration data to SDRAM device\r
349         if(u32DataBus == 0)   // 16-bit data bus, the EMC enforces a burst size 8\r
350         {\r
351                 *((volatile uint32_t *)(u32BaseAddr | ((3UL | (2UL << 4)) << (u32ColAddrBits + 2 + 1))));\r
352         }\r
353         else   // burst size 4 (which is not an option for 16-bit data bus anyway)\r
354         {\r
355                 *((volatile uint32_t *)(u32BaseAddr | ((2UL | (2UL << 4)) << (u32ColAddrBits + 2 + 2))));\r
356         }\r
357 #endif   // HITEX_BOARD\r
358 \r
359 \r
360 #if (PLATFORM == NXP_VALIDATION_BOARD)  \r
361 \r
362         LPC_EMC->DYNAMICCONFIG0         = ((u32Width << 7) | (u32Size << 9) | (u32DataBus << 14));\r
363         LPC_EMC->DYNAMICRASCAS0         = (2UL << 0) | (2UL << 8);      \r
364         LPC_EMC->DYNAMICREADCONFIG      = EMC_COMMAND_DELAYED_STRATEGY; \r
365         LPC_EMC->DYNAMICRP              = 1;    // calculated from xls sheet\r
366         LPC_EMC->DYNAMICRAS             = 2;\r
367         LPC_EMC->DYNAMICSREX            = 5;\r
368         LPC_EMC->DYNAMICAPR             = 0;\r
369         LPC_EMC->DYNAMICDAL             = 4;\r
370         LPC_EMC->DYNAMICWR              = 1;\r
371         LPC_EMC->DYNAMICRC              = 5;\r
372         LPC_EMC->DYNAMICRFC             = 5;\r
373         LPC_EMC->DYNAMICXSR             = 5;\r
374         LPC_EMC->DYNAMICRRD             = 0;\r
375         LPC_EMC->DYNAMICMRD             = 0;\r
376         \r
377         LPC_EMC->DYNAMICCONTROL         = EMC_CE_ENABLE | EMC_CS_ENABLE | EMC_INIT(EMC_NOP);\r
378         vDelay(100);\r
379         \r
380         LPC_EMC->DYNAMICCONTROL         = EMC_CE_ENABLE | EMC_CS_ENABLE | EMC_INIT(EMC_PRECHARGE_ALL);\r
381 \r
382         LPC_EMC->DYNAMICREFRESH         = 2;\r
383         vDelay(100);\r
384         \r
385         LPC_EMC->DYNAMICREFRESH         = 83;\r
386         \r
387         LPC_EMC->DYNAMICCONTROL         = EMC_CE_ENABLE | EMC_CS_ENABLE | EMC_INIT(EMC_MODE);\r
388         \r
389         // Write configuration data to SDRAM device\r
390         if(u32DataBus == 0)   // burst size 8\r
391         {\r
392                 *((volatile uint32_t *)(u32BaseAddr | ((3UL | (2UL << 4)) << (u32ColAddrBits + 2 + 1))));\r
393         }\r
394         else   // burst size 4\r
395         {\r
396                 *((volatile uint32_t *)(u32BaseAddr | ((2UL | (2UL << 4)) << (u32ColAddrBits + 2 + 2))));\r
397         }\r
398 #endif   // Validation board\r
399 \r
400         LPC_EMC->DYNAMICCONTROL   = 0;\r
401         LPC_EMC->DYNAMICCONFIG0 |= EMC_B_ENABLE;        // Enable the buffers\r
402 \r
403 }\r
404 \r
405 \r
406 /**********************************************************************\r
407  ** Function name:\r
408  **\r
409  ** Description:\r
410  **\r
411  ** Parameters:\r
412  **\r
413  ** Returned value:\r
414  **********************************************************************/\r
415 static void vDelay(uint32_t u32Delay)\r
416 {\r
417         volatile uint32_t i;\r
418         \r
419         for(i = 0; i < (u32Delay * delayBase1us); i++);\r
420 }\r
421 \r