summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s3c2440
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/s3c2440')
-rw-r--r--firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c115
1 files changed, 85 insertions, 30 deletions
diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c
index aa011dc56b..f626438de4 100644
--- a/firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c
+++ b/firmware/target/arm/s3c2440/gigabeat-fx/system-meg-fx.c
@@ -3,44 +3,83 @@
3#include "panic.h" 3#include "panic.h"
4#include "mmu-meg-fx.h" 4#include "mmu-meg-fx.h"
5 5
6#include "lcd.h" 6#define default_interrupt(name) \
7 extern __attribute__((weak,alias("UIRQ"))) void name (void)
8
9default_interrupt(EINT0);
10default_interrupt(EINT1);
11default_interrupt(EINT2);
12default_interrupt(EINT3);
13default_interrupt(EINT4_7);
14default_interrupt(EINT8_23);
15default_interrupt(CAM);
16default_interrupt(nBATT_FLT);
17default_interrupt(TICK);
18default_interrupt(WDT_AC97);
19default_interrupt(TIMER0);
20default_interrupt(TIMER1);
21default_interrupt(TIMER2);
22default_interrupt(TIMER3);
23default_interrupt(TIMER4);
24default_interrupt(UART2);
25default_interrupt(LCD);
26default_interrupt(DMA0);
27default_interrupt(DMA1);
28default_interrupt(DMA2);
29default_interrupt(DMA3);
30default_interrupt(SDI);
31default_interrupt(SPI0);
32default_interrupt(UART1);
33default_interrupt(NFCON);
34default_interrupt(USBD);
35default_interrupt(USBH);
36default_interrupt(IIC);
37default_interrupt(UART0);
38default_interrupt(SPI1);
39default_interrupt(RTC);
40default_interrupt(ADC);
41
42static void (* const irqvector[32])(void) =
43{
44 EINT0, EINT1, EINT2, EINT3,
45 EINT4_7, EINT8_23, CAM, nBATT_FLT, TICK, WDT_AC97,
46 TIMER0, TIMER1, TIMER2, TIMER3, TIMER4, UART2,
47 LCD, DMA0, DMA1, DMA2, DMA3, SDI,
48 SPI0, UART1, NFCON, USBD, IIC,
49 UART0, SPI1, RTC, ADC,
50};
7 51
8enum 52static const char * const irqname[32] =
9{ 53{
10 TIMER4_MASK = (1 << 14), 54 "EINT0", "EINT1", "EINT2", "EINT3",
11 LCD_MASK = (1 << 16), 55 "EINT4_7", "EINT8_23", "CAM", "nBATT_FLT", "TICK", "WDT_AC97",
12 DMA0_MASK = (1 << 17), 56 "TIMER0", "TIMER1", "TIMER2", "TIMER3", "TIMER4", "UART2",
13 DMA1_MASK = (1 << 18), 57 "LCD", "DMA0", "DMA1", "DMA2", "DMA3", "SDI",
14 DMA2_MASK = (1 << 19), 58 "SPI0", "UART1", "NFCON", "USBD", "USBH", "IIC",
15 DMA3_MASK = (1 << 20), 59 "UART0", "SPI1", "RTC", "ADC"
16 ALARM_MASK = (1 << 30),
17}; 60};
18 61
19int system_memory_guard(int newmode) 62static void UIRQ(void)
20{ 63{
21 (void)newmode; 64 unsigned int offset = INTOFFSET;
22 return 0; 65 panicf("Unhandled IRQ %02X: %s", offset, irqname[offset]);
23} 66}
24 67
25extern void timer4(void); 68void irq_handler(void) __attribute__((interrupt ("IRQ"), naked));
26extern void dma0(void); /* free */ 69void irq_handler(void)
27extern void dma1(void);
28extern void dma3(void);
29
30void irq(void)
31{ 70{
32 int intpending = INTPND; 71 asm volatile (
33 72 "sub lr, lr, #4 \r\n"
34 SRCPND = intpending; /* Clear this interrupt. */ 73 "stmfd sp!, {r0-r3, ip, lr} \r\n"
35 INTPND = intpending; /* Clear this interrupt. */ 74 "mov r0, #0x4a000000 \r\n" /* INTOFFSET = 0x4a000014 */
36 75 "add r0, r0, #0x00000014 \r\n"
37 /* Timer 4 */ 76 "ldr r0, [r0] \r\n"
38 if ((intpending & TIMER4_MASK) != 0) 77 "ldr r1, =irqvector \r\n"
39 timer4(); 78 "ldr r1, [r1, r0, lsl #2] \r\n"
40 else 79 "mov lr, pc \r\n"
41 { 80 "bx r1 \r\n"
42 /* unexpected interrupt */ 81 "ldmfd sp!, {r0-r3, ip, pc}^ \r\n"
43 } 82 );
44} 83}
45 84
46void system_reboot(void) 85void system_reboot(void)
@@ -54,6 +93,17 @@ void system_reboot(void)
54 93
55void system_init(void) 94void system_init(void)
56{ 95{
96 /* Disable interrupts and set all to IRQ mode */
97 INTMSK = -1;
98 INTMOD = 0;
99 SRCPND = -1;
100 INTPND = -1;
101 INTSUBMSK = -1;
102 SUBSRCPND = -1;
103
104 /* TODO: do something with PRIORITY */
105
106
57 /* Turn off currently-not or never-needed devices */ 107 /* Turn off currently-not or never-needed devices */
58 108
59 CLKCON &= ~( 109 CLKCON &= ~(
@@ -90,6 +140,11 @@ void system_init(void)
90 CLKSLOW |= (1 << 7); 140 CLKSLOW |= (1 << 7);
91} 141}
92 142
143int system_memory_guard(int newmode)
144{
145 (void)newmode;
146 return 0;
147}
93 148
94#ifdef HAVE_ADJUSTABLE_CPU_FREQ 149#ifdef HAVE_ADJUSTABLE_CPU_FREQ
95 150