/************************************************************/ /* Spidcom Technologies FILE NAME : start.S DESCRIPTION : software SDRAM image start HISTORY : -------------------------------------------------------------- DATE | AUTHOR | Version | Description -------------------------------------------------------------- 04/02/04 | Petillon | 1.0 | Creation */ /************************************************************/ #include "arm.h" #include "platform.h" #include "sdrams.h" #include "memory.h" /* external refs */ .global _start .global __platform_remap .global __bss_start__ .global __bss_end__ .global __vectors_start__ .global __vectors_end__ .global main /* */ /* Main code executing in SDRAM */ /* */ .section ".text", "ax" _start: mrs r0, cpsr orr r0, r0, #(PSR_I_BIT | PSR_F_BIT) /* Disable IRQ & FIQ */ msr cpsr_c, r0 /* Now we're in SDRAM */ /* Remap Flash and SRAM (platform dependant) */ bl __platform_remap /* copy nominal vectors to 0x0 */ ldr r12, = __vectors_start__ ldr r14, = __vectors_end__ mov r13, #0x0 2: ldmia r12!, {r0-r11} stmia r13!, {r0-r11} cmp r12, r14 blo 2b /* Now all the code is copied and mapped, we can enable I-Cache */ /* First invalidate */ mov r0, #0 mcr p15, 0, r0, c7, c5, 0 /* Then enable */ mrc p15, 0, r0, c1, c0, 0 orr r0, r0, #(1 << 12) /* enable I-Cache */ bic r0, r0, #(1 << 2) /* disable D-Cache */ bic r0, r0, #(1 << 0) /* disable MMU */ mcr p15, 0, r0, c1, c0, 0 /* clear bss */ ldr r12, = __bss_start__ ldr r14, = __bss_end__ mov r0, #0x0 mov r1, #0x0 mov r2, #0x0 mov r3, #0x0 mov r4, #0x0 3: stmia r12!, {r0-r4} cmp r12, r14 blo 3b /* IRQ stack */ mrs r2, cpsr bic r2, r2, #MODE_MASK orr r2, r2, #MODE_IRQ msr cpsr_c, r2 /* enter IRQ mode */ mov lr, #0 ldr sp, .irq_stack /* back to SVC mode */ mrs r2, cpsr bic r2, r2, #MODE_MASK orr r2, r2, #MODE_SVC msr cpsr_c, r2 /* Set-up stacks for using C */ /* SVC stack */ ldr sp, .svc_stack /* IRQs are still disabled: should be enabled in main */ /* now branch to main */ bl main nop nop nop .irq_stack: .word SDRAM_BASE+IRQ_STACK_OFFSET .svc_stack: .word SDRAM_BASE+SVC_STACK_OFFSET