diff options
Diffstat (limited to 'firmware/target/arm/s5l8702/crt0.S')
-rw-r--r-- | firmware/target/arm/s5l8702/crt0.S | 96 |
1 files changed, 38 insertions, 58 deletions
diff --git a/firmware/target/arm/s5l8702/crt0.S b/firmware/target/arm/s5l8702/crt0.S index 563e863a66..3d1ee2bdfd 100644 --- a/firmware/target/arm/s5l8702/crt0.S +++ b/firmware/target/arm/s5l8702/crt0.S | |||
@@ -23,9 +23,6 @@ | |||
23 | #include "config.h" | 23 | #include "config.h" |
24 | #include "cpu.h" | 24 | #include "cpu.h" |
25 | 25 | ||
26 | #define CACHE_NONE 0 | ||
27 | #define CACHE_ALL 0x0C | ||
28 | |||
29 | .section .intvect,"ax",%progbits | 26 | .section .intvect,"ax",%progbits |
30 | .global start | 27 | .global start |
31 | .global _newstart | 28 | .global _newstart |
@@ -50,65 +47,48 @@ newstart2: | |||
50 | 47 | ||
51 | #ifdef BOOTLOADER | 48 | #ifdef BOOTLOADER |
52 | /* Relocate ourself to IRAM - we have been loaded to DRAM */ | 49 | /* Relocate ourself to IRAM - we have been loaded to DRAM */ |
53 | mov r0, #0x08000000 /* source (DRAM) */ | 50 | mov r0, #0x08000000 /* source (DRAM) */ |
54 | mov r1, #0x22000000 /* dest (IRAM) */ | 51 | mov r1, #0x22000000 /* dest (IRAM) */ |
55 | ldr r2, =_dataend | 52 | ldr r2, =_dataend |
56 | 1: | 53 | 1: |
57 | cmp r2, r1 | 54 | cmp r2, r1 |
58 | ldrhi r3, [r0], #4 | 55 | ldrhi r3, [r0], #4 |
59 | strhi r3, [r1], #4 | 56 | strhi r3, [r1], #4 |
60 | bhi 1b | 57 | bhi 1b |
61 | 58 | ||
62 | ldr pc, =start_loc /* jump to the relocated start_loc: */ | 59 | ldr pc, =start_loc /* jump to the relocated start_loc: */ |
63 | start_loc: | 60 | start_loc: |
64 | #endif | 61 | #endif |
65 | 62 | ||
66 | mrc 15, 0, r0, c1, c0, 0 | 63 | mrc p15, 0, r0, c1, c0, 0 |
67 | bic r0, r0, #0x1000 | 64 | bic r0, r0, #0x1000 |
68 | bic r0, r0, #0x5 | 65 | bic r0, r0, #0x5 |
69 | mcr 15, 0, r0, c1, c0, 0 // disable caches and protection unit | 66 | mcr p15, 0, r0, c1, c0, 0 /* disable caches and protection unit */ |
70 | 67 | ||
71 | .cleancache: | 68 | .cleancache: |
72 | mrc p15, 0, r15,c7,c10,3 | 69 | mrc p15, 0, r15,c7,c10,3 |
73 | bne .cleancache | 70 | bne .cleancache |
74 | mov r0, #0 | 71 | mov r0, #0 |
75 | mcr p15, 0, r0,c7,c10,4 | 72 | mcr p15, 0, r0,c7,c10,4 |
76 | mcr p15, 0, r0,c7,c5,0 | 73 | mcr p15, 0, r0,c7,c5,0 |
77 | bl ttb_init | 74 | |
78 | 75 | /* reset VIC controller */ | |
79 | mov r0, #0 @ physical address | 76 | ldr r1, =0x38e00000 |
80 | mov r1, #0 @ virtual address | 77 | add r2, r1, #0x00001000 |
81 | mov r2, #0x380 @ size (all memory) | 78 | add r3, r1, #0x00002000 |
82 | mov r3, #CACHE_ALL | 79 | sub r4, r0, #1 |
83 | bl map_section | 80 | str r4, [r1,#0x14] |
84 | 81 | str r4, [r2,#0x14] | |
85 | mov r0, #0x38000000 @ physical address | 82 | str r4, [r1,#0xf00] |
86 | mov r1, #0x38000000 @ virtual address | 83 | str r4, [r2,#0xf00] |
87 | mov r2, #0x80 @ size (AHB/APB) | 84 | str r4, [r3,#0x08] |
88 | mov r3, #CACHE_NONE | 85 | str r4, [r3,#0x0c] |
89 | bl map_section | 86 | str r0, [r1,#0x14] |
90 | 87 | str r0, [r2,#0x14] | |
91 | bl enable_mmu | 88 | |
92 | |||
93 | mrc 15, 0, r0, c1, c0, 0 | ||
94 | orr r0, r0, #0x5 | ||
95 | orr r0, r0, #0x1000 | ||
96 | mcr 15, 0, r0, c1, c0, 0 // re-enable protection unit and caches | ||
97 | |||
98 | ldr r1, =0x38e00000 | ||
99 | add r2, r1, #0x00001000 | ||
100 | add r3, r1, #0x00002000 | ||
101 | sub r4, r0, #1 | ||
102 | str r4, [r1,#0x14] | ||
103 | str r4, [r2,#0x14] | ||
104 | str r4, [r1,#0xf00] | ||
105 | str r4, [r2,#0xf00] | ||
106 | str r4, [r3,#0x08] | ||
107 | str r4, [r3,#0x0c] | ||
108 | str r0, [r1,#0x14] | ||
109 | str r0, [r2,#0x14] | ||
110 | |||
111 | #if !defined(BOOTLOADER) | 89 | #if !defined(BOOTLOADER) |
90 | bl memory_init | ||
91 | |||
112 | /* Copy interrupt vectors to iram */ | 92 | /* Copy interrupt vectors to iram */ |
113 | ldr r2, =_intvectstart | 93 | ldr r2, =_intvectstart |
114 | ldr r3, =_intvectend | 94 | ldr r3, =_intvectend |
@@ -139,7 +119,7 @@ start_loc: | |||
139 | ldrhi r1, [r4], #4 | 119 | ldrhi r1, [r4], #4 |
140 | strhi r1, [r2], #4 | 120 | strhi r1, [r2], #4 |
141 | bhi 1b | 121 | bhi 1b |
142 | 122 | ||
143 | /* Initialise ibss section to zero */ | 123 | /* Initialise ibss section to zero */ |
144 | ldr r2, =_iedata | 124 | ldr r2, =_iedata |
145 | ldr r3, =_iend | 125 | ldr r3, =_iend |
@@ -150,11 +130,11 @@ start_loc: | |||
150 | bhi 1b | 130 | bhi 1b |
151 | #endif | 131 | #endif |
152 | 132 | ||
153 | /* Set up stack for IRQ mode */ | 133 | /* Set up stack for IRQ mode */ |
154 | msr cpsr_c, #0xd2 | 134 | msr cpsr_c, #0xd2 |
155 | ldr sp, =_irqstackend | 135 | ldr sp, =_irqstackend |
156 | 136 | ||
157 | /* Set up stack for FIQ mode */ | 137 | /* Set up stack for FIQ mode */ |
158 | msr cpsr_c, #0xd1 | 138 | msr cpsr_c, #0xd1 |
159 | ldr sp, =_fiqstackend | 139 | ldr sp, =_fiqstackend |
160 | 140 | ||
@@ -178,4 +158,4 @@ start_loc: | |||
178 | strhi r3, [r2], #4 | 158 | strhi r3, [r2], #4 |
179 | bhi 1b | 159 | bhi 1b |
180 | 160 | ||
181 | bl main | 161 | b main |