blob: 47debb72092dc234863960cf88c35de3ecfae604 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2001, 2002 Rowley Associates Limited. *
* *
* This file may be distributed under the terms of the License Agreement *
* provided with this software. *
* *
* THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE *
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. *
*****************************************************************************/
/*****************************************************************************
* Preprocessor Definitions
* ------------------------
*
* VECTORED_IRQ_INTERRUPTS
*
* Enable vectored IRQ interrupts. If defined, the PC register will be loaded
* with the contents of the VICVectAddr register on an IRQ exception.
*
* USE_PLL
*
* If defined, connect PLL as processor clock source. If undefined, the
* oscillator clock will be used.
*
* PLLCFG_VAL
*
* Override the default PLL configuration (multiplier = 5, divider = 2)
* by defining PLLCFG_VAL.
*
* USE_MAM
*
* If defined then the memory accelerator module (MAM) will be enabled.
*
* MAMCR_VAL & MAMTIM_VAL
*
* Override the default MAM configuration (fully enabled, 3 fetch cycles)
* by defining MAMCR_VAL and MAMTIM_VAL.
*
* VPBDIV_VAL
*
* If defined then this value will be used to configure the VPB divider.
*
* SRAM_EXCEPTIONS
*
* If defined, enable copying and re-mapping of interrupt vectors from User
* FLASH to SRAM. If undefined, interrupt vectors will be mapped in User
* FLASH.
*
*****************************************************************************/
#ifndef PLLCFG_VAL
#define PLLCFG_VAL 0x24
#endif
#ifndef MAMCR_VAL
#define MAMCR_VAL 2
#endif
#ifndef MAMTIM_VAL
#define MAMTIM_VAL 3
#endif
#define MAMCR_OFFS 0x000
#define MAMTIM_OFFS 0x004
#define PLLCON_OFFS 0x080
#define PLLCFG_OFFS 0x084
#define PLLSTAT_OFFS 0x088
#define PLLFEED_OFFS 0x08C
#define VPBDIV_OFFS 0x100
.section .vectors, "ax"
.code 32
.align 0
/*****************************************************************************
* Exception Vectors *
*****************************************************************************/
_vectors:
ldr pc, [pc, #reset_handler_address - . - 8] /* reset */
ldr pc, [pc, #undef_handler_address - . - 8] /* undefined instruction */
ldr pc, [pc, #swi_handler_address - . - 8] /* swi handler */
ldr pc, [pc, #pabort_handler_address - . - 8] /* abort prefetch */
ldr pc, [pc, #dabort_handler_address - . - 8] /* abort data */
#ifdef VECTORED_IRQ_INTERRUPTS
.word 0xB9205F84 /* boot loader checksum */
ldr pc, [pc, #-0xFF0] /* irq handler */
#else
.word 0xB8A06F60 /* boot loader checksum */
ldr pc, [pc, #irq_handler_address - . - 8] /* irq handler */
#endif
ldr pc, [pc, #fiq_handler_address - . - 8] /* fiq handler */
reset_handler_address:
.word reset_handler
undef_handler_address:
.word undef_handler
swi_handler_address:
.word swi_handler
pabort_handler_address:
.word pabort_handler
dabort_handler_address:
.word dabort_handler
irq_handler_address:
.word irq_handler
fiq_handler_address:
.word fiq_handler
.section .init, "ax"
.code 32
.align 0
/******************************************************************************
* *
* Default exception handlers *
* *
******************************************************************************/
reset_handler:
#if defined(USE_PLL) || defined(USE_MAM) || defined(VPBDIV_VAL)
ldr r0, =0xE01FC000
#endif
#if defined(USE_PLL)
/* Configure PLL Multiplier/Divider */
ldr r1, =PLLCFG_VAL
str r1, [r0, #PLLCFG_OFFS]
/* Enable PLL */
mov r1, #0x1
str r1, [r0, #PLLCON_OFFS]
mov r1, #0xAA
str r1, [r0, #PLLFEED_OFFS]
mov r1, #0x55
str r1, [r0, #PLLFEED_OFFS]
/* Wait for PLL to lock */
pll_lock_loop:
ldr r1, [r0, #PLLSTAT_OFFS]
tst r1, #0x400
beq pll_lock_loop
/* PLL Locked, connect PLL as clock source */
mov r1, #0x3
str r1, [r0, #PLLCON_OFFS]
mov r1, #0xAA
str r1, [r0, #PLLFEED_OFFS]
mov r1, #0x55
str r1, [r0, #PLLFEED_OFFS]
#endif
#if defined(USE_MAM)
mov r1, #0
str r1, [r0, #MAMCR_OFFS]
ldr r1, =MAMTIM_VAL
str r1, [r0, #MAMTIM_OFFS]
ldr r1, =MAMCR_VAL
str r1, [r0, #MAMCR_OFFS]
#endif
#if defined(VPBDIV_VAL)
ldr r1, =VPBDIV_VAL
str r1, [r0, #VPBDIV_OFFS]
#endif
#if defined(SRAM_EXCEPTIONS)
/* Copy exception vectors into SRAM */
mov r8, #0x40000000
ldr r9, =_vectors
ldmia r9!, {r0-r7}
stmia r8!, {r0-r7}
ldmia r9!, {r0-r6}
stmia r8!, {r0-r6}
/* Re-map interrupt vectors from SRAM */
ldr r0, MEMMAP
mov r1, #2 /* User RAM Mode. Interrupt vectors are re-mapped from SRAM */
str r1, [r0]
#endif /* SRAM_EXCEPTIONS */
b _start
#ifdef SRAM_EXCEPTIONS
MEMMAP:
.word 0xE01FC040
#endif
/******************************************************************************
* *
* Default exception handlers *
* These are declared weak symbols so they can be redefined in user code. *
* *
******************************************************************************/
undef_handler:
b undef_handler
swi_handler:
b swi_handler
pabort_handler:
b pabort_handler
dabort_handler:
b dabort_handler
irq_handler:
b irq_handler
fiq_handler:
b fiq_handler
.weak undef_handler, swi_handler, pabort_handler, dabort_handler, irq_handler, fiq_handler