Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 | /* * Most of this taken from Redboot hal_platform_setup.h with cleanup * * NOTE: I haven't clean this up considerably, just enough to get it * running. See hal_platform_setup.h for the source. See * board/cradle/lowlevel_init.S for another PXA250 setup that is * much cleaner. * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ #include <config.h> #include <version.h> #include <asm/arch/pxa-regs.h> DRAM_SIZE: .long CFG_DRAM_SIZE /* wait for coprocessor write complete */ .macro CPWAIT reg mrc p15,0,\reg,c2,c0,0 mov \reg,\reg sub pc,pc,#4 .endm .macro wait time ldr r2, =OSCR mov r3, #0 str r3, [r2] 0: ldr r3, [r2] cmp r3, \time bls 0b .endm /* * Memory setup */ .globl lowlevel_init lowlevel_init: /* Set up GPIO pins first ----------------------------------------- */ mov r10, lr /* Configure GPIO Pins 41 - 48 as UART1 / altern. Fkt. 2 */ ldr r0, =0x40E10438 @ GPIO41 FFRXD ldr r1, =0x802 str r1, [r0] ldr r0, =0x40E1043C @ GPIO42 FFTXD ldr r1, =0x802 str r1, [r0] ldr r0, =0x40E10440 @ GPIO43 FFCTS ldr r1, =0x802 str r1, [r0] ldr r0, =0x40E10444 @ GPIO 44 FFDCD ldr r1, =0x802 str r1, [r0] ldr r0, =0x40E10448 @ GPIO 45 FFDSR ldr r1, =0x802 str r1, [r0] ldr r0, =0x40E1044C @ GPIO 46 FFRI ldr r1, =0x802 str r1, [r0] ldr r0, =0x40E10450 @ GPIO 47 FFDTR ldr r1, =0x802 str r1, [r0] ldr r0, =0x40E10454 @ GPIO 48 ldr r1, =0x802 str r1, [r0] /* tebrandt - ASCR, clear the RDH bit */ ldr r0, =ASCR ldr r1, [r0] bic r1, r1, #0x80000000 str r1, [r0] /* ---------------------------------------------------------------- */ /* Enable memory interface */ /* */ /* The sequence below is based on the recommended init steps */ /* detailed in the Intel PXA250 Operating Systems Developers Guide, */ /* Chapter 10. */ /* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */ /* Step 1: Wait for at least 200 microsedonds to allow internal */ /* clocks to settle. Only necessary after hard reset... */ /* FIXME: can be optimized later */ /* ---------------------------------------------------------------- */ /* mk: replaced with wait macro */ /* ldr r3, =OSCR /\* reset the OS Timer Count to zero *\/ */ /* mov r2, #0 */ /* str r2, [r3] */ /* ldr r4, =0x300 /\* really 0x2E1 is about 200usec, *\/ */ /* /\* so 0x300 should be plenty *\/ */ /* 1: */ /* ldr r2, [r3] */ /* cmp r4, r2 */ /* bgt 1b */ wait #300 mem_init: /* configure the MEMCLKCFG register */ ldr r1, =MEMCLKCFG ldr r2, =0x00010001 str r2, [r1] @ WRITE ldr r2, [r1] @ DELAY UNTIL WRITTEN /* set CSADRCFG[0] to data flash SRAM mode */ ldr r1, =CSADRCFG0 ldr r2, =0x00320809 str r2, [r1] @ WRITE ldr r2, [r1] @ DELAY UNTIL WRITTEN /* set CSADRCFG[1] to data flash SRAM mode */ ldr r1, =CSADRCFG1 ldr r2, =0x00320809 str r2, [r1] @ WRITE ldr r2, [r1] @ DELAY UNTIL WRITTEN /* set MSC 0 register for SRAM memory */ ldr r1, =MSC0 ldr r2, =0x11191119 str r2, [r1] @ WRITE ldr r2, [r1] @ DELAY UNTIL WRITTEN /* set CSADRCFG[2] to data flash SRAM mode */ ldr r1, =CSADRCFG2 ldr r2, =0x00320809 str r2, [r1] @ WRITE ldr r2, [r1] @ DELAY UNTIL WRITTEN /* set CSADRCFG[3] to VLIO mode */ ldr r1, =CSADRCFG3 ldr r2, =0x0032080B str r2, [r1] @ WRITE ldr r2, [r1] @ DELAY UNTIL WRITTEN /* set MSC 1 register for VLIO memory */ ldr r1, =MSC1 ldr r2, =0x123C1119 str r2, [r1] @ WRITE ldr r2, [r1] @ DELAY UNTIL WRITTEN #if 0 /* This does not work in Zylonite. -SC */ ldr r0, =0x15fffff0 ldr r1, =0xb10b str r1, [r0] str r1, [r0, #4] #endif /* Configure ACCR Register */ ldr r0, =ACCR @ ACCR ldr r1, =0x0180b108 str r1, [r0] ldr r1, [r0] /* Configure MDCNFG Register */ ldr r0, =MDCNFG @ MDCNFG ldr r1, =0x403 str r1, [r0] ldr r1, [r0] /* Perform Resistive Compensation by configuring RCOMP register */ ldr r1, =RCOMP @ RCOMP ldr r2, =0x000000ff str r2, [r1] ldr r2, [r1] /* Configure MDMRS Register for SDCS0 */ ldr r1, =MDMRS @ MDMRS ldr r2, =0x60000023 ldr r3, [r1] orr r2, r2, r3 str r2, [r1] ldr r2, [r1] /* Configure MDMRS Register for SDCS1 */ ldr r1, =MDMRS @ MDMRS ldr r2, =0xa0000023 ldr r3, [r1] orr r2, r2, r3 str r2, [r1] ldr r2, [r1] /* Configure MDREFR */ ldr r1, =MDREFR @ MDREFR ldr r2, =0x00000006 str r2, [r1] ldr r2, [r1] /* Configure EMPI */ ldr r1, =EMPI @ EMPI ldr r2, =0x80000000 str r2, [r1] ldr r2, [r1] /* Hardware DDR Read-Strobe Delay Calibration */ ldr r0, =DDR_HCAL @ DDR_HCAL ldr r1, =0x803ffc07 @ the offset is correct? -SC str r1, [r0] wait #5 ldr r1, [r0] /* Here we assume the hardware calibration alwasy be successful. -SC */ /* Set DMCEN bit in MDCNFG Register */ ldr r0, =MDCNFG @ MDCNFG ldr r1, [r0] orr r1, r1, #0x40000000 @ enable SDRAM for Normal Access str r1, [r0] #ifndef CFG_SKIP_DRAM_SCRUB /* scrub/init SDRAM if enabled/present */ /* ldr r11, =0xa0000000 /\* base address of SDRAM (CFG_DRAM_BASE) *\/ */ /* ldr r12, =0x04000000 /\* size of memory to scrub (CFG_DRAM_SIZE) *\/ */ /* mov r8,r12 /\* save DRAM size (mk: why???) *\/ */ ldr r8, =0xa0000000 /* base address of SDRAM (CFG_DRAM_BASE) */ ldr r9, =0x04000000 /* size of memory to scrub (CFG_DRAM_SIZE) */ mov r0, #0 /* scrub with 0x0000:0000 */ mov r1, #0 mov r2, #0 mov r3, #0 mov r4, #0 mov r5, #0 mov r6, #0 mov r7, #0 10: /* fastScrubLoop */ subs r9, r9, #32 /* 32 bytes/line */ stmia r8!, {r0-r7} beq 15f b 10b #endif /* CFG_SKIP_DRAM_SCRUB */ 15: /* Mask all interrupts */ mov r1, #0 mcr p6, 0, r1, c1, c0, 0 @ ICMR /* Disable software and data breakpoints */ mov r0, #0 mcr p15,0,r0,c14,c8,0 /* ibcr0 */ mcr p15,0,r0,c14,c9,0 /* ibcr1 */ mcr p15,0,r0,c14,c4,0 /* dbcon */ /* Enable all debug functionality */ mov r0,#0x80000000 mcr p14,0,r0,c10,c0,0 /* dcsr */ /* We are finished with Intel's memory controller initialisation */ /* ---------------------------------------------------------------- */ /* End lowlevel_init */ /* ---------------------------------------------------------------- */ endlowlevel_init: mov pc, lr /* @******************************************************************************** @ DDR calibration @ @ This function is used to calibrate DQS delay lines. @ Monahans supports three ways to do it. One is software @ calibration. Two is hardware calibration. Three is hybrid @ calibration. @ @ TBD @ -SC ddr_calibration: @ Case 1: Write the correct delay value once @ Configure DDR_SCAL Register ldr r0, =DDR_SCAL @ DDR_SCAL q ldr r1, =0xaf2f2f2f str r1, [r0] ldr r1, [r0] */ /* @ Case 2: Software Calibration @ Write test pattern to memory ldr r5, =0x0faf0faf @ Data Pattern ldr r4, =0xa0000000 @ DDR ram str r5, [r4] mov r1, =0x0 @ delay count mov r6, =0x0 mov r7, =0x0 ddr_loop1: add r1, r1, =0x1 cmp r1, =0xf ble end_loop mov r3, r1 mov r0, r1, lsl #30 orr r3, r3, r0 mov r0, r1, lsl #22 orr r3, r3, r0 mov r0, r1, lsl #14 orr r3, r3, r0 orr r3, r3, =0x80000000 ldr r2, =DDR_SCAL str r3, [r2] ldr r2, [r4] cmp r2, r5 bne ddr_loop1 mov r6, r1 ddr_loop2: add r1, r1, =0x1 cmp r1, =0xf ble end_loop mov r3, r1 mov r0, r1, lsl #30 orr r3, r3, r0 mov r0, r1, lsl #22 orr r3, r3, r0 mov r0, r1, lsl #14 orr r3, r3, r0 orr r3, r3, =0x80000000 ldr r2, =DDR_SCAL str r3, [r2] ldr r2, [r4] cmp r2, r5 be ddr_loop2 mov r7, r2 add r3, r6, r7 lsr r3, r3, =0x1 mov r0, r1, lsl #30 orr r3, r3, r0 mov r0, r1, lsl #22 orr r3, r3, r0 mov r0, r1, lsl #14 orr r3, r3, r0 orr r3, r3, =0x80000000 ldr r2, =DDR_SCAL end_loop: @ Case 3: Hardware Calibratoin ldr r0, =DDR_HCAL @ DDR_HCAL ldr r1, =0x803ffc07 @ the offset is correct? -SC str r1, [r0] wait #5 ldr r1, [r0] mov pc, lr */ |