summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s5l8702
diff options
context:
space:
mode:
authorCástor Muñoz <cmvidal@gmail.com>2016-02-05 02:02:02 +0100
committerCástor Muñoz <cmvidal@gmail.com>2017-02-09 20:47:16 +0100
commit882921efb64218e9b8cc3a7d9c7308734f9b12f3 (patch)
treefca2e1b77104419156a07c6b6d80fa7af9fa3969 /firmware/target/arm/s5l8702
parent0d0b163dd15c35a427c8bb2bbd7b906afe9c491d (diff)
downloadrockbox-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.lds54
-rw-r--r--firmware/target/arm/s5l8702/crt0.S67
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
4ENTRY(start) 5ENTRY(start)
5#ifdef ROCKBOX_LITTLE_ENDIAN 6#ifdef ROCKBOX_LITTLE_ENDIAN
@@ -10,13 +11,11 @@ OUTPUT_FORMAT(elf32-bigarm)
10OUTPUT_ARCH(arm) 11OUTPUT_ARCH(arm)
11STARTUP(target/arm/s5l8702/crt0.o) 12STARTUP(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)
33MEMORY
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
32SECTIONS 57SECTIONS
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
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