summaryrefslogtreecommitdiff
path: root/firmware/target/arm/olympus
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
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')
-rw-r--r--firmware/target/arm/olympus/mrobe-500/ata-mr500.c4
-rw-r--r--firmware/target/arm/olympus/mrobe-500/button-mr500.c4
-rwxr-xr-xfirmware/target/arm/olympus/mrobe-500/crt0.S2
-rw-r--r--firmware/target/arm/olympus/mrobe-500/kernel-mr500.c14
-rw-r--r--firmware/target/arm/olympus/mrobe-500/spi-mr500.c6
-rw-r--r--firmware/target/arm/olympus/mrobe-500/system-mr500.c32
-rw-r--r--firmware/target/arm/olympus/mrobe-500/timer-target.h2
-rw-r--r--firmware/target/arm/olympus/mrobe-500/uart-mr500.c36
8 files changed, 49 insertions, 51 deletions
diff --git a/firmware/target/arm/olympus/mrobe-500/ata-mr500.c b/firmware/target/arm/olympus/mrobe-500/ata-mr500.c
index 171097f823..2b018194d2 100644
--- a/firmware/target/arm/olympus/mrobe-500/ata-mr500.c
+++ b/firmware/target/arm/olympus/mrobe-500/ata-mr500.c
@@ -62,6 +62,10 @@ void ata_device_init(void)
62{ 62{
63 /* ATA reset */ 63 /* ATA reset */
64 ATA_RESET_DISABLE; /* Set the pin to disable an active low reset */ 64 ATA_RESET_DISABLE; /* Set the pin to disable an active low reset */
65
66 /* set GIO17 (ATA power) on and output */
67 IO_GIO_BITSET1&=~(1<<1);
68 IO_GIO_DIR1&=~(1<<1);
65} 69}
66 70
67#if !defined(BOOTLOADER) 71#if !defined(BOOTLOADER)
diff --git a/firmware/target/arm/olympus/mrobe-500/button-mr500.c b/firmware/target/arm/olympus/mrobe-500/button-mr500.c
index 87ab80a5e5..7410875fd1 100644
--- a/firmware/target/arm/olympus/mrobe-500/button-mr500.c
+++ b/firmware/target/arm/olympus/mrobe-500/button-mr500.c
@@ -37,7 +37,7 @@
37void button_init_device(void) 37void button_init_device(void)
38{ 38{
39 /* GIO is the power button, set as input */ 39 /* GIO is the power button, set as input */
40 outw(inw(IO_GIO_DIR0)|0x01, IO_GIO_DIR0); 40 IO_GIO_DIR0|=0x01;
41} 41}
42 42
43inline bool button_hold(void) 43inline bool button_hold(void)
@@ -52,7 +52,7 @@ int button_read_device(void)
52 int i = 0; 52 int i = 0;
53 int btn = BUTTON_NONE, timeout = BUTTON_TIMEOUT; 53 int btn = BUTTON_NONE, timeout = BUTTON_TIMEOUT;
54 54
55 if ((inw(IO_GIO_BITSET0)&0x01) == 0) 55 if ((IO_GIO_BITSET0&0x01) == 0)
56 btn |= BUTTON_POWER; 56 btn |= BUTTON_POWER;
57 57
58 uartHeartbeat(); 58 uartHeartbeat();
diff --git a/firmware/target/arm/olympus/mrobe-500/crt0.S b/firmware/target/arm/olympus/mrobe-500/crt0.S
index 672e917cc8..a7c1131367 100755
--- a/firmware/target/arm/olympus/mrobe-500/crt0.S
+++ b/firmware/target/arm/olympus/mrobe-500/crt0.S
@@ -102,7 +102,7 @@ start:
102 ldr sp, =irq_stack 102 ldr sp, =irq_stack
103 msr cpsr_c, #0xdb 103 msr cpsr_c, #0xdb
104 ldr sp, =irq_stack 104 ldr sp, =irq_stack
105 /* Switch to supervisor mode */ 105 /* Switch to supervisor mode (no IRQ) */
106 msr cpsr_c, #0xd3 106 msr cpsr_c, #0xd3
107 ldr sp, =stackend 107 ldr sp, =stackend
108 108
diff --git a/firmware/target/arm/olympus/mrobe-500/kernel-mr500.c b/firmware/target/arm/olympus/mrobe-500/kernel-mr500.c
index 3ac0730691..487bc2d7d2 100644
--- a/firmware/target/arm/olympus/mrobe-500/kernel-mr500.c
+++ b/firmware/target/arm/olympus/mrobe-500/kernel-mr500.c
@@ -29,20 +29,22 @@ void tick_start(unsigned int interval_in_ms)
29{ 29{
30 IO_TIMER1_TMMD = CONFIG_TIMER1_TMMD_STOP; 30 IO_TIMER1_TMMD = CONFIG_TIMER1_TMMD_STOP;
31 31
32 /* Setup the Prescalar */ 32 /* Setup the Prescalar (Divide by 10)
33 IO_TIMER1_TMPRSCL = CONFIG_TIMER1_TMPRSCL; 33 * Based on linux/include/asm-arm/arch-integrator/timex.h
34 */
35 IO_TIMER1_TMPRSCL = 0x000A;
34 36
35 /* Setup the Divisor */ 37 /* Setup the Divisor */
36 IO_TIMER1_TMDIV = CONFIG_TIMER1_TMDIV; 38 IO_TIMER1_TMDIV = (TIMER_FREQ / (10*1000))*interval_in_ms;
37 39
38 /* Turn Timer1 to Free Run mode */ 40 /* Turn Timer1 to Free Run mode */
39 IO_TIMER1_TMMD = CONFIG_TIMER1_TMMD_FREE_RUN; 41 IO_TIMER1_TMMD = CONFIG_TIMER1_TMMD_FREE_RUN;
40 42
41 /* Enable the interrupt */ 43 /* Enable the interrupt */
42 IO_INTC_EINT0 |= 1<<IRQ_TIMER1; 44 IO_INTC_EINT0 |= 1<<IRQ_TIMER1;
43} 45}
44 46
45void TIMER4(void) 47void TIMER1(void)
46{ 48{
47 int i; 49 int i;
48 50
diff --git a/firmware/target/arm/olympus/mrobe-500/spi-mr500.c b/firmware/target/arm/olympus/mrobe-500/spi-mr500.c
index 8aeecd97f2..c47ab8f6ed 100644
--- a/firmware/target/arm/olympus/mrobe-500/spi-mr500.c
+++ b/firmware/target/arm/olympus/mrobe-500/spi-mr500.c
@@ -28,8 +28,8 @@
28#include "system.h" 28#include "system.h"
29 29
30#define GIO_TS_ENABLE (1<<2) 30#define GIO_TS_ENABLE (1<<2)
31#define clr_gio_enable() outw(GIO_TS_ENABLE, IO_GIO_BITSET1) 31#define clr_gio_enable() IO_GIO_BITSET1=GIO_TS_ENABLE
32#define set_gio_enable() outw(GIO_TS_ENABLE, IO_GIO_BITCLR1) 32#define set_gio_enable() IO_GIO_BITCLR1=GIO_TS_ENABLE
33 33
34int spi_block_transfer(const uint8_t *tx_bytes, unsigned int tx_size, 34int spi_block_transfer(const uint8_t *tx_bytes, unsigned int tx_size,
35 uint8_t *rx_bytes, unsigned int rx_size) 35 uint8_t *rx_bytes, unsigned int rx_size)
@@ -72,6 +72,6 @@ void spi_init(void)
72 IO_SERIAL0_TX_ENABLE = 0x0001; 72 IO_SERIAL0_TX_ENABLE = 0x0001;
73 73
74 /* Set GIO 18 to output for touch screen slave enable */ 74 /* Set GIO 18 to output for touch screen slave enable */
75 outw(inw(IO_GIO_DIR1)&~GIO_TS_ENABLE, IO_GIO_DIR1); 75 IO_GIO_DIR1&=~GIO_TS_ENABLE;
76 clr_gio_enable(); 76 clr_gio_enable();
77} 77}
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)
diff --git a/firmware/target/arm/olympus/mrobe-500/timer-target.h b/firmware/target/arm/olympus/mrobe-500/timer-target.h
index 71cfa72e9d..4abe75ad82 100644
--- a/firmware/target/arm/olympus/mrobe-500/timer-target.h
+++ b/firmware/target/arm/olympus/mrobe-500/timer-target.h
@@ -20,7 +20,7 @@
20#define TIMER_TARGET_H 20#define TIMER_TARGET_H
21 21
22/* timer is based on PCLK and minimum division is 2 */ 22/* timer is based on PCLK and minimum division is 2 */
23#define TIMER_FREQ (49156800/2) 23#define TIMER_FREQ (27000000)
24 24
25bool __timer_set(long cycles, bool set); 25bool __timer_set(long cycles, bool set);
26bool __timer_register(void); 26bool __timer_register(void);
diff --git a/firmware/target/arm/olympus/mrobe-500/uart-mr500.c b/firmware/target/arm/olympus/mrobe-500/uart-mr500.c
index f8208f8717..99cf0f2d36 100644
--- a/firmware/target/arm/olympus/mrobe-500/uart-mr500.c
+++ b/firmware/target/arm/olympus/mrobe-500/uart-mr500.c
@@ -22,21 +22,7 @@
22#include "system.h" 22#include "system.h"
23 23
24/* UART 0/1 */ 24/* UART 0/1 */
25#define IO_UART0_DTRR 0x0300
26#define IO_UART0_BRSR 0x0302
27#define IO_UART0_MSR 0x0304
28#define IO_UART0_RFCR 0x0306
29#define IO_UART0_TFCR 0x0308
30#define IO_UART0_LCR 0x030A
31#define IO_UART0_SR 0x030C
32 25
33#define IO_UART1_DTRR 0x0380
34#define IO_UART1_BRSR 0x0382
35#define IO_UART1_MSR 0x0384
36#define IO_UART1_RFCR 0x0386
37#define IO_UART1_TFCR 0x0388
38#define IO_UART1_LCR 0x038A
39#define IO_UART1_SR 0x038C
40#define CONFIG_UART_BRSR 87 26#define CONFIG_UART_BRSR 87
41 27
42void do_checksums(char *data, int len, char *xor, char *add) 28void do_checksums(char *data, int len, char *xor, char *add)
@@ -53,16 +39,16 @@ void do_checksums(char *data, int len, char *xor, char *add)
53 39
54void uartSetup(void) { 40void uartSetup(void) {
55 // 8-N-1 41 // 8-N-1
56 outw(0x8000, IO_UART1_MSR); 42 IO_UART1_MSR=0x8000;
57 outw(CONFIG_UART_BRSR, IO_UART1_BRSR); 43 IO_UART1_BRSR=CONFIG_UART_BRSR;
58} 44}
59 45
60void uartPutc(char ch) { 46void uartPutc(char ch) {
61 // Wait for room in FIFO 47 // Wait for room in FIFO
62 while ((inw(IO_UART1_TFCR) & 0x3f) >= 0x20); 48 while ((IO_UART1_TFCR & 0x3f) >= 0x20);
63 49
64 // Write character 50 // Write character
65 outw(ch, IO_UART1_DTRR); 51 IO_UART1_DTRR=ch;
66} 52}
67 53
68// Unsigned integer to ASCII hexadecimal conversion 54// Unsigned integer to ASCII hexadecimal conversion
@@ -88,17 +74,17 @@ void uartGets(char *str, unsigned int size) {
88 char ch; 74 char ch;
89 75
90 // Wait for FIFO to contain something 76 // Wait for FIFO to contain something
91 while ((inw(IO_UART1_RFCR) & 0x3f) == 0); 77 while ((IO_UART1_RFCR & 0x3f) == 0);
92 78
93 // Read character 79 // Read character
94 ch = (char)inw(IO_UART1_DTRR); 80 ch = (char)IO_UART1_DTRR;
95 81
96 // Echo character back 82 // Echo character back
97 outw(ch, IO_UART1_DTRR); 83 IO_UART1_DTRR=ch;
98 84
99 // If CR, also echo LF, null-terminate, and return 85 // If CR, also echo LF, null-terminate, and return
100 if (ch == '\r') { 86 if (ch == '\r') {
101 outw('\n', IO_UART1_DTRR); 87 IO_UART1_DTRR='\n';
102 if (size) { 88 if (size) {
103 *str++ = '\0'; 89 *str++ = '\0';
104 } 90 }
@@ -115,8 +101,8 @@ void uartGets(char *str, unsigned int size) {
115 101
116int uartPollch(unsigned int ticks) { 102int uartPollch(unsigned int ticks) {
117 while (ticks--) { 103 while (ticks--) {
118 if (inw(IO_UART1_RFCR) & 0x3f) { 104 if (IO_UART1_RFCR & 0x3f) {
119 return inw(IO_UART1_DTRR) & 0xff; 105 return IO_UART1_DTRR & 0xff;
120 } 106 }
121 } 107 }
122 108
@@ -125,7 +111,7 @@ int uartPollch(unsigned int ticks) {
125 111
126bool uartAvailable(void) 112bool uartAvailable(void)
127{ 113{
128 return (inw(IO_UART1_RFCR) & 0x3f)?true:false; 114 return (IO_UART1_RFCR & 0x3f)?true:false;
129} 115}
130 116
131void uartHeartbeat(void) 117void uartHeartbeat(void)