📄 start.s
字号:
/* * Startup Code for S3C4510 CPU-core * * (C) Copyright 2004 * METER Chen * * http://www.cmtekchina.com * mailto:meterchen@263.net * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */#include <config.h>#include <version.h>/* * Jump vector table */.globl _start_start: b reset b undefined_handler b swi_handler b prefetch_handler b abort_handler nop b irq_handler b fiq_handlerundefined_handler: sub sp, sp, #4 stmfd sp!, {r0} ldr r0, =0x01000004 ldr r0, [r0] str r0, [sp, #4] ldmfd sp!, {r0, pc}swi_handler: sub sp, sp, #4 stmfd sp!, {r0} ldr r0, =0x01000008 ldr r0, [r0] str r0, [sp, #4] ldmfd sp!, {r0, pc}prefetch_handler: sub sp, sp, #4 stmfd sp!, {r0} ldr r0, =0x0100000c ldr r0, [r0] str r0, [sp, #4] ldmfd sp!, {r0, pc}abort_handler: sub sp, sp, #4 stmfd sp!, {r0} ldr r0, =0x01000010 ldr r0, [r0] str r0, [sp, #4] ldmfd sp!, {r0, pc}irq_handler: sub sp, sp, #4 stmfd sp!, {r0} ldr r0, =0x01000018 ldr r0, [r0] str r0, [sp, #4] ldmfd sp!, {r0, pc}fiq_handler: sub sp, sp, #4 stmfd sp!, {r0} ldr r0, =0x0100001c ldr r0, [r0] str r0, [sp, #4] ldmfd sp!, {r0, pc} .balignl 16,0xdeadbeef/* ************************************************************************* * * Startup Code (reset vector) * * do important init only if we don't start from memory! * relocate u-boot 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_STARTIRQ_STACK_START: .word 0x0badc0de/* IRQ stack memory (calculated at run-time) */.globl FIQ_STACK_STARTFIQ_STACK_START: .word 0x0badc0de#endif/* * the actual reset code */reset: /* * set the cpu to SVC32 mode */ mrs r0,cpsr bic r0,r0,#0x1f orr r0,r0,#0x13 msr cpsr,r0 /* * we do sys-critical inits only at reboot, * not when booting from ram! */#ifdef CONFIG_INIT_CRITICAL bl cpu_init_crit /* * before relocating, we have to setup RAM timing * because memory timing is board-dependend, you will * find a memsetup.S in your board directory. */ bl memsetup#endifrelocate: /* relocate U-Boot to RAM */ adr r0, _start /* r0 <- current position of code */ ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* don't reloc during debug */ beq stack_setup ldr r2, _armboot_start ldr r3, _bss_start sub r2, r3, r2 /* r2 <- size of armboot */ add r2, r0, 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] */ cmp r0, r2 /* until source end addreee [r2] */ ble copy_loop/* now copy to sram the interrupt vector*/ adr r0, real_vectors add r2, r0, #1024 ldr r1, =0x01000000 add r1, r1, #0x08vector_copy_loop: ldmia r0!, {r3-r10} stmia r1!, {r3-r10} cmp r0, r2 ble vector_copy_loop /* Set up the stack */stack_setup: ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ sub r0, r0, #CFG_MALLOC_LEN /* malloc area */ sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */#ifdef CONFIG_USE_IRQ sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endif sub sp, r0, #12 /* leave 3 words for abort-stack */ ldr pc, _start_armboot_start_armboot: .word start_armboot/* ************************************************************************* * * CPU_init_critical registers * * setup important registers * ************************************************************************* */#define ASIC_BASE 0x3ff0000#define INTMSK (ASIC_BASE+0x4008)cpu_init_crit: /* * mask all IRQs by clearing all bits in the INTMRs */ ldr r1,=INTMSK ldr r0, =0xffffffff str r0, [r1] mov pc, lr/*************************************************//* interrupt vectors *//*************************************************/real_vectors: b reset b undefined_instruction b software_interrupt b prefetch_abort b data_abort b not_used b irq b fiq/*************************************************/undefined_instruction: mov r6, #3 b resetsoftware_interrupt: mov r6, #4 b resetprefetch_abort: mov r6, #5 b resetdata_abort: mov r6, #6 b resetnot_used: /* we *should* never reach this */ mov r6, #7 b resetirq: mov r6, #8 b resetfiq: mov r6, #9 b reset
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -