diff options
author | Karl Kurbjun <kkurbjun@gmail.com> | 2007-09-23 23:08:39 +0000 |
---|---|---|
committer | Karl Kurbjun <kkurbjun@gmail.com> | 2007-09-23 23:08:39 +0000 |
commit | 9ac9cc6024271f806af23a84903d809eb145dc60 (patch) | |
tree | 66ff450d331c4dfae8758281a7faa47ffd2f752f /firmware/target/arm/olympus/mrobe-500/system-mr500.c | |
parent | d969a420b6c7f9aee321d218b7a9feb1c7158703 (diff) | |
download | rockbox-9ac9cc6024271f806af23a84903d809eb145dc60.tar.gz rockbox-9ac9cc6024271f806af23a84903d809eb145dc60.zip |
Working DM320 interrupts, changed the way registers are accessed in spi and uart drivers. Uart might be broken with interrupts - buttons on remote don't seem to respond when interrupts are enabled.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14836 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/olympus/mrobe-500/system-mr500.c')
-rw-r--r-- | firmware/target/arm/olympus/mrobe-500/system-mr500.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/firmware/target/arm/olympus/mrobe-500/system-mr500.c b/firmware/target/arm/olympus/mrobe-500/system-mr500.c index 5b52dc3208..4fdfbd03c6 100644 --- a/firmware/target/arm/olympus/mrobe-500/system-mr500.c +++ b/firmware/target/arm/olympus/mrobe-500/system-mr500.c | |||
@@ -95,7 +95,7 @@ static const char * const irqname[] = | |||
95 | 95 | ||
96 | static void UIRQ(void) | 96 | static void UIRQ(void) |
97 | { | 97 | { |
98 | unsigned int offset = IO_INTC_IRQENTRY0; | 98 | unsigned int offset = (IO_INTC_IRQENTRY0>>2)-1; |
99 | panicf("Unhandled IRQ %02X: %s", offset, irqname[offset]); | 99 | panicf("Unhandled IRQ %02X: %s", offset, irqname[offset]); |
100 | } | 100 | } |
101 | 101 | ||
@@ -105,18 +105,13 @@ void irq_handler(void) | |||
105 | /* | 105 | /* |
106 | * Based on: linux/arch/arm/kernel/entry-armv.S and system-meg-fx.c | 106 | * Based on: linux/arch/arm/kernel/entry-armv.S and system-meg-fx.c |
107 | */ | 107 | */ |
108 | printf("INTERUPT!"); | 108 | |
109 | asm volatile ( | 109 | asm volatile( "stmfd sp!, {r0-r7, ip, lr} \n" /* Store context */ |
110 | "sub lr, lr, #4 \r\n" | 110 | "sub sp, sp, #8 \n"); /* Reserve stack */ |
111 | "stmfd sp!, {r0-r3, ip, lr} \r\n" | 111 | irqvector[(IO_INTC_IRQENTRY0>>2)-1](); |
112 | "mov r0, #0x00030000 \r\n" | 112 | asm volatile( "add sp, sp, #8 \n" /* Cleanup stack */ |
113 | "ldr r0, [r0, #0x518] \r\n" | 113 | "ldmfd sp!, {r0-r7, ip, lr} \n" /* Restore context */ |
114 | "ldr r1, =irqvector \r\n" | 114 | "subs pc, lr, #4 \n"); /* Return from FIQ */ |
115 | "ldr r1, [r1, r0, lsl #2] \r\n" | ||
116 | "mov lr, pc \r\n" | ||
117 | "bx r1 \r\n" | ||
118 | "ldmfd sp!, {r0-r3, ip, pc}^ \r\n" | ||
119 | ); | ||
120 | } | 115 | } |
121 | 116 | ||
122 | void fiq_handler(void) __attribute__((interrupt ("FIQ"), naked)); | 117 | void fiq_handler(void) __attribute__((interrupt ("FIQ"), naked)); |
@@ -144,6 +139,11 @@ void system_reboot(void) | |||
144 | 139 | ||
145 | } | 140 | } |
146 | 141 | ||
142 | void enable_interrupts (void) | ||
143 | { | ||
144 | asm volatile ("msr cpsr_c, #0x13" ); | ||
145 | } | ||
146 | |||
147 | void system_init(void) | 147 | void system_init(void) |
148 | { | 148 | { |
149 | /* taken from linux/arch/arm/mach-itdm320-20/irq.c */ | 149 | /* taken from linux/arch/arm/mach-itdm320-20/irq.c */ |
@@ -166,6 +166,12 @@ void system_init(void) | |||
166 | IO_INTC_FISEL0 = 0; | 166 | IO_INTC_FISEL0 = 0; |
167 | IO_INTC_FISEL1 = 0; | 167 | IO_INTC_FISEL1 = 0; |
168 | IO_INTC_FISEL2 = 0; | 168 | IO_INTC_FISEL2 = 0; |
169 | |||
170 | /* set GIO26 (reset pin) to output and low */ | ||
171 | IO_GIO_BITSET1&=~(1<<10); | ||
172 | IO_GIO_DIR1&=~(1<<10); | ||
173 | |||
174 | enable_interrupts(); | ||
169 | } | 175 | } |
170 | 176 | ||
171 | int system_memory_guard(int newmode) | 177 | int system_memory_guard(int newmode) |