/***************************************************************************** * 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