| /* |
| * Memory Setup stuff - taken from blob memsetup.S |
| * |
| * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and |
| * Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl) |
| * |
| * Modified for the at91rm9200dk board by |
| * (C) Copyright 2004 |
| * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> |
| * |
| * 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> |
| |
| #ifdef CONFIG_BOOTBINFUNC |
| /* |
| * some parameters for the board |
| * |
| * This is based on rm9200dk.cfg for the BDI2000 from ABATRON which in |
| * turn is based on the boot.bin code from ATMEL |
| * |
| */ |
| |
| /* flash */ |
| #define MC_PUIA 0xFFFFFF10 |
| #define MC_PUIA_VAL 0x00000000 |
| #define MC_PUP 0xFFFFFF50 |
| #define MC_PUP_VAL 0x00000000 |
| #define MC_PUER 0xFFFFFF54 |
| #define MC_PUER_VAL 0x00000000 |
| #define MC_ASR 0xFFFFFF04 |
| #define MC_ASR_VAL 0x00000000 |
| #define MC_AASR 0xFFFFFF08 |
| #define MC_AASR_VAL 0x00000000 |
| #define EBI_CFGR 0xFFFFFF64 |
| #define EBI_CFGR_VAL 0x00000000 |
| #define SMC2_CSR 0xFFFFFF70 |
| #define SMC2_CSR_VAL 0x100032ad /* 16bit, 2 TDF, 4 WS */ |
| |
| /* clocks */ |
| #define PLLAR 0xFFFFFC28 |
| #define PLLAR_VAL 0x202CBE04 /* 207.360 MHz for PCK */ |
| #define PLLBR 0xFFFFFC2C |
| #define PLLBR_VAL 0x10483E0E /* 48.054857 MHz (divider by 2 for USB) */ |
| #define MCKR 0xFFFFFC30 |
| #define MCKR_VAL 0x00000202 /* PCK/3 = MCK Master Clock = 69.120MHz from PLLA */ |
| |
| /* sdram */ |
| #define PIOC_ASR 0xFFFFF870 |
| #define PIOC_ASR_VAL 0xFFFF0000 /* Configure PIOC as peripheral (D16/D31) */ |
| #define PIOC_BSR 0xFFFFF874 |
| #define PIOC_BSR_VAL 0x00000000 |
| #define PIOC_PDR 0xFFFFF804 |
| #define PIOC_PDR_VAL 0xFFFF0000 |
| #define EBI_CSA 0xFFFFFF60 |
| #define EBI_CSA_VAL 0x00000002 /* CS1=SDRAM */ |
| #define SDRC_CR 0xFFFFFF98 |
| #define SDRC_CR_VAL 0x3399c1d4 /* set up the SDRAM */ |
| #define SDRAM 0x20000000 /* address of the SDRAM */ |
| #define SDRAM1 0x20000080 /* address of the SDRAM */ |
| #define SDRAM_VAL 0x00000000 /* value written to SDRAM */ |
| #define SDRC_MR 0xFFFFFF90 |
| #define SDRC_MR_VAL 0x00000002 /* Precharge All */ |
| #define SDRC_MR_VAL1 0x00000004 /* refresh */ |
| #define SDRC_MR_VAL2 0x00000003 /* Load Mode Register */ |
| #define SDRC_MR_VAL3 0x00000000 /* Normal Mode */ |
| #define SDRC_TR 0xFFFFFF94 |
| #define SDRC_TR_VAL 0x000002E0 /* Write refresh rate */ |
| |
| |
| _MTEXT_BASE: |
| #undef START_FROM_MEM |
| #ifdef START_FROM_MEM |
| .word TEXT_BASE-PHYS_FLASH_1 |
| #else |
| .word TEXT_BASE |
| #endif |
| |
| .globl lowlevelinit |
| lowlevelinit: |
| /* memory control configuration */ |
| /* this isn't very elegant, but what the heck */ |
| ldr r0, =SMRDATA |
| ldr r1, _MTEXT_BASE |
| sub r0, r0, r1 |
| add r2, r0, #80 |
| 0: |
| /* the address */ |
| ldr r1, [r0], #4 |
| /* the value */ |
| ldr r3, [r0], #4 |
| str r3, [r1] |
| cmp r2, r0 |
| bne 0b |
| /* delay - this is all done by guess */ |
| ldr r0, =0x00010000 |
| 1: |
| subs r0, r0, #1 |
| bhi 1b |
| ldr r0, =SMRDATA1 |
| ldr r1, _MTEXT_BASE |
| sub r0, r0, r1 |
| add r2, r0, #176 |
| 2: |
| /* the address */ |
| ldr r1, [r0], #4 |
| /* the value */ |
| ldr r3, [r0], #4 |
| str r3, [r1] |
| cmp r2, r0 |
| bne 2b |
| |
| /* everything is fine now */ |
| mov pc, lr |
| |
| .ltorg |
| |
| SMRDATA: |
| .word MC_PUIA |
| .word MC_PUIA_VAL |
| .word MC_PUP |
| .word MC_PUP_VAL |
| .word MC_PUER |
| .word MC_PUER_VAL |
| .word MC_ASR |
| .word MC_ASR_VAL |
| .word MC_AASR |
| .word MC_AASR_VAL |
| .word EBI_CFGR |
| .word EBI_CFGR_VAL |
| .word SMC2_CSR |
| .word SMC2_CSR_VAL |
| .word PLLAR |
| .word PLLAR_VAL |
| .word PLLBR |
| .word PLLBR_VAL |
| .word MCKR |
| .word MCKR_VAL |
| /* SMRDATA is 80 bytes long */ |
| /* here there's a delay of 100 */ |
| SMRDATA1: |
| .word PIOC_ASR |
| .word PIOC_ASR_VAL |
| .word PIOC_BSR |
| .word PIOC_BSR_VAL |
| .word PIOC_PDR |
| .word PIOC_PDR_VAL |
| .word EBI_CSA |
| .word EBI_CSA_VAL |
| .word SDRC_CR |
| .word SDRC_CR_VAL |
| .word SDRC_MR |
| .word SDRC_MR_VAL |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRC_MR |
| .word SDRC_MR_VAL1 |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRC_MR |
| .word SDRC_MR_VAL2 |
| .word SDRAM1 |
| .word SDRAM_VAL |
| .word SDRC_TR |
| .word SDRC_TR_VAL |
| .word SDRAM |
| .word SDRAM_VAL |
| .word SDRC_MR |
| .word SDRC_MR_VAL3 |
| .word SDRAM |
| .word SDRAM_VAL |
| /* SMRDATA1 is 176 bytes long */ |
| #endif /* CONFIG_BOOTBINFUNC */ |