|
@@ -12,6 +12,7 @@
|
|
|
* 2006-03-13 Bernard first version
|
|
|
* 2006-10-05 Alsor.Z for s3c2440 initialize
|
|
|
* 2008-01-29 Yi.Qiu for QEMU emulator
|
|
|
+ * 2010-03-15 Gary Lee Modified the structure of startcode
|
|
|
*/
|
|
|
|
|
|
#define CONFIG_STACKSIZE 512
|
|
@@ -37,6 +38,10 @@
|
|
|
#define S_R1 4
|
|
|
#define S_R0 0
|
|
|
|
|
|
+#define CLK_CTL_BASE 0x4C000000 /* Gary Lee */
|
|
|
+#define MDIV_405 0x7f << 12 /* Gary Lee */
|
|
|
+#define PSDIV_405 0x21 /* Gary Lee */
|
|
|
+
|
|
|
.equ USERMODE, 0x10
|
|
|
.equ FIQMODE, 0x11
|
|
|
.equ IRQMODE, 0x12
|
|
@@ -88,14 +93,14 @@
|
|
|
|
|
|
.globl _start
|
|
|
_start:
|
|
|
- b reset
|
|
|
- ldr pc, _vector_undef
|
|
|
- ldr pc, _vector_swi
|
|
|
- ldr pc, _vector_pabt
|
|
|
- ldr pc, _vector_dabt
|
|
|
- ldr pc, _vector_resv
|
|
|
- ldr pc, _vector_irq
|
|
|
- ldr pc, _vector_fiq
|
|
|
+ b reset
|
|
|
+ ldr pc, _vector_undef
|
|
|
+ ldr pc, _vector_swi
|
|
|
+ ldr pc, _vector_pabt
|
|
|
+ ldr pc, _vector_dabt
|
|
|
+ ldr pc, _vector_resv
|
|
|
+ ldr pc, _vector_irq
|
|
|
+ ldr pc, _vector_fiq
|
|
|
|
|
|
_vector_undef: .word vector_undef
|
|
|
_vector_swi: .word vector_swi
|
|
@@ -105,7 +110,7 @@ _vector_resv: .word vector_resv
|
|
|
_vector_irq: .word vector_irq
|
|
|
_vector_fiq: .word vector_fiq
|
|
|
|
|
|
-.balignl 16,0xdeadbeef
|
|
|
+.balignl 16, 0xdeadbeef
|
|
|
|
|
|
/*
|
|
|
*************************************************************************
|
|
@@ -116,26 +121,21 @@ _vector_fiq: .word vector_fiq
|
|
|
* jump to second stage
|
|
|
*
|
|
|
*************************************************************************
|
|
|
- */
|
|
|
-
|
|
|
-_TEXT_BASE:
|
|
|
+ */
|
|
|
+_TEXT_BASE: /* TEXT_BASE was defined in rtconfig.py */
|
|
|
.word TEXT_BASE
|
|
|
|
|
|
-/*
|
|
|
- * rtthread kernel start and end
|
|
|
- * which are defined in linker script
|
|
|
- */
|
|
|
+/* rtthread kernel start and end which are defined in linker script */
|
|
|
.globl _rtthread_start
|
|
|
_rtthread_start:
|
|
|
.word _start
|
|
|
-
|
|
|
+
|
|
|
+/* _end was defined in link script */
|
|
|
.globl _rtthread_end
|
|
|
_rtthread_end:
|
|
|
.word _end
|
|
|
|
|
|
-/*
|
|
|
- * rtthread bss start and end which are defined in linker script
|
|
|
- */
|
|
|
+/* rtthread bss start and end which are defined in linker script */
|
|
|
.globl _bss_start
|
|
|
_bss_start:
|
|
|
.word __bss_start
|
|
@@ -165,21 +165,73 @@ ABORT_STACK_START:
|
|
|
_STACK_START:
|
|
|
.word _svc_stack_start + 4096
|
|
|
|
|
|
-/* ----------------------------------entry------------------------------*/
|
|
|
+.globl _load_address
|
|
|
+#if defined (__FLASH_BUILD__)
|
|
|
+_load_address:
|
|
|
+ .word ROM_BASE + _TEXT_BASE
|
|
|
+#else
|
|
|
+_load_address:
|
|
|
+ .word RAM_BASE + _TEXT_BASE
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ *************************************************************************
|
|
|
+ * Actual start (entry point)
|
|
|
+ *************************************************************************
|
|
|
+ */
|
|
|
reset:
|
|
|
+ bl mode_svn32
|
|
|
+ bl watchdog_disable
|
|
|
+ bl interrupt_disable
|
|
|
+ bl sys_clock_setup
|
|
|
+ bl cpu_crit_init
|
|
|
+ bl interrupt_vector_setup
|
|
|
+ bl stack_setup
|
|
|
+ bl bss_clear
|
|
|
+ /* call C++ constructors of global objects */
|
|
|
+ ldr r0, =__ctors_start__
|
|
|
+ ldr r1, =__ctors_end__
|
|
|
|
|
|
- /* set the cpu to SVC32 mode */
|
|
|
- mrs r0,cpsr
|
|
|
- bic r0,r0,#MODEMASK
|
|
|
- orr r0,r0,#SVCMODE
|
|
|
- msr cpsr,r0
|
|
|
-
|
|
|
- /* watch dog disable */
|
|
|
- ldr r0,=WTCON
|
|
|
- ldr r1,=0x0
|
|
|
- str r1,[r0]
|
|
|
+ctor_loop:
|
|
|
+ cmp r0, r1
|
|
|
+ beq kernel_start
|
|
|
+ ldr r2, [r0], #4
|
|
|
+ stmfd sp!, {r0-r1}
|
|
|
+ mov lr, pc
|
|
|
+ bx r2
|
|
|
+ ldmfd sp!, {r0-r1}
|
|
|
+ b ctor_loop
|
|
|
+
|
|
|
+kernel_start:
|
|
|
+ /* start RT-Thread Kernel */
|
|
|
+ ldr pc, _rtthread_startup
|
|
|
+
|
|
|
+_rtthread_startup:
|
|
|
+ .word rtthread_startup
|
|
|
+/*
|
|
|
+ *************************************************************************
|
|
|
+ * Subroutines
|
|
|
+ *************************************************************************
|
|
|
+ */
|
|
|
+ /* set the cpu to SVC32 mode */
|
|
|
+mode_svn32:
|
|
|
+ mrs r0, cpsr
|
|
|
+ bic r0, r0,#MODEMASK
|
|
|
+ orr r0, r0,#SVCMODE
|
|
|
+ msr cpsr, r0
|
|
|
+
|
|
|
+ mov pc, lr
|
|
|
+
|
|
|
+ /* watch dog disable */
|
|
|
+watchdog_disable:
|
|
|
+ ldr r0, =WTCON
|
|
|
+ ldr r1, =0x0
|
|
|
+ str r1, [r0]
|
|
|
+
|
|
|
+ mov pc, lr
|
|
|
|
|
|
/* mask all IRQs by clearing all bits in the INTMRs */
|
|
|
+interrupt_disable:
|
|
|
ldr r1, =INTMSK
|
|
|
ldr r0, =0xffffffff
|
|
|
str r0, [r1]
|
|
@@ -187,8 +239,50 @@ reset:
|
|
|
ldr r0, =0x7fff /*all sub interrupt disable */
|
|
|
str r0, [r1]
|
|
|
|
|
|
+ mov pc, lr
|
|
|
+
|
|
|
+sys_clock_setup: /* FCLK:HCLK:PCLK = 1:4:8 */
|
|
|
+ ldr r0, =CLKDIVN
|
|
|
+ mov r1, #5
|
|
|
+ str r1, [r0]
|
|
|
+
|
|
|
+ mrc p15, 0, r1, c1, c0, 0 /* switch to asynchronous mode */
|
|
|
+ orr r1, r1, #0xc0000000
|
|
|
+ mcr p15, 0, r1, c1, c0, 0
|
|
|
+
|
|
|
+ mov r1, #CLK_CTL_BASE
|
|
|
+ mov r2, #MDIV_405
|
|
|
+ add r2, r2, #PSDIV_405
|
|
|
+ str r2, [r1, #0x04] /* MPLLCON Gary Lee */
|
|
|
+
|
|
|
+ mov pc, lr
|
|
|
+
|
|
|
+/*==============================================================================*/
|
|
|
+cpu_crit_init:
|
|
|
+ /* flush v4 I/D caches */
|
|
|
+
|
|
|
+ mov r0, #0
|
|
|
+ mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
|
|
|
+ mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
|
|
|
+
|
|
|
+ /* disable MMU stuff and caches */
|
|
|
+ mrc p15, 0, r0, c1, c0, 0
|
|
|
+ bic r0, r0, #0x00002300 /* clear bits 13, 9:8 (--V- --RS) */
|
|
|
+ bic r0, r0, #0x00000087 /* clear bits 7, 2:0 (B--- -CAM) */
|
|
|
+ orr r0, r0, #0x00000002 /* set bit 2 (A) Align */
|
|
|
+ orr r0, r0, #0x00001000 /* set bit 12 (I) I-Cache */
|
|
|
+ mcr p15, 0, r0, c1, c0, 0
|
|
|
+
|
|
|
+ mov ip, lr
|
|
|
+
|
|
|
+ bl lowlevel_init
|
|
|
+
|
|
|
+ mov lr, ip
|
|
|
+ mov pc, lr
|
|
|
+
|
|
|
/* set interrupt vector */
|
|
|
- ldr r0, _load_address
|
|
|
+interrupt_vector_setup:
|
|
|
+ ldr r0, _load_address /* _load_address = 0x30000000 */
|
|
|
mov r1, #0x0 /* target address */
|
|
|
add r2, r0, #0x20 /* size, 32bytes */
|
|
|
|
|
@@ -198,10 +292,39 @@ copy_loop:
|
|
|
cmp r0, r2 /* until source end addreee [r2] */
|
|
|
ble copy_loop
|
|
|
|
|
|
- /* setup stack */
|
|
|
- bl stack_setup
|
|
|
+ mov pc, lr
|
|
|
+
|
|
|
+stack_setup:
|
|
|
+ mrs r0, cpsr
|
|
|
+ bic r0, r0, #MODEMASK
|
|
|
+ orr r1, r0, #UNDEFMODE|NOINT
|
|
|
+ msr cpsr_cxsf, r1 /* undef mode */
|
|
|
+ ldr sp, UNDEFINED_STACK_START
|
|
|
+
|
|
|
+ orr r1,r0,#ABORTMODE|NOINT
|
|
|
+ msr cpsr_cxsf,r1 /* abort mode */
|
|
|
+ ldr sp, ABORT_STACK_START
|
|
|
|
|
|
- /* clear .bss */
|
|
|
+ orr r1,r0,#IRQMODE|NOINT
|
|
|
+ msr cpsr_cxsf,r1 /* IRQ mode */
|
|
|
+ ldr sp, IRQ_STACK_START
|
|
|
+
|
|
|
+ orr r1,r0,#FIQMODE|NOINT
|
|
|
+ msr cpsr_cxsf,r1 /* FIQ mode */
|
|
|
+ ldr sp, FIQ_STACK_START
|
|
|
+
|
|
|
+ bic r0,r0,#MODEMASK
|
|
|
+ orr r1,r0,#SVCMODE|NOINT
|
|
|
+ msr cpsr_cxsf,r1 /* SVC mode */
|
|
|
+
|
|
|
+ ldr sp, _STACK_START
|
|
|
+
|
|
|
+ /* USER mode is not initialized. */
|
|
|
+
|
|
|
+ mov pc,lr /* The LR register may be not valid for the mode changes.*/
|
|
|
+
|
|
|
+ /* clear .bss */
|
|
|
+bss_clear:
|
|
|
mov r0,#0 /* get a zero */
|
|
|
ldr r1,=__bss_start /* bss start */
|
|
|
ldr r2,=__bss_end /* bss end */
|
|
@@ -209,37 +332,10 @@ copy_loop:
|
|
|
bss_loop:
|
|
|
cmp r1,r2 /* check if data to clear */
|
|
|
strlo r0,[r1],#4 /* clear 4 bytes */
|
|
|
- blo bss_loop /* loop until done */
|
|
|
+ blo bss_loop /* loop until done */
|
|
|
|
|
|
- /* call C++ constructors of global objects */
|
|
|
- ldr r0, =__ctors_start__
|
|
|
- ldr r1, =__ctors_end__
|
|
|
+ mov pc, lr
|
|
|
|
|
|
-ctor_loop:
|
|
|
- cmp r0, r1
|
|
|
- beq ctor_end
|
|
|
- ldr r2, [r0], #4
|
|
|
- stmfd sp!, {r0-r1}
|
|
|
- mov lr, pc
|
|
|
- bx r2
|
|
|
- ldmfd sp!, {r0-r1}
|
|
|
- b ctor_loop
|
|
|
-
|
|
|
-ctor_end:
|
|
|
-
|
|
|
- /* start RT-Thread Kernel */
|
|
|
- ldr pc, _rtthread_startup
|
|
|
-
|
|
|
-_rtthread_startup:
|
|
|
- .word rtthread_startup
|
|
|
-#if defined (__FLASH_BUILD__)
|
|
|
-_load_address:
|
|
|
- .word ROM_BASE + _TEXT_BASE
|
|
|
-#else
|
|
|
-_load_address:
|
|
|
- .word RAM_BASE + _TEXT_BASE
|
|
|
-#endif
|
|
|
-
|
|
|
/*
|
|
|
*************************************************************************
|
|
|
*
|
|
@@ -358,33 +454,4 @@ _interrupt_thread_switch:
|
|
|
|
|
|
ldmfd sp!, {r0-r12,lr,pc} /* pop new task's r0-r12,lr & pc */
|
|
|
|
|
|
-stack_setup:
|
|
|
- mrs r0, cpsr
|
|
|
- bic r0, r0, #MODEMASK
|
|
|
- orr r1, r0, #UNDEFMODE|NOINT
|
|
|
- msr cpsr_cxsf, r1 /* undef mode */
|
|
|
- ldr sp, UNDEFINED_STACK_START
|
|
|
-
|
|
|
- orr r1,r0,#ABORTMODE|NOINT
|
|
|
- msr cpsr_cxsf,r1 /* abort mode */
|
|
|
- ldr sp, ABORT_STACK_START
|
|
|
-
|
|
|
- orr r1,r0,#IRQMODE|NOINT
|
|
|
- msr cpsr_cxsf,r1 /* IRQ mode */
|
|
|
- ldr sp, IRQ_STACK_START
|
|
|
-
|
|
|
- orr r1,r0,#FIQMODE|NOINT
|
|
|
- msr cpsr_cxsf,r1 /* FIQ mode */
|
|
|
- ldr sp, FIQ_STACK_START
|
|
|
-
|
|
|
- bic r0,r0,#MODEMASK
|
|
|
- orr r1,r0,#SVCMODE|NOINT
|
|
|
- msr cpsr_cxsf,r1 /* SVC mode */
|
|
|
-
|
|
|
- ldr sp, _STACK_START
|
|
|
-
|
|
|
- /* USER mode is not initialized. */
|
|
|
-
|
|
|
- mov pc,lr /* The LR register may be not valid for the mode changes.*/
|
|
|
-
|
|
|
/*/*}*/
|