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