summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s5l8702/crt0.S
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/s5l8702/crt0.S')
-rw-r--r--firmware/target/arm/s5l8702/crt0.S67
1 files changed, 53 insertions, 14 deletions
diff --git a/firmware/target/arm/s5l8702/crt0.S b/firmware/target/arm/s5l8702/crt0.S
index 3d1ee2bdfd..915c3f680b 100644
--- a/firmware/target/arm/s5l8702/crt0.S
+++ b/firmware/target/arm/s5l8702/crt0.S
@@ -46,17 +46,20 @@ newstart2:
46 msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */ 46 msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */
47 47
48#ifdef BOOTLOADER 48#ifdef BOOTLOADER
49 /* Relocate ourself to IRAM - we have been loaded to DRAM */ 49 /* Relocate ourself to IRAM1 - we have been loaded to IRAM0 */
50 mov r0, #0x08000000 /* source (DRAM) */ 50 ldr r0, =_dfuloadaddr
51 mov r1, #0x22000000 /* dest (IRAM) */ 51 ldr r1, =_movestart
52 ldr r2, =_dataend 52 ldr r2, =_moveend
531: 531:
54 cmp r2, r1 54 ldmia r0!, {r3-r10}
55 ldrhi r3, [r0], #4 55 stmia r1!, {r3-r10}
56 strhi r3, [r1], #4 56 cmp r1, r2
57 bhi 1b 57 blt 1b
58 58
59 ldr pc, =start_loc /* jump to the relocated start_loc: */ 59 ldr pc, =start_loc /* jump to the relocated start_loc: */
60
61 .section .init.text,"ax",%progbits
62 .global start_loc
60start_loc: 63start_loc:
61#endif 64#endif
62 65
@@ -66,11 +69,11 @@ start_loc:
66 mcr p15, 0, r0, c1, c0, 0 /* disable caches and protection unit */ 69 mcr p15, 0, r0, c1, c0, 0 /* disable caches and protection unit */
67 70
68.cleancache: 71.cleancache:
69 mrc p15, 0, r15,c7,c10,3 72 mrc p15, 0, r15, c7, c10, 3 /* test and clean dcache */
70 bne .cleancache 73 bne .cleancache
71 mov r0, #0 74 mov r0, #0
72 mcr p15, 0, r0,c7,c10,4 75 mcr p15, 0, r0, c7, c10, 4 /* drain write buffer */
73 mcr p15, 0, r0,c7,c5,0 76 mcr p15, 0, r0, c7, c5, 0 /* invalidate icache */
74 77
75 /* reset VIC controller */ 78 /* reset VIC controller */
76 ldr r1, =0x38e00000 79 ldr r1, =0x38e00000
@@ -86,7 +89,15 @@ start_loc:
86 str r0, [r1,#0x14] 89 str r0, [r1,#0x14]
87 str r0, [r2,#0x14] 90 str r0, [r2,#0x14]
88 91
89#if !defined(BOOTLOADER) 92#if defined(BOOTLOADER)
93 /* SPI speed is limited when icache is not active. Not worth
94 * activating dcache, it is almost useless on pre-init stage
95 * and the TLB needs 16Kb in detriment of the bootloader.
96 */
97 mrc p15, 0, r0, c1, c0, 0
98 orr r0, r0, #1<<12 /* enable icache */
99 mcr p15, 0, r0, c1, c0, 0
100#else
90 bl memory_init 101 bl memory_init
91 102
92 /* Copy interrupt vectors to iram */ 103 /* Copy interrupt vectors to iram */
@@ -98,7 +109,6 @@ start_loc:
98 ldrhi r1, [r4], #4 109 ldrhi r1, [r4], #4
99 strhi r1, [r2], #4 110 strhi r1, [r2], #4
100 bhi 1b 111 bhi 1b
101#endif
102 112
103 /* Initialise bss section to zero */ 113 /* Initialise bss section to zero */
104 ldr r2, =_edata 114 ldr r2, =_edata
@@ -109,7 +119,6 @@ start_loc:
109 strhi r4, [r2], #4 119 strhi r4, [r2], #4
110 bhi 1b 120 bhi 1b
111 121
112#ifndef BOOTLOADER
113 /* Copy icode and data to ram */ 122 /* Copy icode and data to ram */
114 ldr r2, =_iramstart 123 ldr r2, =_iramstart
115 ldr r3, =_iramend 124 ldr r3, =_iramend
@@ -159,3 +168,33 @@ start_loc:
159 bhi 1b 168 bhi 1b
160 169
161 b main 170 b main
171
172#ifdef BOOTLOADER
173 /* Initialise bss section to zero */
174 .global bss_init
175 .type bss_init, %function
176
177bss_init:
178 stmfd sp!, {r4-r9,lr}
179
180 ldr r0, =_edata
181 ldr r1, =_end
182 mov r2, #0
183 mov r3, #0
184 mov r4, #0
185 mov r5, #0
186 mov r6, #0
187 mov r7, #0
188 mov r8, #0
189 mov r9, #0
190 b 2f
191 .align 5 /* cache line size */
1921:
193 stmia r0!, {r2-r9}
1942:
195 cmp r0, r1
196 blt 1b
197
198 ldmpc regs=r4-r9
199 .ltorg
200#endif