Subdirectory provided by Embedded Artists
Dependencies: DM_FATFileSystem DM_HttpServer DM_USBHost EthernetInterface USBDevice mbed-rpc mbed-rtos mbed-src
Dependents: lpc4088_displaymodule_hello_world_Sept_2018
Fork of DMSupport by
Memory/sdram.cpp@10:1ac4b213f0f7, 2014-12-19 (annotated)
- Committer:
- embeddedartists
- Date:
- Fri Dec 19 09:03:25 2014 +0100
- Revision:
- 10:1ac4b213f0f7
- Parent:
- 9:a33326afd686
- Child:
- 30:a97015441bb4
- Added support for executing code in SDRAM.
- Restructured the Display/Touch interfaces.
- Added loading of Display/Touch BIOS.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
embeddedartists | 0:6b68dac0d986 | 1 | /* |
embeddedartists | 9:a33326afd686 | 2 | * Copyright 2014 Embedded Artists AB |
embeddedartists | 0:6b68dac0d986 | 3 | * |
embeddedartists | 0:6b68dac0d986 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
embeddedartists | 0:6b68dac0d986 | 5 | * you may not use this file except in compliance with the License. |
embeddedartists | 0:6b68dac0d986 | 6 | * You may obtain a copy of the License at |
embeddedartists | 0:6b68dac0d986 | 7 | * |
embeddedartists | 0:6b68dac0d986 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
embeddedartists | 0:6b68dac0d986 | 9 | * |
embeddedartists | 0:6b68dac0d986 | 10 | * Unless required by applicable law or agreed to in writing, software |
embeddedartists | 0:6b68dac0d986 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
embeddedartists | 0:6b68dac0d986 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
embeddedartists | 0:6b68dac0d986 | 13 | * See the License for the specific language governing permissions and |
embeddedartists | 0:6b68dac0d986 | 14 | * limitations under the License. |
embeddedartists | 0:6b68dac0d986 | 15 | */ |
embeddedartists | 0:6b68dac0d986 | 16 | |
embeddedartists | 0:6b68dac0d986 | 17 | |
embeddedartists | 0:6b68dac0d986 | 18 | /****************************************************************************** |
embeddedartists | 0:6b68dac0d986 | 19 | * Includes |
embeddedartists | 0:6b68dac0d986 | 20 | *****************************************************************************/ |
embeddedartists | 0:6b68dac0d986 | 21 | |
embeddedartists | 0:6b68dac0d986 | 22 | #include "mbed.h" |
embeddedartists | 0:6b68dac0d986 | 23 | #include "sdram.h" |
embeddedartists | 0:6b68dac0d986 | 24 | |
embeddedartists | 0:6b68dac0d986 | 25 | #if defined(TOOLCHAIN_ARM) /* KEIL uVision and mbed online compiler */ |
embeddedartists | 0:6b68dac0d986 | 26 | #include "sys_helper.h" |
embeddedartists | 0:6b68dac0d986 | 27 | #endif |
embeddedartists | 0:6b68dac0d986 | 28 | |
embeddedartists | 0:6b68dac0d986 | 29 | /****************************************************************************** |
embeddedartists | 0:6b68dac0d986 | 30 | * Defines and typedefs |
embeddedartists | 0:6b68dac0d986 | 31 | *****************************************************************************/ |
embeddedartists | 0:6b68dac0d986 | 32 | |
embeddedartists | 0:6b68dac0d986 | 33 | |
embeddedartists | 0:6b68dac0d986 | 34 | /****************************************************************************** |
embeddedartists | 0:6b68dac0d986 | 35 | * External global variables |
embeddedartists | 0:6b68dac0d986 | 36 | *****************************************************************************/ |
embeddedartists | 0:6b68dac0d986 | 37 | |
embeddedartists | 0:6b68dac0d986 | 38 | /****************************************************************************** |
embeddedartists | 0:6b68dac0d986 | 39 | * Local variables |
embeddedartists | 0:6b68dac0d986 | 40 | *****************************************************************************/ |
embeddedartists | 0:6b68dac0d986 | 41 | |
embeddedartists | 0:6b68dac0d986 | 42 | static volatile uint32_t ringosccount[2] = {0,0}; |
embeddedartists | 0:6b68dac0d986 | 43 | |
embeddedartists | 0:6b68dac0d986 | 44 | static bool okToUseSdramForHeap = true; |
embeddedartists | 0:6b68dac0d986 | 45 | static bool initialized = false; |
embeddedartists | 0:6b68dac0d986 | 46 | |
embeddedartists | 0:6b68dac0d986 | 47 | /****************************************************************************** |
embeddedartists | 0:6b68dac0d986 | 48 | * Overridden Global Functions |
embeddedartists | 0:6b68dac0d986 | 49 | *****************************************************************************/ |
embeddedartists | 0:6b68dac0d986 | 50 | |
embeddedartists | 0:6b68dac0d986 | 51 | #if defined(TOOLCHAIN_ARM) /* KEIL uVision and mbed online compiler */ |
embeddedartists | 0:6b68dac0d986 | 52 | //http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0349c/Cihehbce.html |
embeddedartists | 0:6b68dac0d986 | 53 | |
embeddedartists | 0:6b68dac0d986 | 54 | extern "C" unsigned __rt_heap_extend(unsigned size, void **block) { |
embeddedartists | 0:6b68dac0d986 | 55 | static uint32_t lastReturnedBlock = 0; |
embeddedartists | 0:6b68dac0d986 | 56 | |
embeddedartists | 0:6b68dac0d986 | 57 | if (okToUseSdramForHeap && !initialized) { |
embeddedartists | 0:6b68dac0d986 | 58 | sdram_init(); |
embeddedartists | 0:6b68dac0d986 | 59 | } |
embeddedartists | 0:6b68dac0d986 | 60 | |
embeddedartists | 0:6b68dac0d986 | 61 | // Make sure that SDRAM is only returned once (as all of it is returned |
embeddedartists | 0:6b68dac0d986 | 62 | // the first time) and only if the user has chosen to do it (via the |
embeddedartists | 0:6b68dac0d986 | 63 | // okToUseSdramForHeap variable. |
embeddedartists | 0:6b68dac0d986 | 64 | if (okToUseSdramForHeap && lastReturnedBlock==0) { |
embeddedartists | 0:6b68dac0d986 | 65 | *block = (void*)SDRAM_BASE; |
embeddedartists | 0:6b68dac0d986 | 66 | lastReturnedBlock = SDRAM_BASE; |
embeddedartists | 0:6b68dac0d986 | 67 | return SDRAM_SIZE; |
embeddedartists | 0:6b68dac0d986 | 68 | } |
embeddedartists | 0:6b68dac0d986 | 69 | return 0; |
embeddedartists | 0:6b68dac0d986 | 70 | } |
embeddedartists | 0:6b68dac0d986 | 71 | |
embeddedartists | 0:6b68dac0d986 | 72 | // Overrides the WEAK function in sys_helper.cpp to allow reserving a specific |
embeddedartists | 0:6b68dac0d986 | 73 | // amount of memory for the stack. Without this function it is possible to allocate |
embeddedartists | 0:6b68dac0d986 | 74 | // so much of the internal RAM that there is no free memory for the stack which |
embeddedartists | 0:6b68dac0d986 | 75 | // in turn causes the program to crash. |
embeddedartists | 0:6b68dac0d986 | 76 | uint32_t __reserved_stack_size() { |
embeddedartists | 0:6b68dac0d986 | 77 | return 0x3000; // Reserve 0x3000 bytes of the IRAM for the stack |
embeddedartists | 0:6b68dac0d986 | 78 | } |
embeddedartists | 0:6b68dac0d986 | 79 | |
embeddedartists | 0:6b68dac0d986 | 80 | #elif defined(TOOLCHAIN_GCC_CR) /* CodeRed's RedSuite or LPCXpresso IDE */ |
embeddedartists | 0:6b68dac0d986 | 81 | |
embeddedartists | 0:6b68dac0d986 | 82 | // NOTE: This way of overriding the implementation of malloc in NEWLIB |
embeddedartists | 0:6b68dac0d986 | 83 | // will prevent the internal RAM from being used by malloc as |
embeddedartists | 0:6b68dac0d986 | 84 | // it only exposes the SDRAM. |
embeddedartists | 0:6b68dac0d986 | 85 | |
embeddedartists | 0:6b68dac0d986 | 86 | // Dynamic memory allocation related syscall. |
embeddedartists | 0:6b68dac0d986 | 87 | extern "C" caddr_t _sbrk(int incr) { |
embeddedartists | 0:6b68dac0d986 | 88 | static unsigned char* heap = (unsigned char*)SDRAM_BASE; |
embeddedartists | 0:6b68dac0d986 | 89 | unsigned char* prev_heap = heap; |
embeddedartists | 0:6b68dac0d986 | 90 | unsigned char* new_heap = heap + incr; |
embeddedartists | 0:6b68dac0d986 | 91 | |
embeddedartists | 0:6b68dac0d986 | 92 | if (okToUseSdramForHeap && !initialized) { |
embeddedartists | 0:6b68dac0d986 | 93 | sdram_init(); |
embeddedartists | 0:6b68dac0d986 | 94 | } |
embeddedartists | 0:6b68dac0d986 | 95 | if (!okToUseSdramForHeap) { |
embeddedartists | 0:6b68dac0d986 | 96 | //errno = ENOMEM; |
embeddedartists | 0:6b68dac0d986 | 97 | return (caddr_t)-1; |
embeddedartists | 0:6b68dac0d986 | 98 | } |
embeddedartists | 0:6b68dac0d986 | 99 | if (new_heap >= (unsigned char*)(SDRAM_BASE + SDRAM_SIZE)) { |
embeddedartists | 0:6b68dac0d986 | 100 | //errno = ENOMEM; |
embeddedartists | 0:6b68dac0d986 | 101 | return (caddr_t)-1; |
embeddedartists | 0:6b68dac0d986 | 102 | } |
embeddedartists | 0:6b68dac0d986 | 103 | |
embeddedartists | 0:6b68dac0d986 | 104 | heap = new_heap; |
embeddedartists | 0:6b68dac0d986 | 105 | return (caddr_t) prev_heap; |
embeddedartists | 0:6b68dac0d986 | 106 | } |
embeddedartists | 0:6b68dac0d986 | 107 | #endif |
embeddedartists | 0:6b68dac0d986 | 108 | |
embeddedartists | 0:6b68dac0d986 | 109 | /****************************************************************************** |
embeddedartists | 0:6b68dac0d986 | 110 | * Local Functions |
embeddedartists | 0:6b68dac0d986 | 111 | *****************************************************************************/ |
embeddedartists | 0:6b68dac0d986 | 112 | |
embeddedartists | 0:6b68dac0d986 | 113 | static void pinConfig(void) |
embeddedartists | 0:6b68dac0d986 | 114 | { |
embeddedartists | 0:6b68dac0d986 | 115 | LPC_IOCON->P3_0 |= 1; /* D0 @ P3.0 */ |
embeddedartists | 0:6b68dac0d986 | 116 | LPC_IOCON->P3_1 |= 1; /* D1 @ P3.1 */ |
embeddedartists | 0:6b68dac0d986 | 117 | LPC_IOCON->P3_2 |= 1; /* D2 @ P3.2 */ |
embeddedartists | 0:6b68dac0d986 | 118 | LPC_IOCON->P3_3 |= 1; /* D3 @ P3.3 */ |
embeddedartists | 0:6b68dac0d986 | 119 | |
embeddedartists | 0:6b68dac0d986 | 120 | LPC_IOCON->P3_4 |= 1; /* D4 @ P3.4 */ |
embeddedartists | 0:6b68dac0d986 | 121 | LPC_IOCON->P3_5 |= 1; /* D5 @ P3.5 */ |
embeddedartists | 0:6b68dac0d986 | 122 | LPC_IOCON->P3_6 |= 1; /* D6 @ P3.6 */ |
embeddedartists | 0:6b68dac0d986 | 123 | LPC_IOCON->P3_7 |= 1; /* D7 @ P3.7 */ |
embeddedartists | 0:6b68dac0d986 | 124 | |
embeddedartists | 0:6b68dac0d986 | 125 | LPC_IOCON->P3_8 |= 1; /* D8 @ P3.8 */ |
embeddedartists | 0:6b68dac0d986 | 126 | LPC_IOCON->P3_9 |= 1; /* D9 @ P3.9 */ |
embeddedartists | 0:6b68dac0d986 | 127 | LPC_IOCON->P3_10 |= 1; /* D10 @ P3.10 */ |
embeddedartists | 0:6b68dac0d986 | 128 | LPC_IOCON->P3_11 |= 1; /* D11 @ P3.11 */ |
embeddedartists | 0:6b68dac0d986 | 129 | |
embeddedartists | 0:6b68dac0d986 | 130 | LPC_IOCON->P3_12 |= 1; /* D12 @ P3.12 */ |
embeddedartists | 0:6b68dac0d986 | 131 | LPC_IOCON->P3_13 |= 1; /* D13 @ P3.13 */ |
embeddedartists | 0:6b68dac0d986 | 132 | LPC_IOCON->P3_14 |= 1; /* D14 @ P3.14 */ |
embeddedartists | 0:6b68dac0d986 | 133 | LPC_IOCON->P3_15 |= 1; /* D15 @ P3.15 */ |
embeddedartists | 0:6b68dac0d986 | 134 | |
embeddedartists | 0:6b68dac0d986 | 135 | LPC_IOCON->P3_16 |= 1; /* D16 @ P3.16 */ |
embeddedartists | 0:6b68dac0d986 | 136 | LPC_IOCON->P3_17 |= 1; /* D17 @ P3.17 */ |
embeddedartists | 0:6b68dac0d986 | 137 | LPC_IOCON->P3_18 |= 1; /* D18 @ P3.18 */ |
embeddedartists | 0:6b68dac0d986 | 138 | LPC_IOCON->P3_19 |= 1; /* D19 @ P3.19 */ |
embeddedartists | 0:6b68dac0d986 | 139 | |
embeddedartists | 0:6b68dac0d986 | 140 | LPC_IOCON->P3_20 |= 1; /* D20 @ P3.20 */ |
embeddedartists | 0:6b68dac0d986 | 141 | LPC_IOCON->P3_21 |= 1; /* D21 @ P3.21 */ |
embeddedartists | 0:6b68dac0d986 | 142 | LPC_IOCON->P3_22 |= 1; /* D22 @ P3.22 */ |
embeddedartists | 0:6b68dac0d986 | 143 | LPC_IOCON->P3_23 |= 1; /* D23 @ P3.23 */ |
embeddedartists | 0:6b68dac0d986 | 144 | |
embeddedartists | 0:6b68dac0d986 | 145 | LPC_IOCON->P3_24 |= 1; /* D24 @ P3.24 */ |
embeddedartists | 0:6b68dac0d986 | 146 | LPC_IOCON->P3_25 |= 1; /* D25 @ P3.25 */ |
embeddedartists | 0:6b68dac0d986 | 147 | LPC_IOCON->P3_26 |= 1; /* D26 @ P3.26 */ |
embeddedartists | 0:6b68dac0d986 | 148 | LPC_IOCON->P3_27 |= 1; /* D27 @ P3.27 */ |
embeddedartists | 0:6b68dac0d986 | 149 | |
embeddedartists | 0:6b68dac0d986 | 150 | LPC_IOCON->P3_28 |= 1; /* D28 @ P3.28 */ |
embeddedartists | 0:6b68dac0d986 | 151 | LPC_IOCON->P3_29 |= 1; /* D29 @ P3.29 */ |
embeddedartists | 0:6b68dac0d986 | 152 | LPC_IOCON->P3_30 |= 1; /* D30 @ P3.30 */ |
embeddedartists | 0:6b68dac0d986 | 153 | LPC_IOCON->P3_31 |= 1; /* D31 @ P3.31 */ |
embeddedartists | 0:6b68dac0d986 | 154 | |
embeddedartists | 0:6b68dac0d986 | 155 | LPC_IOCON->P4_0 |= 1; /* A0 @ P4.0 */ |
embeddedartists | 0:6b68dac0d986 | 156 | LPC_IOCON->P4_1 |= 1; /* A1 @ P4.1 */ |
embeddedartists | 0:6b68dac0d986 | 157 | LPC_IOCON->P4_2 |= 1; /* A2 @ P4.2 */ |
embeddedartists | 0:6b68dac0d986 | 158 | LPC_IOCON->P4_3 |= 1; /* A3 @ P4.3 */ |
embeddedartists | 0:6b68dac0d986 | 159 | |
embeddedartists | 0:6b68dac0d986 | 160 | LPC_IOCON->P4_4 |= 1; /* A4 @ P4.4 */ |
embeddedartists | 0:6b68dac0d986 | 161 | LPC_IOCON->P4_5 |= 1; /* A5 @ P4.5 */ |
embeddedartists | 0:6b68dac0d986 | 162 | LPC_IOCON->P4_6 |= 1; /* A6 @ P4.6 */ |
embeddedartists | 0:6b68dac0d986 | 163 | LPC_IOCON->P4_7 |= 1; /* A7 @ P4.7 */ |
embeddedartists | 0:6b68dac0d986 | 164 | |
embeddedartists | 0:6b68dac0d986 | 165 | LPC_IOCON->P4_8 |= 1; /* A8 @ P4.8 */ |
embeddedartists | 0:6b68dac0d986 | 166 | LPC_IOCON->P4_9 |= 1; /* A9 @ P4.9 */ |
embeddedartists | 0:6b68dac0d986 | 167 | LPC_IOCON->P4_10 |= 1; /* A10 @ P4.10 */ |
embeddedartists | 0:6b68dac0d986 | 168 | LPC_IOCON->P4_11 |= 1; /* A11 @ P4.11 */ |
embeddedartists | 0:6b68dac0d986 | 169 | |
embeddedartists | 0:6b68dac0d986 | 170 | LPC_IOCON->P4_12 |= 1; /* A12 @ P4.12 */ |
embeddedartists | 0:6b68dac0d986 | 171 | LPC_IOCON->P4_13 |= 1; /* A13 @ P4.13 */ |
embeddedartists | 0:6b68dac0d986 | 172 | LPC_IOCON->P4_14 |= 1; /* A14 @ P4.14 */ |
embeddedartists | 0:6b68dac0d986 | 173 | #if 0 // not used for SDRAM |
embeddedartists | 0:6b68dac0d986 | 174 | LPC_IOCON->P4_15 |= 1; /* A15 @ P4.15 */ |
embeddedartists | 0:6b68dac0d986 | 175 | |
embeddedartists | 0:6b68dac0d986 | 176 | LPC_IOCON->P4_16 |= 1; /* A16 @ P4.16 */ |
embeddedartists | 0:6b68dac0d986 | 177 | LPC_IOCON->P4_17 |= 1; /* A17 @ P4.17 */ |
embeddedartists | 0:6b68dac0d986 | 178 | LPC_IOCON->P4_18 |= 1; /* A18 @ P4.18 */ |
embeddedartists | 0:6b68dac0d986 | 179 | LPC_IOCON->P4_19 |= 1; /* A19 @ P4.19 */ |
embeddedartists | 0:6b68dac0d986 | 180 | |
embeddedartists | 0:6b68dac0d986 | 181 | LPC_IOCON->P4_20 |= 1; /* A20 @ P4.20 */ |
embeddedartists | 0:6b68dac0d986 | 182 | LPC_IOCON->P4_21 |= 1; /* A21 @ P4.21 */ |
embeddedartists | 0:6b68dac0d986 | 183 | LPC_IOCON->P4_22 |= 1; /* A22 @ P4.22 */ |
embeddedartists | 0:6b68dac0d986 | 184 | LPC_IOCON->P4_23 |= 1; /* A23 @ P4.23 */ |
embeddedartists | 0:6b68dac0d986 | 185 | #endif |
embeddedartists | 0:6b68dac0d986 | 186 | |
embeddedartists | 0:6b68dac0d986 | 187 | LPC_IOCON->P4_24 |= 1; /* OEN @ P4.24 */ |
embeddedartists | 0:6b68dac0d986 | 188 | LPC_IOCON->P4_25 |= 1; /* WEN @ P4.25 */ |
embeddedartists | 0:6b68dac0d986 | 189 | #if 0 // not used for SDRAM |
embeddedartists | 0:6b68dac0d986 | 190 | LPC_IOCON->P4_26 |= 1; /* BLSN[0] @ P4.26 */ |
embeddedartists | 0:6b68dac0d986 | 191 | LPC_IOCON->P4_27 |= 1; /* BLSN[1] @ P4.27 */ |
embeddedartists | 0:6b68dac0d986 | 192 | |
embeddedartists | 0:6b68dac0d986 | 193 | |
embeddedartists | 0:6b68dac0d986 | 194 | LPC_IOCON->P4_28 |= 1; /* BLSN[2] @ P4.28 */ |
embeddedartists | 0:6b68dac0d986 | 195 | LPC_IOCON->P4_29 |= 1; /* BLSN[3] @ P4.29 */ |
embeddedartists | 0:6b68dac0d986 | 196 | LPC_IOCON->P4_30 |= 1; /* CSN[0] @ P4.30 */ |
embeddedartists | 0:6b68dac0d986 | 197 | LPC_IOCON->P4_31 |= 1; /* CSN[1] @ P4.31 */ |
embeddedartists | 0:6b68dac0d986 | 198 | #endif |
embeddedartists | 0:6b68dac0d986 | 199 | |
embeddedartists | 0:6b68dac0d986 | 200 | LPC_IOCON->P2_14 |= 1; /* CSN[2] @ P2.14 */ |
embeddedartists | 0:6b68dac0d986 | 201 | LPC_IOCON->P2_15 |= 1; /* CSN[3] @ P2.15 */ |
embeddedartists | 0:6b68dac0d986 | 202 | |
embeddedartists | 0:6b68dac0d986 | 203 | LPC_IOCON->P2_16 |= 1; /* CASN @ P2.16 */ |
embeddedartists | 0:6b68dac0d986 | 204 | LPC_IOCON->P2_17 |= 1; /* RASN @ P2.17 */ |
embeddedartists | 0:6b68dac0d986 | 205 | LPC_IOCON->P2_18 |= 1; /* CLK[0] @ P2.18 */ |
embeddedartists | 0:6b68dac0d986 | 206 | #if 0 // not used for SDRAM |
embeddedartists | 0:6b68dac0d986 | 207 | LPC_IOCON->P2_19 |= 1; /* CLK[1] @ P2.19 */ |
embeddedartists | 0:6b68dac0d986 | 208 | #endif |
embeddedartists | 0:6b68dac0d986 | 209 | |
embeddedartists | 0:6b68dac0d986 | 210 | LPC_IOCON->P2_20 |= 1; /* DYCSN[0] @ P2.20 */ |
embeddedartists | 0:6b68dac0d986 | 211 | #if 0 // not used for SDRAM |
embeddedartists | 0:6b68dac0d986 | 212 | LPC_IOCON->P2_21 |= 1; /* DYCSN[1] @ P2.21 */ |
embeddedartists | 0:6b68dac0d986 | 213 | LPC_IOCON->P2_22 |= 1; /* DYCSN[2] @ P2.22 */ |
embeddedartists | 0:6b68dac0d986 | 214 | LPC_IOCON->P2_23 |= 1; /* DYCSN[3] @ P2.23 */ |
embeddedartists | 0:6b68dac0d986 | 215 | #endif |
embeddedartists | 0:6b68dac0d986 | 216 | |
embeddedartists | 0:6b68dac0d986 | 217 | LPC_IOCON->P2_24 |= 1; /* CKE[0] @ P2.24 */ |
embeddedartists | 0:6b68dac0d986 | 218 | #if 0 // not used for SDRAM |
embeddedartists | 0:6b68dac0d986 | 219 | LPC_IOCON->P2_25 |= 1; /* CKE[1] @ P2.25 */ |
embeddedartists | 0:6b68dac0d986 | 220 | LPC_IOCON->P2_26 |= 1; /* CKE[2] @ P2.26 */ |
embeddedartists | 0:6b68dac0d986 | 221 | LPC_IOCON->P2_27 |= 1; /* CKE[3] @ P2.27 */ |
embeddedartists | 0:6b68dac0d986 | 222 | #endif |
embeddedartists | 0:6b68dac0d986 | 223 | |
embeddedartists | 0:6b68dac0d986 | 224 | LPC_IOCON->P2_28 |= 1; /* DQM[0] @ P2.28 */ |
embeddedartists | 0:6b68dac0d986 | 225 | LPC_IOCON->P2_29 |= 1; /* DQM[1] @ P2.29 */ |
embeddedartists | 0:6b68dac0d986 | 226 | LPC_IOCON->P2_30 |= 1; /* DQM[2] @ P2.30 */ |
embeddedartists | 0:6b68dac0d986 | 227 | LPC_IOCON->P2_31 |= 1; /* DQM[3] @ P2.31 */ |
embeddedartists | 0:6b68dac0d986 | 228 | } |
embeddedartists | 0:6b68dac0d986 | 229 | |
embeddedartists | 0:6b68dac0d986 | 230 | |
embeddedartists | 0:6b68dac0d986 | 231 | static uint32_t sdram_test( void ) |
embeddedartists | 0:6b68dac0d986 | 232 | { |
embeddedartists | 0:6b68dac0d986 | 233 | volatile uint32_t *wr_ptr; |
embeddedartists | 0:6b68dac0d986 | 234 | volatile uint16_t *short_wr_ptr; |
embeddedartists | 0:6b68dac0d986 | 235 | uint32_t data; |
embeddedartists | 0:6b68dac0d986 | 236 | uint32_t i, j; |
embeddedartists | 0:6b68dac0d986 | 237 | |
embeddedartists | 0:6b68dac0d986 | 238 | wr_ptr = (uint32_t *)SDRAM_BASE; |
embeddedartists | 0:6b68dac0d986 | 239 | short_wr_ptr = (uint16_t *)wr_ptr; |
embeddedartists | 0:6b68dac0d986 | 240 | /* Clear content before 16 bit access test */ |
embeddedartists | 0:6b68dac0d986 | 241 | // for (i = 0; i < SDRAM_SIZE/4; i++) |
embeddedartists | 0:6b68dac0d986 | 242 | // { |
embeddedartists | 0:6b68dac0d986 | 243 | // *wr_ptr++ = 0; |
embeddedartists | 0:6b68dac0d986 | 244 | // } |
embeddedartists | 0:6b68dac0d986 | 245 | |
embeddedartists | 0:6b68dac0d986 | 246 | /* 16 bit write */ |
embeddedartists | 0:6b68dac0d986 | 247 | for (i = 0; i < SDRAM_SIZE/0x40000; i++) |
embeddedartists | 0:6b68dac0d986 | 248 | { |
embeddedartists | 0:6b68dac0d986 | 249 | for (j = 0; j < 0x100; j++) |
embeddedartists | 0:6b68dac0d986 | 250 | { |
embeddedartists | 0:6b68dac0d986 | 251 | *short_wr_ptr++ = (i + j); |
embeddedartists | 0:6b68dac0d986 | 252 | *short_wr_ptr++ = (i + j) + 1; |
embeddedartists | 0:6b68dac0d986 | 253 | } |
embeddedartists | 0:6b68dac0d986 | 254 | } |
embeddedartists | 0:6b68dac0d986 | 255 | |
embeddedartists | 0:6b68dac0d986 | 256 | /* Verifying */ |
embeddedartists | 0:6b68dac0d986 | 257 | wr_ptr = (uint32_t *)SDRAM_BASE; |
embeddedartists | 0:6b68dac0d986 | 258 | for (i = 0; i < SDRAM_SIZE/0x40000; i++) |
embeddedartists | 0:6b68dac0d986 | 259 | { |
embeddedartists | 0:6b68dac0d986 | 260 | for (j = 0; j < 0x100; j++) |
embeddedartists | 0:6b68dac0d986 | 261 | { |
embeddedartists | 0:6b68dac0d986 | 262 | data = *wr_ptr; |
embeddedartists | 0:6b68dac0d986 | 263 | if (data != (((((i + j) + 1) & 0xFFFF) << 16) | ((i + j) & 0xFFFF))) |
embeddedartists | 0:6b68dac0d986 | 264 | { |
embeddedartists | 0:6b68dac0d986 | 265 | return 0x0; |
embeddedartists | 0:6b68dac0d986 | 266 | } |
embeddedartists | 0:6b68dac0d986 | 267 | wr_ptr++; |
embeddedartists | 0:6b68dac0d986 | 268 | } |
embeddedartists | 0:6b68dac0d986 | 269 | } |
embeddedartists | 0:6b68dac0d986 | 270 | return 0x1; |
embeddedartists | 0:6b68dac0d986 | 271 | } |
embeddedartists | 0:6b68dac0d986 | 272 | |
embeddedartists | 0:6b68dac0d986 | 273 | static uint32_t find_cmddly(void) |
embeddedartists | 0:6b68dac0d986 | 274 | { |
embeddedartists | 0:6b68dac0d986 | 275 | uint32_t cmddly, cmddlystart, cmddlyend, dwtemp; |
embeddedartists | 0:6b68dac0d986 | 276 | uint32_t ppass = 0x0, pass = 0x0; |
embeddedartists | 0:6b68dac0d986 | 277 | |
embeddedartists | 0:6b68dac0d986 | 278 | cmddly = 0x0; |
embeddedartists | 0:6b68dac0d986 | 279 | cmddlystart = cmddlyend = 0xFF; |
embeddedartists | 0:6b68dac0d986 | 280 | |
embeddedartists | 0:6b68dac0d986 | 281 | while (cmddly < 32) |
embeddedartists | 0:6b68dac0d986 | 282 | { |
embeddedartists | 0:6b68dac0d986 | 283 | dwtemp = LPC_SC->EMCDLYCTL & ~0x1F; |
embeddedartists | 0:6b68dac0d986 | 284 | LPC_SC->EMCDLYCTL = dwtemp | cmddly; |
embeddedartists | 0:6b68dac0d986 | 285 | |
embeddedartists | 0:6b68dac0d986 | 286 | if (sdram_test() == 0x1) |
embeddedartists | 0:6b68dac0d986 | 287 | { |
embeddedartists | 0:6b68dac0d986 | 288 | /* Test passed */ |
embeddedartists | 0:6b68dac0d986 | 289 | if (cmddlystart == 0xFF) |
embeddedartists | 0:6b68dac0d986 | 290 | { |
embeddedartists | 0:6b68dac0d986 | 291 | cmddlystart = cmddly; |
embeddedartists | 0:6b68dac0d986 | 292 | } |
embeddedartists | 0:6b68dac0d986 | 293 | ppass = 0x1; |
embeddedartists | 0:6b68dac0d986 | 294 | } |
embeddedartists | 0:6b68dac0d986 | 295 | else |
embeddedartists | 0:6b68dac0d986 | 296 | { |
embeddedartists | 0:6b68dac0d986 | 297 | /* Test failed */ |
embeddedartists | 0:6b68dac0d986 | 298 | if (ppass == 1) |
embeddedartists | 0:6b68dac0d986 | 299 | { |
embeddedartists | 0:6b68dac0d986 | 300 | cmddlyend = cmddly; |
embeddedartists | 0:6b68dac0d986 | 301 | pass = 0x1; |
embeddedartists | 0:6b68dac0d986 | 302 | ppass = 0x0; |
embeddedartists | 0:6b68dac0d986 | 303 | } |
embeddedartists | 0:6b68dac0d986 | 304 | } |
embeddedartists | 0:6b68dac0d986 | 305 | |
embeddedartists | 0:6b68dac0d986 | 306 | /* Try next value */ |
embeddedartists | 0:6b68dac0d986 | 307 | cmddly++; |
embeddedartists | 0:6b68dac0d986 | 308 | } |
embeddedartists | 0:6b68dac0d986 | 309 | |
embeddedartists | 0:6b68dac0d986 | 310 | /* If the test passed, the we can use the average of the min and max values to get an optimal DQSIN delay */ |
embeddedartists | 0:6b68dac0d986 | 311 | if (pass == 0x1) |
embeddedartists | 0:6b68dac0d986 | 312 | { |
embeddedartists | 0:6b68dac0d986 | 313 | cmddly = (cmddlystart + cmddlyend) / 2; |
embeddedartists | 0:6b68dac0d986 | 314 | } |
embeddedartists | 0:6b68dac0d986 | 315 | else if (ppass == 0x1) |
embeddedartists | 0:6b68dac0d986 | 316 | { |
embeddedartists | 0:6b68dac0d986 | 317 | cmddly = (cmddlystart + 0x1F) / 2; |
embeddedartists | 0:6b68dac0d986 | 318 | } |
embeddedartists | 0:6b68dac0d986 | 319 | else |
embeddedartists | 0:6b68dac0d986 | 320 | { |
embeddedartists | 0:6b68dac0d986 | 321 | /* A working value couldn't be found, just pick something safe so the system doesn't become unstable */ |
embeddedartists | 0:6b68dac0d986 | 322 | cmddly = 0x10; |
embeddedartists | 0:6b68dac0d986 | 323 | } |
embeddedartists | 0:6b68dac0d986 | 324 | |
embeddedartists | 0:6b68dac0d986 | 325 | dwtemp = LPC_SC->EMCDLYCTL & ~0x1F; |
embeddedartists | 0:6b68dac0d986 | 326 | LPC_SC->EMCDLYCTL = dwtemp | cmddly; |
embeddedartists | 0:6b68dac0d986 | 327 | |
embeddedartists | 0:6b68dac0d986 | 328 | return (pass | ppass); |
embeddedartists | 0:6b68dac0d986 | 329 | } |
embeddedartists | 0:6b68dac0d986 | 330 | |
embeddedartists | 0:6b68dac0d986 | 331 | static uint32_t find_fbclkdly(void) |
embeddedartists | 0:6b68dac0d986 | 332 | { |
embeddedartists | 0:6b68dac0d986 | 333 | uint32_t fbclkdly, fbclkdlystart, fbclkdlyend, dwtemp; |
embeddedartists | 0:6b68dac0d986 | 334 | uint32_t ppass = 0x0, pass = 0x0; |
embeddedartists | 0:6b68dac0d986 | 335 | |
embeddedartists | 0:6b68dac0d986 | 336 | fbclkdly = 0x0; |
embeddedartists | 0:6b68dac0d986 | 337 | fbclkdlystart = fbclkdlyend = 0xFF; |
embeddedartists | 0:6b68dac0d986 | 338 | |
embeddedartists | 0:6b68dac0d986 | 339 | while (fbclkdly < 32) |
embeddedartists | 0:6b68dac0d986 | 340 | { |
embeddedartists | 0:6b68dac0d986 | 341 | dwtemp = LPC_SC->EMCDLYCTL & ~0x1F00; |
embeddedartists | 0:6b68dac0d986 | 342 | LPC_SC->EMCDLYCTL = dwtemp | (fbclkdly << 8); |
embeddedartists | 0:6b68dac0d986 | 343 | |
embeddedartists | 0:6b68dac0d986 | 344 | if (sdram_test() == 0x1) |
embeddedartists | 0:6b68dac0d986 | 345 | { |
embeddedartists | 0:6b68dac0d986 | 346 | /* Test passed */ |
embeddedartists | 0:6b68dac0d986 | 347 | if (fbclkdlystart == 0xFF) |
embeddedartists | 0:6b68dac0d986 | 348 | { |
embeddedartists | 0:6b68dac0d986 | 349 | fbclkdlystart = fbclkdly; |
embeddedartists | 0:6b68dac0d986 | 350 | } |
embeddedartists | 0:6b68dac0d986 | 351 | ppass = 0x1; |
embeddedartists | 0:6b68dac0d986 | 352 | } |
embeddedartists | 0:6b68dac0d986 | 353 | else |
embeddedartists | 0:6b68dac0d986 | 354 | { |
embeddedartists | 0:6b68dac0d986 | 355 | /* Test failed */ |
embeddedartists | 0:6b68dac0d986 | 356 | if (ppass == 1) |
embeddedartists | 0:6b68dac0d986 | 357 | { |
embeddedartists | 0:6b68dac0d986 | 358 | fbclkdlyend = fbclkdly; |
embeddedartists | 0:6b68dac0d986 | 359 | pass = 0x1; |
embeddedartists | 0:6b68dac0d986 | 360 | ppass = 0x0; |
embeddedartists | 0:6b68dac0d986 | 361 | } |
embeddedartists | 0:6b68dac0d986 | 362 | } |
embeddedartists | 0:6b68dac0d986 | 363 | |
embeddedartists | 0:6b68dac0d986 | 364 | /* Try next value */ |
embeddedartists | 0:6b68dac0d986 | 365 | fbclkdly++; |
embeddedartists | 0:6b68dac0d986 | 366 | } |
embeddedartists | 0:6b68dac0d986 | 367 | |
embeddedartists | 0:6b68dac0d986 | 368 | /* If the test passed, the we can use the average of the min and max values to get an optimal DQSIN delay */ |
embeddedartists | 0:6b68dac0d986 | 369 | if (pass == 0x1) |
embeddedartists | 0:6b68dac0d986 | 370 | { |
embeddedartists | 0:6b68dac0d986 | 371 | fbclkdly = (fbclkdlystart + fbclkdlyend) / 2; |
embeddedartists | 0:6b68dac0d986 | 372 | } |
embeddedartists | 0:6b68dac0d986 | 373 | else if (ppass == 0x1) |
embeddedartists | 0:6b68dac0d986 | 374 | { |
embeddedartists | 0:6b68dac0d986 | 375 | fbclkdly = (fbclkdlystart + 0x1F) / 2; |
embeddedartists | 0:6b68dac0d986 | 376 | } |
embeddedartists | 0:6b68dac0d986 | 377 | else |
embeddedartists | 0:6b68dac0d986 | 378 | { |
embeddedartists | 0:6b68dac0d986 | 379 | /* A working value couldn't be found, just pick something safe so the system doesn't become unstable */ |
embeddedartists | 0:6b68dac0d986 | 380 | fbclkdly = 0x10; |
embeddedartists | 0:6b68dac0d986 | 381 | } |
embeddedartists | 0:6b68dac0d986 | 382 | |
embeddedartists | 0:6b68dac0d986 | 383 | dwtemp = LPC_SC->EMCDLYCTL & ~0x1F00; |
embeddedartists | 0:6b68dac0d986 | 384 | LPC_SC->EMCDLYCTL = dwtemp | (fbclkdly << 8); |
embeddedartists | 0:6b68dac0d986 | 385 | |
embeddedartists | 0:6b68dac0d986 | 386 | return (pass | ppass); |
embeddedartists | 0:6b68dac0d986 | 387 | } |
embeddedartists | 0:6b68dac0d986 | 388 | |
embeddedartists | 0:6b68dac0d986 | 389 | static uint32_t calibration( void ) |
embeddedartists | 0:6b68dac0d986 | 390 | { |
embeddedartists | 0:6b68dac0d986 | 391 | uint32_t dwtemp, i; |
embeddedartists | 0:6b68dac0d986 | 392 | uint32_t cnt = 0; |
embeddedartists | 0:6b68dac0d986 | 393 | |
embeddedartists | 0:6b68dac0d986 | 394 | for (i = 0; i < 10; i++) |
embeddedartists | 0:6b68dac0d986 | 395 | { |
embeddedartists | 0:6b68dac0d986 | 396 | dwtemp = LPC_SC->EMCCAL & ~0x4000; |
embeddedartists | 0:6b68dac0d986 | 397 | LPC_SC->EMCCAL = dwtemp | 0x4000; |
embeddedartists | 0:6b68dac0d986 | 398 | |
embeddedartists | 0:6b68dac0d986 | 399 | dwtemp = LPC_SC->EMCCAL; |
embeddedartists | 0:6b68dac0d986 | 400 | while ((dwtemp & 0x8000) == 0x0000) |
embeddedartists | 0:6b68dac0d986 | 401 | { |
embeddedartists | 0:6b68dac0d986 | 402 | dwtemp = LPC_SC->EMCCAL; |
embeddedartists | 0:6b68dac0d986 | 403 | } |
embeddedartists | 0:6b68dac0d986 | 404 | cnt += (dwtemp & 0xFF); |
embeddedartists | 0:6b68dac0d986 | 405 | } |
embeddedartists | 0:6b68dac0d986 | 406 | return (cnt / 10); |
embeddedartists | 0:6b68dac0d986 | 407 | } |
embeddedartists | 0:6b68dac0d986 | 408 | |
embeddedartists | 10:1ac4b213f0f7 | 409 | static void allowExecutionOfCodeInSDRAM(void) |
embeddedartists | 10:1ac4b213f0f7 | 410 | { |
embeddedartists | 10:1ac4b213f0f7 | 411 | //----- Adjust MPU to allow execution of code from SDRAM |
embeddedartists | 10:1ac4b213f0f7 | 412 | |
embeddedartists | 10:1ac4b213f0f7 | 413 | /* Disable MPU */ |
embeddedartists | 10:1ac4b213f0f7 | 414 | MPU->CTRL = 0x00; |
embeddedartists | 10:1ac4b213f0f7 | 415 | |
embeddedartists | 10:1ac4b213f0f7 | 416 | /* Select to use the default memory map as base and only modify parts */ |
embeddedartists | 10:1ac4b213f0f7 | 417 | MPU->CTRL = 0x04; // PRIVDEFENA=1 |
embeddedartists | 10:1ac4b213f0f7 | 418 | |
embeddedartists | 10:1ac4b213f0f7 | 419 | #define _RBAR(_ADDR, _VALID, _REGION) \ |
embeddedartists | 10:1ac4b213f0f7 | 420 | ((_ADDR) | ((_VALID) << 4) | (_REGION)) |
embeddedartists | 10:1ac4b213f0f7 | 421 | |
embeddedartists | 10:1ac4b213f0f7 | 422 | #define _RASR(_XN, _AP, _TYPE, _SRD, _SIZE, _ENABLE) \ |
embeddedartists | 10:1ac4b213f0f7 | 423 | (((_XN) << 28) | ((_AP) << 24) | ((_TYPE) << 16) | ((_SRD) << 8) | ((_SIZE) << 1) | (_ENABLE)) |
embeddedartists | 10:1ac4b213f0f7 | 424 | |
embeddedartists | 10:1ac4b213f0f7 | 425 | #define AP_RW 0x03 // 011 = Full Access |
embeddedartists | 10:1ac4b213f0f7 | 426 | #define MEM_TYPE_ERAM 0x07 // Normal, Sharable, Cached, Buffered, write-back & write allocate |
embeddedartists | 10:1ac4b213f0f7 | 427 | #define SIZE_32M 0x18 // Region size in bytes = 2^(0x18+1) = 32MB |
embeddedartists | 10:1ac4b213f0f7 | 428 | |
embeddedartists | 10:1ac4b213f0f7 | 429 | /* Setup MPU Region 4 for the SDRAM (0xA0000000 - 0xA1FFFFFF*/ |
embeddedartists | 10:1ac4b213f0f7 | 430 | MPU->RBAR = _RBAR(0xA0000000, 1, 4); |
embeddedartists | 10:1ac4b213f0f7 | 431 | MPU->RASR = _RASR(0, AP_RW, MEM_TYPE_ERAM, 0, SIZE_32M, 1); |
embeddedartists | 10:1ac4b213f0f7 | 432 | |
embeddedartists | 10:1ac4b213f0f7 | 433 | /* (Re-)Enable MPU */ |
embeddedartists | 10:1ac4b213f0f7 | 434 | MPU->CTRL |= 0x01; |
embeddedartists | 10:1ac4b213f0f7 | 435 | |
embeddedartists | 10:1ac4b213f0f7 | 436 | //----- End of MPU adjustments |
embeddedartists | 10:1ac4b213f0f7 | 437 | } |
embeddedartists | 10:1ac4b213f0f7 | 438 | |
embeddedartists | 0:6b68dac0d986 | 439 | /****************************************************************************** |
embeddedartists | 0:6b68dac0d986 | 440 | * Public Functions |
embeddedartists | 0:6b68dac0d986 | 441 | *****************************************************************************/ |
embeddedartists | 0:6b68dac0d986 | 442 | |
embeddedartists | 0:6b68dac0d986 | 443 | |
embeddedartists | 0:6b68dac0d986 | 444 | void adjust_timing( void ) |
embeddedartists | 0:6b68dac0d986 | 445 | { |
embeddedartists | 0:6b68dac0d986 | 446 | uint32_t dwtemp, cmddly, fbclkdly; |
embeddedartists | 0:6b68dac0d986 | 447 | |
embeddedartists | 0:6b68dac0d986 | 448 | /* Current value */ |
embeddedartists | 0:6b68dac0d986 | 449 | ringosccount[1] = calibration(); |
embeddedartists | 0:6b68dac0d986 | 450 | |
embeddedartists | 0:6b68dac0d986 | 451 | dwtemp = LPC_SC->EMCDLYCTL; |
embeddedartists | 0:6b68dac0d986 | 452 | cmddly = ((dwtemp & 0x1F) * ringosccount[0] / ringosccount[1]) & 0x1F; |
embeddedartists | 0:6b68dac0d986 | 453 | fbclkdly = ((dwtemp & 0x1F00) * ringosccount[0] / ringosccount[1]) & 0x1F00; |
embeddedartists | 0:6b68dac0d986 | 454 | LPC_SC->EMCDLYCTL = (dwtemp & ~0x1F1F) | fbclkdly | cmddly; |
embeddedartists | 0:6b68dac0d986 | 455 | } |
embeddedartists | 0:6b68dac0d986 | 456 | |
embeddedartists | 0:6b68dac0d986 | 457 | /****************************************************************************** |
embeddedartists | 0:6b68dac0d986 | 458 | * |
embeddedartists | 0:6b68dac0d986 | 459 | * Description: |
embeddedartists | 0:6b68dac0d986 | 460 | * Initialize the SDRAM |
embeddedartists | 0:6b68dac0d986 | 461 | * |
embeddedartists | 0:6b68dac0d986 | 462 | *****************************************************************************/ |
embeddedartists | 0:6b68dac0d986 | 463 | uint32_t sdram_init (void) |
embeddedartists | 0:6b68dac0d986 | 464 | { |
embeddedartists | 0:6b68dac0d986 | 465 | uint32_t i; |
embeddedartists | 0:6b68dac0d986 | 466 | uint32_t dwtemp = 0; |
embeddedartists | 0:6b68dac0d986 | 467 | //uint16_t wtemp = 0; |
embeddedartists | 0:6b68dac0d986 | 468 | |
embeddedartists | 0:6b68dac0d986 | 469 | if (initialized) { |
embeddedartists | 0:6b68dac0d986 | 470 | return 0; |
embeddedartists | 0:6b68dac0d986 | 471 | } |
embeddedartists | 0:6b68dac0d986 | 472 | |
embeddedartists | 0:6b68dac0d986 | 473 | LPC_SC->PCONP |= 0x00000800; |
embeddedartists | 0:6b68dac0d986 | 474 | LPC_SC->EMCDLYCTL = 0x00001010; |
embeddedartists | 0:6b68dac0d986 | 475 | LPC_EMC->Control = 0x00000001; |
embeddedartists | 0:6b68dac0d986 | 476 | LPC_EMC->Config = 0x00000000; |
embeddedartists | 0:6b68dac0d986 | 477 | |
embeddedartists | 0:6b68dac0d986 | 478 | pinConfig(); //Full 32-bit Data bus, 24-bit Address |
embeddedartists | 0:6b68dac0d986 | 479 | |
embeddedartists | 0:6b68dac0d986 | 480 | /* Configure memory layout, but MUST DISABLE BUFFERs during configuration */ |
embeddedartists | 0:6b68dac0d986 | 481 | /* 256MB, 8Mx32, 4 banks, row=12, column=9 */ |
embeddedartists | 0:6b68dac0d986 | 482 | LPC_EMC->DynamicConfig0 = 0x00004480; |
embeddedartists | 0:6b68dac0d986 | 483 | |
embeddedartists | 0:6b68dac0d986 | 484 | /*Configure timing for ISSI IS4x32800D SDRAM*/ |
embeddedartists | 0:6b68dac0d986 | 485 | |
embeddedartists | 0:6b68dac0d986 | 486 | #if (SDRAM_SPEED==SDRAM_SPEED_48) |
embeddedartists | 0:6b68dac0d986 | 487 | //Timing for 48MHz Bus |
embeddedartists | 0:6b68dac0d986 | 488 | LPC_EMC->DynamicRasCas0 = 0x00000201; /* 1 RAS, 2 CAS latency */ |
embeddedartists | 0:6b68dac0d986 | 489 | LPC_EMC->DynamicReadConfig = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */ |
embeddedartists | 0:6b68dac0d986 | 490 | LPC_EMC->DynamicRP = 0x00000000; /* ( n + 1 ) -> 1 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 491 | LPC_EMC->DynamicRAS = 0x00000002; /* ( n + 1 ) -> 3 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 492 | LPC_EMC->DynamicSREX = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 493 | LPC_EMC->DynamicAPR = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 494 | LPC_EMC->DynamicDAL = 0x00000002; /* ( n ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 495 | LPC_EMC->DynamicWR = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 496 | LPC_EMC->DynamicRC = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 497 | LPC_EMC->DynamicRFC = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 498 | LPC_EMC->DynamicXSR = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 499 | LPC_EMC->DynamicRRD = 0x00000000; /* ( n + 1 ) -> 1 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 500 | LPC_EMC->DynamicMRD = 0x00000000; /* ( n + 1 ) -> 1 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 501 | #elif (SDRAM_SPEED==SDRAM_SPEED_50) |
embeddedartists | 0:6b68dac0d986 | 502 | //Timing for 50MHz Bus (with 100MHz M3 Core) |
embeddedartists | 0:6b68dac0d986 | 503 | LPC_EMC->DynamicRasCas0 = 0x00000201; /* 1 RAS, 2 CAS latency */ |
embeddedartists | 0:6b68dac0d986 | 504 | LPC_EMC->DynamicReadConfig = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */ |
embeddedartists | 0:6b68dac0d986 | 505 | LPC_EMC->DynamicRP = 0x00000000; /* ( n + 1 ) -> 1 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 506 | LPC_EMC->DynamicRAS = 0x00000002; /* ( n + 1 ) -> 3 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 507 | LPC_EMC->DynamicSREX = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 508 | LPC_EMC->DynamicAPR = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 509 | LPC_EMC->DynamicDAL = 0x00000002; /* ( n ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 510 | LPC_EMC->DynamicWR = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 511 | LPC_EMC->DynamicRC = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 512 | LPC_EMC->DynamicRFC = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 513 | LPC_EMC->DynamicXSR = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 514 | LPC_EMC->DynamicRRD = 0x00000000; /* ( n + 1 ) -> 1 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 515 | LPC_EMC->DynamicMRD = 0x00000000; /* ( n + 1 ) -> 1 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 516 | #elif (SDRAM_SPEED==SDRAM_SPEED_60) |
embeddedartists | 0:6b68dac0d986 | 517 | //Timing for 60 MHz Bus (same as 72MHz) |
embeddedartists | 0:6b68dac0d986 | 518 | LPC_EMC->DynamicRasCas0 = 0x00000202; /* 2 RAS, 2 CAS latency */ |
embeddedartists | 0:6b68dac0d986 | 519 | LPC_EMC->DynamicReadConfig = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */ |
embeddedartists | 0:6b68dac0d986 | 520 | LPC_EMC->DynamicRP = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 521 | LPC_EMC->DynamicRAS = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 522 | LPC_EMC->DynamicSREX = 0x00000005; /* ( n + 1 ) -> 6 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 523 | LPC_EMC->DynamicAPR = 0x00000002; /* ( n + 1 ) -> 3 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 524 | LPC_EMC->DynamicDAL = 0x00000003; /* ( n ) -> 3 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 525 | LPC_EMC->DynamicWR = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 526 | LPC_EMC->DynamicRC = 0x00000004; /* ( n + 1 ) -> 5 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 527 | LPC_EMC->DynamicRFC = 0x00000004; /* ( n + 1 ) -> 5 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 528 | LPC_EMC->DynamicXSR = 0x00000005; /* ( n + 1 ) -> 6 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 529 | LPC_EMC->DynamicRRD = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 530 | LPC_EMC->DynamicMRD = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 531 | #elif (SDRAM_SPEED==SDRAM_SPEED_72) |
embeddedartists | 0:6b68dac0d986 | 532 | //Timing for 72 MHz Bus |
embeddedartists | 0:6b68dac0d986 | 533 | LPC_EMC->DynamicRasCas0 = 0x00000202; /* 2 RAS, 2 CAS latency */ |
embeddedartists | 0:6b68dac0d986 | 534 | LPC_EMC->DynamicReadConfig = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */ |
embeddedartists | 0:6b68dac0d986 | 535 | LPC_EMC->DynamicRP = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 536 | LPC_EMC->DynamicRAS = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 537 | LPC_EMC->DynamicSREX = 0x00000005; /* ( n + 1 ) -> 6 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 538 | LPC_EMC->DynamicAPR = 0x00000002; /* ( n + 1 ) -> 3 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 539 | LPC_EMC->DynamicDAL = 0x00000003; /* ( n ) -> 3 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 540 | LPC_EMC->DynamicWR = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 541 | LPC_EMC->DynamicRC = 0x00000004; /* ( n + 1 ) -> 5 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 542 | LPC_EMC->DynamicRFC = 0x00000004; /* ( n + 1 ) -> 5 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 543 | LPC_EMC->DynamicXSR = 0x00000005; /* ( n + 1 ) -> 6 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 544 | LPC_EMC->DynamicRRD = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 545 | LPC_EMC->DynamicMRD = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 546 | #elif (SDRAM_SPEED==SDRAM_SPEED_80) |
embeddedartists | 0:6b68dac0d986 | 547 | //Timing for 80 MHz Bus (same as 72MHz) |
embeddedartists | 0:6b68dac0d986 | 548 | LPC_EMC->DynamicRasCas0 = 0x00000202; /* 2 RAS, 2 CAS latency */ |
embeddedartists | 0:6b68dac0d986 | 549 | LPC_EMC->DynamicReadConfig = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */ |
embeddedartists | 0:6b68dac0d986 | 550 | LPC_EMC->DynamicRP = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 551 | LPC_EMC->DynamicRAS = 0x00000003; /* ( n + 1 ) -> 4 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 552 | LPC_EMC->DynamicSREX = 0x00000005; /* ( n + 1 ) -> 6 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 553 | LPC_EMC->DynamicAPR = 0x00000002; /* ( n + 1 ) -> 3 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 554 | LPC_EMC->DynamicDAL = 0x00000003; /* ( n ) -> 3 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 555 | LPC_EMC->DynamicWR = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 556 | LPC_EMC->DynamicRC = 0x00000004; /* ( n + 1 ) -> 5 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 557 | LPC_EMC->DynamicRFC = 0x00000004; /* ( n + 1 ) -> 5 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 558 | LPC_EMC->DynamicXSR = 0x00000005; /* ( n + 1 ) -> 6 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 559 | LPC_EMC->DynamicRRD = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 560 | LPC_EMC->DynamicMRD = 0x00000001; /* ( n + 1 ) -> 2 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 561 | #else |
embeddedartists | 0:6b68dac0d986 | 562 | #error UNSUPPORTED SDRAM FREQ |
embeddedartists | 0:6b68dac0d986 | 563 | #endif |
embeddedartists | 0:6b68dac0d986 | 564 | |
embeddedartists | 0:6b68dac0d986 | 565 | LPC_EMC->DynamicControl = 0x00000183; /* Issue NOP command */ |
embeddedartists | 0:6b68dac0d986 | 566 | wait(0.2); /* wait 200ms */ |
embeddedartists | 0:6b68dac0d986 | 567 | LPC_EMC->DynamicControl = 0x00000103; /* Issue PALL command */ |
embeddedartists | 0:6b68dac0d986 | 568 | LPC_EMC->DynamicRefresh = 0x00000002; /* ( n * 16 ) -> 32 clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 569 | for(i = 0; i < 0x80; i++); /* wait 128 AHB clock cycles */ |
embeddedartists | 0:6b68dac0d986 | 570 | |
embeddedartists | 0:6b68dac0d986 | 571 | |
embeddedartists | 0:6b68dac0d986 | 572 | #if (SDRAM_SPEED==SDRAM_SPEED_48) |
embeddedartists | 0:6b68dac0d986 | 573 | //Timing for 48MHz Bus |
embeddedartists | 0:6b68dac0d986 | 574 | LPC_EMC->DynamicRefresh = 0x0000002E; /* ( n * 16 ) -> 736 clock cycles -> 15.330uS at 48MHz <= 15.625uS ( 64ms / 4096 row ) */ |
embeddedartists | 0:6b68dac0d986 | 575 | #elif (SDRAM_SPEED==SDRAM_SPEED_50) |
embeddedartists | 0:6b68dac0d986 | 576 | //Timing for 50MHz Bus |
embeddedartists | 0:6b68dac0d986 | 577 | LPC_EMC->DynamicRefresh = 0x0000003A; /* ( n * 16 ) -> 768 clock cycles -> 15.360uS at 50MHz <= 15.625uS ( 64ms / 4096 row ) */ |
embeddedartists | 0:6b68dac0d986 | 578 | #elif (SDRAM_SPEED==SDRAM_SPEED_60) |
embeddedartists | 0:6b68dac0d986 | 579 | //Timing for 60MHz Bus |
embeddedartists | 0:6b68dac0d986 | 580 | LPC_EMC->DynamicRefresh = 0x0000003A; /* ( n * 16 ) -> 928 clock cycles -> 15.466uS at 60MHz <= 15.625uS ( 64ms / 4096 row ) */ |
embeddedartists | 0:6b68dac0d986 | 581 | #elif (SDRAM_SPEED==SDRAM_SPEED_72) |
embeddedartists | 0:6b68dac0d986 | 582 | //Timing for 72MHz Bus |
embeddedartists | 0:6b68dac0d986 | 583 | LPC_EMC->DynamicRefresh = 0x00000046; /* ( n * 16 ) -> 1120 clock cycles -> 15.556uS at 72MHz <= 15.625uS ( 64ms / 4096 row ) */ |
embeddedartists | 0:6b68dac0d986 | 584 | #elif (SDRAM_SPEED==SDRAM_SPEED_80) |
embeddedartists | 0:6b68dac0d986 | 585 | //Timing for 80MHz Bus |
embeddedartists | 0:6b68dac0d986 | 586 | LPC_EMC->DynamicRefresh = 0x0000004E; /* ( n * 16 ) -> 1248 clock cycles -> 15.600uS at 80MHz <= 15.625uS ( 64ms / 4096 row ) */ |
embeddedartists | 0:6b68dac0d986 | 587 | #else |
embeddedartists | 0:6b68dac0d986 | 588 | #error UNSUPPORTED SDRAM FREQ |
embeddedartists | 0:6b68dac0d986 | 589 | #endif |
embeddedartists | 0:6b68dac0d986 | 590 | |
embeddedartists | 0:6b68dac0d986 | 591 | LPC_EMC->DynamicControl = 0x00000083; /* Issue MODE command */ |
embeddedartists | 0:6b68dac0d986 | 592 | //Timing for 48/60/72MHZ Bus |
embeddedartists | 0:6b68dac0d986 | 593 | dwtemp = *((volatile uint32_t *)(SDRAM_BASE | (0x22<<(2+2+9)))); /* 4 burst, 2 CAS latency */ |
embeddedartists | 0:6b68dac0d986 | 594 | dwtemp = dwtemp; |
embeddedartists | 0:6b68dac0d986 | 595 | LPC_EMC->DynamicControl = 0x00000000; /* Issue NORMAL command */ |
embeddedartists | 0:6b68dac0d986 | 596 | //[re]enable buffers |
embeddedartists | 0:6b68dac0d986 | 597 | LPC_EMC->DynamicConfig0 = 0x00084480; /* 256MB, 8Mx32, 4 banks, row=12, column=9 */ |
embeddedartists | 0:6b68dac0d986 | 598 | |
embeddedartists | 0:6b68dac0d986 | 599 | /* Nominal value */ |
embeddedartists | 0:6b68dac0d986 | 600 | ringosccount[0] = calibration(); |
embeddedartists | 0:6b68dac0d986 | 601 | |
embeddedartists | 0:6b68dac0d986 | 602 | if (find_cmddly() == 0x0) |
embeddedartists | 0:6b68dac0d986 | 603 | { |
embeddedartists | 0:6b68dac0d986 | 604 | //while (1); /* fatal error */ |
embeddedartists | 0:6b68dac0d986 | 605 | return 1;//FALSE; |
embeddedartists | 0:6b68dac0d986 | 606 | } |
embeddedartists | 0:6b68dac0d986 | 607 | |
embeddedartists | 0:6b68dac0d986 | 608 | if (find_fbclkdly() == 0x0) |
embeddedartists | 0:6b68dac0d986 | 609 | { |
embeddedartists | 0:6b68dac0d986 | 610 | //while (1); /* fatal error */ |
embeddedartists | 0:6b68dac0d986 | 611 | return 1;//FALSE; |
embeddedartists | 0:6b68dac0d986 | 612 | } |
embeddedartists | 0:6b68dac0d986 | 613 | |
embeddedartists | 0:6b68dac0d986 | 614 | adjust_timing(); |
embeddedartists | 0:6b68dac0d986 | 615 | |
embeddedartists | 10:1ac4b213f0f7 | 616 | allowExecutionOfCodeInSDRAM(); |
embeddedartists | 10:1ac4b213f0f7 | 617 | |
embeddedartists | 0:6b68dac0d986 | 618 | initialized = true; |
embeddedartists | 0:6b68dac0d986 | 619 | |
embeddedartists | 0:6b68dac0d986 | 620 | return 0;//TRUE; |
embeddedartists | 0:6b68dac0d986 | 621 | } |
embeddedartists | 0:6b68dac0d986 | 622 | |
embeddedartists | 0:6b68dac0d986 | 623 | void sdram_disableMallocSdram() |
embeddedartists | 0:6b68dac0d986 | 624 | { |
embeddedartists | 0:6b68dac0d986 | 625 | okToUseSdramForHeap = false; |
embeddedartists | 0:6b68dac0d986 | 626 | } |