#include <common.h> #include <config.h> ? /* ?************************************************************************* ?* ?* Jump vector table as in table 3.1 in [1] ?*/ ? ? .globl _start _start:??????? b?????? start_code ???????? ldr???? pc,_undefined_instruction ? _undefined_instruction:????? .word undefined_instruction _software_interrupt:??? .word software_interrupt _prefetch_abort:????????? .word prefetch_abort _data_abort:??????????????? .word data_abort _not_used:????????????????? .word not_used _irq:??????????????????? .word irq _fiq:???????????????????? .word fiq ? ???????? .balignl 16,0xdeadbeef ? ? ?* Startup Code (called from the ARM reset exception vector) ?* do important init only if we don't start from memory! ?* relocate armboot to ram ?* setup stack ?* jump to second stage ?*/ ? _TEXT_BASE: ???????? .word???????? TEXT_BASE ? .globl _armboot_start _armboot_start: ???????? .word _start ? ?* These are defined in the board-specific linker script. ?*/ .globl _bss_start _bss_start: ???????? .word __bss_start ? .globl _bss_end _bss_end: ???????? .word _end ? #ifdef CONFIG_USE_IRQ /* IRQ stack memory (calculated at run-time) */ .globl IRQ_STACK_START IRQ_STACK_START: ???????? .word???????? 0x0badc0de ? .globl FIQ_STACK_START FIQ_STACK_START: ???????? .word 0x0badc0de #endif ? ? ?* the actual start code start_code: ???????? /* ???????? ?* set the cpu to SVC32 mode ???????? ?*/ ???????? mrs?? r0,cpsr ???????? bic??? r0,r0,#0x1f ???????? orr??? r0,#0xd3 ???????? msr?? cpsr,r0 ? ???????? bl????? coloured_LED_init ???????? bl????? red_LED_on ? #if???? defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) ???????? ?* relocate exception table ???????? ldr???? r0,=_start ???????? ldr???? r1,=0x0 ???????? mov? r2,#16 copyex: ???????? subs r2,r2,#1 ???????? ldr???? r3,[r0],#4 ???????? str???? r3,[r1],'sans-serif'">???????? bne?? copyex #endif ? #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) ???????? /* turn off the watchdog */ ? # if defined(CONFIG_S3C2400) #? define pWTCON??? 0x15300000 #? define INTMSK?????? 0x14400008??????? /* Interupt-Controller base addresses */ #? define CLKDIVN???? 0x14800014??????? /* clock divisor register */ #else #? define pWTCON??? 0x53000000 #? define INTMSK?????? 0x4A000008??????? /* Interupt-Controller base addresses */ #? define INTSUBMSK???????? 0x4A00001C #? define CLKDIVN???? 0x4C000014?????? /* clock divisor register */ # endif ? ???????? mov? r1,#0x0 ???????? str???? r1,[r0] ? ???????? ?* mask all IRQs by setting all bits in the INTMR - default # if defined(CONFIG_S3C2410) ???????? /* FCLK:HCLK:PCLK = 1:2:4 */ ???????? /* default FCLK is 120 MHz ! */ #endif??????? /* CONFIG_S3C2400 || CONFIG_S3C2410 */ ? ???????? ?* we do sys-critical inits only at reboot, ???????? ?* not when booting from ram! #ifndef CONFIG_SKIP_LOWLEVEL_INIT ???????? bl????? cpu_init_crit #ifndef CONFIG_SKIP_RELOCATE_UBOOT relocate:??????????????????????????????? /* relocate U-Boot to RAM?? ??? */ ???????? adr??? r0,_start???????????? /* r0 <- current position of code?? */ ?????????????????? /* test if we run from flash or RAM */ ???????? cmp? r0,r1?????????????????? /* don't reloc during debug???????? */ ???????? beq?? stack_setup ? ???????? ldr???? r2,_armboot_start ???????? sub?? r2,r3,r2????????????? /* r2 <- size of armboot??????????? */ ???????? add?? r2,r2????????????? /* r2 <- source end address???????? */ ? copy_loop: ???????? ldmia???????? r0!,{r3-r10}????????????????? /* copy from source address [r0]??? */ ???????? stmia????????? r1!,{r3-r10}????????????????? /* copy to?? target address [r1]??? */ ?????????????????? /* until source end addreee [r2]??? */ ???????? ble??? copy_loop #endif??????? /* CONFIG_SKIP_RELOCATE_UBOOT */ ? ???????? /* Set up the stack????????????????????????????????????????????????????? ??? */ stack_setup: ???????? /* upper 128 KiB: relocated uboot?? */ ???????? sub?? r0,#CONFIG_SYS_MALLOC_LEN?? /* malloc area????????????? */ ???????????????? */ #endif ???????? sub?? sp,#12????????? /* leave 3 words for abort-stack??? */ ? clear_bss: ?????????????? /* find start of bss segment??????? */ ?????????????? /* stop here??????????????????????? */ ????????? /* clear??????????????????????????? */ ? clbss_l:str r2,[r0]???????????????? /* clear loop...??????????????????? */ ???????? add?? r0,r1 ???????? ble??? clbss_l ? ? _start_armboot:? .word start_armboot ? ? ? ?* CPU_init_critical registers ?* setup important registers ?* setup memory timing ?*/ ? ? cpu_init_crit: ???????? ?* flush v4 I/D caches ???????? mov? r0,#0 ???????? mcr?? p15,c7,0????? /* flush v3/v4 cache */ ????? /* flush v4 TLB */ ? ???????? ?* disable MMU stuff and caches ???????? mrc?? p15,c1,c0,0 ???? @ clear bits 13,9:8 (--V- --RS) ???? @ clear bits 7,2:0 (B--- -CAM) ???? @ set bit 2 (A) Align ???? @ set bit 12 (I) I-Cache ? ???????? ?* before relocating,we have to setup RAM timing ???????? ?* because memory timing is board-dependend,you will ???????? ?* find a lowlevel_init.S in your board directory. ???????? mov? ip,lr ? ???????? bl????? lowlevel_init ? ???????? mov? lr,ip ???????? mov? pc,lr #endif /* CONFIG_SKIP_LOWLEVEL_INIT */ …... |