summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/tcc780x/crt0.S43
-rw-r--r--firmware/target/arm/tcc780x/kernel-tcc780x.c24
-rw-r--r--firmware/target/arm/tcc780x/system-tcc780x.c8
-rw-r--r--firmware/target/arm/tcc780x/timer-tcc780x.c23
4 files changed, 45 insertions, 53 deletions
diff --git a/firmware/target/arm/tcc780x/crt0.S b/firmware/target/arm/tcc780x/crt0.S
index 03f17957c5..f02a204d7e 100644
--- a/firmware/target/arm/tcc780x/crt0.S
+++ b/firmware/target/arm/tcc780x/crt0.S
@@ -94,9 +94,8 @@ start_loc:
94 ldr pc, =copied_start /* jump to the relocated start_loc: */ 94 ldr pc, =copied_start /* jump to the relocated start_loc: */
95 95
96copied_start: 96copied_start:
97#endif 97#endif /* TCCBOOT */
98#else 98#endif /* BOOTLOADER */
99 /* We don't use interrupts in the bootloader */
100 99
101 /* Set up stack for IRQ mode */ 100 /* Set up stack for IRQ mode */
102 mov r0,#0xd2 101 mov r0,#0xd2
@@ -107,13 +106,15 @@ copied_start:
107 mov r0,#0xd1 106 mov r0,#0xd1
108 msr cpsr, r0 107 msr cpsr, r0
109 ldr sp, =fiq_stack 108 ldr sp, =fiq_stack
110 109
110#ifndef BOOTLOADER
111 /* Load the banked FIQ mode registers with useful values here. 111 /* Load the banked FIQ mode registers with useful values here.
112 These values will be used in the FIQ handler in pcm-tcc780x.c */ 112 These values will be used in the FIQ handler in pcm-tcc780x.c */
113 .equ DADO_BASE, 0xF0059020 113 .equ DADO_BASE, 0xF0059020
114 114
115 ldr r10, =DADO_BASE 115 ldr r10, =DADO_BASE
116 ldr r11, =dma_play_data 116 ldr r11, =dma_play_data
117#endif
117 118
118 /* Let abort and undefined modes use IRQ stack */ 119 /* Let abort and undefined modes use IRQ stack */
119 mov r0,#0xd7 120 mov r0,#0xd7
@@ -122,7 +123,6 @@ copied_start:
122 mov r0,#0xdb 123 mov r0,#0xdb
123 msr cpsr, r0 124 msr cpsr, r0
124 ldr sp, =irq_stack 125 ldr sp, =irq_stack
125#endif
126 126
127 /* Switch to supervisor mode */ 127 /* Switch to supervisor mode */
128 mov r0,#0xd3 128 mov r0,#0xd3
@@ -176,18 +176,19 @@ copied_start:
176 mcr p15, 0, r0, c7, c6, 0 /* Invalidate Dcache */ 176 mcr p15, 0, r0, c7, c6, 0 /* Invalidate Dcache */
177 mcr p15, 0, r1, c8, c7, 0 /* Invalidate TLB */ 177 mcr p15, 0, r1, c8, c7, 0 /* Invalidate TLB */
178 178
179#if !defined(BOOTLOADER) && !defined(STUB) 179#ifndef STUB
180 180
181 /* Copy exception handler code to address 0 */ 181 /* Copy exception handler code to address 0 */
182 ldr r2, =_vectorsstart 182 mov r2, #0x0
183 ldr r3, =_vectorsend 183 ldr r3, =vectors_start
184 ldr r4, =_vectorscopy 184 ldr r4, =vectors_end
1851: 1851:
186 cmp r3, r2 186 cmp r4, r3
187 ldrhi r5, [r4], #4 187 ldrhi r5, [r3], #4
188 strhi r5, [r2], #4 188 strhi r5, [r2], #4
189 bhi 1b 189 bhi 1b
190 190
191#ifndef BOOTLOADER
191 /* Copy the IRAM (SRAM) */ 192 /* Copy the IRAM (SRAM) */
192 ldr r2, =_iramcopy 193 ldr r2, =_iramcopy
193 ldr r3, =_iramstart 194 ldr r3, =_iramstart
@@ -226,7 +227,8 @@ copied_start:
226 ldrhi r5, [r2], #4 227 ldrhi r5, [r2], #4
227 strhi r5, [r3], #4 228 strhi r5, [r3], #4
228 bhi 1b 229 bhi 1b
229#endif /* !BOOTLOADER,!STUB */ 230#endif /* !BOOTLOADER */
231#endif /* !STUB */
230 232
231 /* Initialise bss section to zero */ 233 /* Initialise bss section to zero */
232 ldr r2, =_edata 234 ldr r2, =_edata
@@ -250,10 +252,9 @@ copied_start:
250 bl main 252 bl main
251 /* main() should never return */ 253 /* main() should never return */
252 254
253#ifndef BOOTLOADER
254
255/* Exception handlers. Will be copied to address 0 after memory remapping */ 255/* Exception handlers. Will be copied to address 0 after memory remapping */
256 .section .vectors,"aw" 256
257vectors_start:
257 ldr pc, [pc, #24] 258 ldr pc, [pc, #24]
258 ldr pc, [pc, #24] 259 ldr pc, [pc, #24]
259 ldr pc, [pc, #24] 260 ldr pc, [pc, #24]
@@ -274,6 +275,7 @@ vectors:
274 .word reserved_handler 275 .word reserved_handler
275 .word irq_handler 276 .word irq_handler
276 .word fiq_handler 277 .word fiq_handler
278vectors_end:
277 279
278 .text 280 .text
279 281
@@ -304,13 +306,16 @@ data_abort_handler:
304 mov r1, #2 306 mov r1, #2
305 b UIE 307 b UIE
306 308
309#ifdef BOOTLOADER
310fiq_handler:
311 subs pc, lr, #4
312#endif
313
307#if defined(STUB) 314#if defined(STUB)
308UIE: 315UIE:
309 b UIE 316 b UIE
310#endif 317#endif
311 318
312 /* We don't use interrupts in the bootloader */
313
314/* Align stacks to cache line boundary */ 319/* Align stacks to cache line boundary */
315 .balign 16 320 .balign 16
316 321
@@ -321,5 +326,3 @@ irq_stack:
321/* 256 words of FIQ stack */ 326/* 256 words of FIQ stack */
322 .space 256*4 327 .space 256*4
323fiq_stack: 328fiq_stack:
324
325#endif
diff --git a/firmware/target/arm/tcc780x/kernel-tcc780x.c b/firmware/target/arm/tcc780x/kernel-tcc780x.c
index dee5e040e2..76395d2b33 100644
--- a/firmware/target/arm/tcc780x/kernel-tcc780x.c
+++ b/firmware/target/arm/tcc780x/kernel-tcc780x.c
@@ -38,5 +38,25 @@ void tick_start(unsigned int interval_in_ms)
38 TCFG(0) = TCFG_CLEAR | (0 << TCFG_SEL) | TCFG_IEN | TCFG_EN; 38 TCFG(0) = TCFG_CLEAR | (0 << TCFG_SEL) | TCFG_IEN | TCFG_EN;
39} 39}
40 40
41/* NB: Since we are using a single timer IRQ, tick tasks are dispatched as 41
42 part of the central timer IRQ processing in timer-tcc780x.c */ 42/* Timer interrupt processing - all timers (inc. tick) share a single IRQ */
43void TIMER0(void)
44{
45 if (TIREQ & TIREQ_TF0) /* Timer0 reached ref value */
46 {
47 /* Run through the list of tick tasks */
48 call_tick_tasks();
49
50 /* reset Timer 0 IRQ & ref flags */
51 TIREQ = TIREQ_TI0 | TIREQ_TF0;
52 }
53
54 if (TIREQ & TIREQ_TF4) /* Timer4 reached ref value */
55 {
56 /* dispatch user timer */
57 if (pfn_timer != NULL)
58 pfn_timer();
59
60 TIREQ = TIREQ_TI4 | TIREQ_TF4;
61 }
62}
diff --git a/firmware/target/arm/tcc780x/system-tcc780x.c b/firmware/target/arm/tcc780x/system-tcc780x.c
index ab8a6cf218..6362f17f71 100644
--- a/firmware/target/arm/tcc780x/system-tcc780x.c
+++ b/firmware/target/arm/tcc780x/system-tcc780x.c
@@ -23,8 +23,6 @@
23#include "system.h" 23#include "system.h"
24#include "panic.h" 24#include "panic.h"
25 25
26#if !defined(BOOTLOADER)
27
28#define default_interrupt(name) \ 26#define default_interrupt(name) \
29 extern __attribute__((weak,alias("UIRQ"))) void name (void) 27 extern __attribute__((weak,alias("UIRQ"))) void name (void)
30 28
@@ -144,8 +142,6 @@ void irq_handler(void)
144 "subs pc, lr, #4 \n"); /* Return from IRQ */ 142 "subs pc, lr, #4 \n"); /* Return from IRQ */
145} 143}
146 144
147#endif /* !defined(BOOTLOADER) */
148
149 145
150/* TODO - these should live in the target-specific directories and 146/* TODO - these should live in the target-specific directories and
151 once we understand what all the GPIO pins do, move the init to the 147 once we understand what all the GPIO pins do, move the init to the
@@ -254,8 +250,6 @@ void system_init(void)
254 /* mask all interrupts */ 250 /* mask all interrupts */
255 IEN = 0; 251 IEN = 0;
256 252
257#if !defined(BOOTLOADER)
258
259 /* Set DAI interrupts as FIQ, all others are IRQ. */ 253 /* Set DAI interrupts as FIQ, all others are IRQ. */
260 IRQSEL = ~(DAI_RX_IRQ_MASK | DAI_TX_IRQ_MASK); 254 IRQSEL = ~(DAI_RX_IRQ_MASK | DAI_TX_IRQ_MASK);
261 255
@@ -272,8 +266,6 @@ void system_init(void)
272 } 266 }
273 267
274 ALLMASK = 3; /* Global FIQ/IRQ unmask */ 268 ALLMASK = 3; /* Global FIQ/IRQ unmask */
275
276#endif /* !defined(BOOTLOADER) */
277 269
278 gpio_init(); 270 gpio_init();
279 clock_init(); 271 clock_init();
diff --git a/firmware/target/arm/tcc780x/timer-tcc780x.c b/firmware/target/arm/tcc780x/timer-tcc780x.c
index ca6613a3ff..a6c8c1c060 100644
--- a/firmware/target/arm/tcc780x/timer-tcc780x.c
+++ b/firmware/target/arm/tcc780x/timer-tcc780x.c
@@ -81,26 +81,3 @@ void __timer_unregister(void)
81 81
82 restore_interrupt(oldstatus); 82 restore_interrupt(oldstatus);
83} 83}
84
85
86/* Timer interrupt processing - all timers (inc. tick) have a single IRQ */
87void TIMER0(void)
88{
89 if (TIREQ & TIREQ_TF0) /* Timer0 reached ref value */
90 {
91 /* Run through the list of tick tasks */
92 call_tick_tasks();
93
94 /* reset Timer 0 IRQ & ref flags */
95 TIREQ = TIREQ_TI0 | TIREQ_TF0;
96 }
97
98 if (TIREQ & TIREQ_TF4) /* Timer4 reached ref value */
99 {
100 /* dispatch user timer */
101 if (pfn_timer != NULL)
102 pfn_timer();
103
104 TIREQ = TIREQ_TI4 | TIREQ_TF4;
105 }
106}