diff options
author | Cástor Muñoz <cmvidal@gmail.com> | 2016-02-05 02:02:02 +0100 |
---|---|---|
committer | Cástor Muñoz <cmvidal@gmail.com> | 2017-02-09 20:47:16 +0100 |
commit | 882921efb64218e9b8cc3a7d9c7308734f9b12f3 (patch) | |
tree | fca2e1b77104419156a07c6b6d80fa7af9fa3969 /firmware/target/arm/s5l8702 | |
parent | 0d0b163dd15c35a427c8bb2bbd7b906afe9c491d (diff) | |
download | rockbox-882921efb64218e9b8cc3a7d9c7308734f9b12f3.tar.gz rockbox-882921efb64218e9b8cc3a7d9c7308734f9b12f3.zip |
ipod6g: bootloader v1bootloader_ipod6g_v1
- dual boot
- USB mode
- battery trap
Change-Id: I8586cfeb21ee63f45ab965430725225fdfc4212d
Diffstat (limited to 'firmware/target/arm/s5l8702')
-rw-r--r-- | firmware/target/arm/s5l8702/boot.lds | 54 | ||||
-rw-r--r-- | firmware/target/arm/s5l8702/crt0.S | 67 |
2 files changed, 94 insertions, 27 deletions
diff --git a/firmware/target/arm/s5l8702/boot.lds b/firmware/target/arm/s5l8702/boot.lds index 2885f77eda..61f23b9c22 100644 --- a/firmware/target/arm/s5l8702/boot.lds +++ b/firmware/target/arm/s5l8702/boot.lds | |||
@@ -1,5 +1,6 @@ | |||
1 | #define ASM | 1 | #define ASM |
2 | #include "config.h" | 2 | #include "config.h" |
3 | #include "cpu.h" | ||
3 | 4 | ||
4 | ENTRY(start) | 5 | ENTRY(start) |
5 | #ifdef ROCKBOX_LITTLE_ENDIAN | 6 | #ifdef ROCKBOX_LITTLE_ENDIAN |
@@ -10,13 +11,11 @@ OUTPUT_FORMAT(elf32-bigarm) | |||
10 | OUTPUT_ARCH(arm) | 11 | OUTPUT_ARCH(arm) |
11 | STARTUP(target/arm/s5l8702/crt0.o) | 12 | STARTUP(target/arm/s5l8702/crt0.o) |
12 | 13 | ||
14 | #define MAX_LOADSIZE 8M /* reserved for loading Rockbox binary */ | ||
15 | |||
13 | #ifdef IPOD_NANO2G | 16 | #ifdef IPOD_NANO2G |
14 | #define DRAMORIG 0x08000000 + ((MEMORYSIZE - 1) * 0x100000) | 17 | #define DRAMORIG 0x08000000 + ((MEMORYSIZE - 1) * 0x100000) |
15 | #define DRAMSIZE 0x00100000 | 18 | #define DRAMSIZE 0x00100000 |
16 | #else | ||
17 | #define DRAMORIG 0x08000000 | ||
18 | #define DRAMSIZE (DRAM_SIZE - TTB_SIZE) | ||
19 | #endif | ||
20 | 19 | ||
21 | #define IRAMORIG 0x22000000 | 20 | #define IRAMORIG 0x22000000 |
22 | #define IRAMSIZE 256K | 21 | #define IRAMSIZE 256K |
@@ -26,17 +25,47 @@ MEMORY | |||
26 | DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE | 25 | DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE |
27 | IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE | 26 | IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE |
28 | } | 27 | } |
29 | |||
30 | #define LOAD_AREA IRAM | 28 | #define LOAD_AREA IRAM |
29 | #define VECT_AREA IRAM | ||
30 | #define BSS_AREA DRAM | ||
31 | |||
32 | #elif defined(IPOD_6G) | ||
33 | MEMORY | ||
34 | { | ||
35 | DRAM : ORIGIN = DRAM_ORIG, LENGTH = DRAM_SIZE | ||
36 | IRAM : ORIGIN = IRAM_ORIG, LENGTH = IRAM_SIZE | ||
37 | |||
38 | /* s5l8702 maps address 0 to ROM, IRAM or DRAM */ | ||
39 | VECT_AREA : ORIGIN = 0, LENGTH = 1K | ||
40 | |||
41 | /* IRAM region where loaded IM3 body will be moved and executed, | ||
42 | preserving the loaded IM3 header (0x800 bytes) at IRAM1_ORIG */ | ||
43 | MOVE_AREA : ORIGIN = IRAM1_ORIG + 0x800, | ||
44 | LENGTH = IRAM1_SIZE - 0x800 | ||
45 | |||
46 | /* DRAM region for BSS */ | ||
47 | BSS_AREA : ORIGIN = DRAM_ORIG + MAX_LOADSIZE, | ||
48 | LENGTH = DRAM_SIZE - MAX_LOADSIZE - TTB_SIZE | ||
49 | } | ||
50 | #define LOAD_AREA MOVE_AREA | ||
51 | |||
52 | #else | ||
53 | #error No target defined! | ||
54 | #endif | ||
55 | |||
31 | 56 | ||
32 | SECTIONS | 57 | SECTIONS |
33 | { | 58 | { |
59 | _dfuloadaddr = IRAM0_ORIG ; | ||
60 | _movestart = LOADADDR(.text) ; | ||
61 | _moveend = LOADADDR(.data) + SIZEOF(.data) ; | ||
62 | |||
34 | #ifdef NEEDS_INTVECT_COPYING | 63 | #ifdef NEEDS_INTVECT_COPYING |
35 | .intvect : { | 64 | .intvect : { |
36 | _intvectstart = . ; | 65 | _intvectstart = . ; |
37 | *(.intvect) | 66 | *(.intvect) |
38 | _intvectend = _newstart ; | 67 | _intvectend = _newstart ; |
39 | } >IRAM AT> LOAD_AREA | 68 | } >VECT_AREA AT> LOAD_AREA |
40 | _intvectcopy = LOADADDR(.intvect) ; | 69 | _intvectcopy = LOADADDR(.intvect) ; |
41 | #endif | 70 | #endif |
42 | 71 | ||
@@ -61,10 +90,9 @@ SECTIONS | |||
61 | *(.idata*) | 90 | *(.idata*) |
62 | *(.data*) | 91 | *(.data*) |
63 | *(.ncdata*); | 92 | *(.ncdata*); |
64 | . = ALIGN(0x4); | 93 | . = ALIGN(0x20); /* align move size */ |
65 | _dataend = . ; | 94 | _dataend = . ; |
66 | } > IRAM AT> LOAD_AREA | 95 | } > LOAD_AREA |
67 | _datacopy = LOADADDR(.data) ; | ||
68 | 96 | ||
69 | .stack (NOLOAD) : | 97 | .stack (NOLOAD) : |
70 | { | 98 | { |
@@ -80,7 +108,7 @@ SECTIONS | |||
80 | _fiqstackbegin = .; | 108 | _fiqstackbegin = .; |
81 | . += 0x400; | 109 | . += 0x400; |
82 | _fiqstackend = .; | 110 | _fiqstackend = .; |
83 | } > IRAM | 111 | } > LOAD_AREA |
84 | 112 | ||
85 | .bss (NOLOAD) : { | 113 | .bss (NOLOAD) : { |
86 | _edata = .; | 114 | _edata = .; |
@@ -88,7 +116,7 @@ SECTIONS | |||
88 | *(.ibss*); | 116 | *(.ibss*); |
89 | *(.ncbss*); | 117 | *(.ncbss*); |
90 | *(COMMON); | 118 | *(COMMON); |
91 | . = ALIGN(0x4); | 119 | . = ALIGN(0x20); /* align bzero size */ |
92 | _end = .; | 120 | _end = .; |
93 | } > IRAM | 121 | } > BSS_AREA |
94 | } | 122 | } |
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 |
53 | 1: | 53 | 1: |
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 | ||
60 | start_loc: | 63 | start_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 | |||
177 | bss_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 */ | ||
192 | 1: | ||
193 | stmia r0!, {r2-r9} | ||
194 | 2: | ||
195 | cmp r0, r1 | ||
196 | blt 1b | ||
197 | |||
198 | ldmpc regs=r4-r9 | ||
199 | .ltorg | ||
200 | #endif | ||