summaryrefslogtreecommitdiff
path: root/firmware/target/arm/olympus/mrobe-500/system-mr500.c
diff options
context:
space:
mode:
authorKarl Kurbjun <kkurbjun@gmail.com>2007-09-23 23:08:39 +0000
committerKarl Kurbjun <kkurbjun@gmail.com>2007-09-23 23:08:39 +0000
commit9ac9cc6024271f806af23a84903d809eb145dc60 (patch)
tree66ff450d331c4dfae8758281a7faa47ffd2f752f /firmware/target/arm/olympus/mrobe-500/system-mr500.c
parentd969a420b6c7f9aee321d218b7a9feb1c7158703 (diff)
downloadrockbox-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.c32
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
96static void UIRQ(void) 96static 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
122void fiq_handler(void) __attribute__((interrupt ("FIQ"), naked)); 117void fiq_handler(void) __attribute__((interrupt ("FIQ"), naked));
@@ -144,6 +139,11 @@ void system_reboot(void)
144 139
145} 140}
146 141
142void enable_interrupts (void)
143{
144 asm volatile ("msr cpsr_c, #0x13" );
145}
146
147void system_init(void) 147void 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
171int system_memory_guard(int newmode) 177int system_memory_guard(int newmode)