diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2007-09-30 08:18:46 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2007-09-30 08:18:46 +0000 |
commit | a5e788fe8533f6172b3d6b52d2430fe163f7a6fd (patch) | |
tree | 3c02a246e903d743126658bfb94bbacbdeba8fc4 /firmware/target/arm/olympus/mrobe-500/uart-mr500.c | |
parent | f548336e271f970d7ccd8a84e85ce8590ff7deab (diff) | |
download | rockbox-a5e788fe8533f6172b3d6b52d2430fe163f7a6fd.tar.gz rockbox-a5e788fe8533f6172b3d6b52d2430fe163f7a6fd.zip |
slow - but working - IRQ based uart/button driver.
change some of the uart function names from CamelCase
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14908 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/olympus/mrobe-500/uart-mr500.c')
-rw-r--r-- | firmware/target/arm/olympus/mrobe-500/uart-mr500.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/firmware/target/arm/olympus/mrobe-500/uart-mr500.c b/firmware/target/arm/olympus/mrobe-500/uart-mr500.c index 99cf0f2d36..66e59eaaac 100644 --- a/firmware/target/arm/olympus/mrobe-500/uart-mr500.c +++ b/firmware/target/arm/olympus/mrobe-500/uart-mr500.c | |||
@@ -23,7 +23,10 @@ | |||
23 | 23 | ||
24 | /* UART 0/1 */ | 24 | /* UART 0/1 */ |
25 | 25 | ||
26 | #define CONFIG_UART_BRSR 87 | 26 | #define CONFIG_UART_BRSR 87 |
27 | #define MAX_UART_BUFFER 32 | ||
28 | static unsigned char uart1buffer[MAX_UART_BUFFER]; | ||
29 | int uart1read = 0, uart1write = 0, uart1count = 0; | ||
27 | 30 | ||
28 | void do_checksums(char *data, int len, char *xor, char *add) | 31 | void do_checksums(char *data, int len, char *xor, char *add) |
29 | { | 32 | { |
@@ -37,10 +40,24 @@ void do_checksums(char *data, int len, char *xor, char *add) | |||
37 | } | 40 | } |
38 | } | 41 | } |
39 | 42 | ||
40 | void uartSetup(void) { | 43 | void uart_init(void) |
44 | { | ||
41 | // 8-N-1 | 45 | // 8-N-1 |
42 | IO_UART1_MSR=0x8000; | 46 | IO_UART1_MSR=0x8000; |
43 | IO_UART1_BRSR=CONFIG_UART_BRSR; | 47 | IO_UART1_BRSR=CONFIG_UART_BRSR; |
48 | IO_UART1_RFCR = 0x8000; | ||
49 | /* gio 27 is input, uart1 rx | ||
50 | gio 28 is output, uart1 tx */ | ||
51 | IO_GIO_DIR1 |= (1<<11); /* gio 27 */ | ||
52 | IO_GIO_DIR1 &= ~(1<<12); /* gio 28 */ | ||
53 | |||
54 | /* init the recieve buffer */ | ||
55 | uart1read = 0; | ||
56 | uart1write = 0; | ||
57 | uart1count = 0; | ||
58 | |||
59 | /* Enable the interrupt */ | ||
60 | IO_INTC_EINT0 |= (1<<IRQ_UART1); | ||
44 | } | 61 | } |
45 | 62 | ||
46 | void uartPutc(char ch) { | 63 | void uartPutc(char ch) { |
@@ -111,10 +128,10 @@ int uartPollch(unsigned int ticks) { | |||
111 | 128 | ||
112 | bool uartAvailable(void) | 129 | bool uartAvailable(void) |
113 | { | 130 | { |
114 | return (IO_UART1_RFCR & 0x3f)?true:false; | 131 | return uart1count > 0; |
115 | } | 132 | } |
116 | 133 | ||
117 | void uartHeartbeat(void) | 134 | void uart1_heartbeat(void) |
118 | { | 135 | { |
119 | char data[5] = {0x11, 0x30, 0x11^0x30, 0x11+0x30, '\0'}; | 136 | char data[5] = {0x11, 0x30, 0x11^0x30, 0x11+0x30, '\0'}; |
120 | uartPuts(data); | 137 | uartPuts(data); |
@@ -126,3 +143,30 @@ void uartSendData(char* data, int len) | |||
126 | for(i=0;i<len;i++) | 143 | for(i=0;i<len;i++) |
127 | uartPutc(data[i]); | 144 | uartPutc(data[i]); |
128 | } | 145 | } |
146 | |||
147 | bool uart1_getch(char *c) | ||
148 | { | ||
149 | if (uart1count > 0) | ||
150 | { | ||
151 | *c = uart1buffer[uart1read]; | ||
152 | uart1read = (uart1read+1) % MAX_UART_BUFFER; | ||
153 | uart1count--; | ||
154 | return true; | ||
155 | } | ||
156 | return false; | ||
157 | } | ||
158 | |||
159 | /* UART1 receive intterupt handler */ | ||
160 | void UART1(void) | ||
161 | { | ||
162 | if (IO_UART1_RFCR & 0x3f) | ||
163 | { | ||
164 | if (uart1count >= MAX_UART_BUFFER) | ||
165 | panicf("UART1 buffer overflow"); | ||
166 | uart1buffer[uart1write] = IO_UART1_DTRR & 0xff; | ||
167 | uart1write = (uart1write+1) % MAX_UART_BUFFER; | ||
168 | uart1count++; | ||
169 | } | ||
170 | |||
171 | IO_INTC_IRQ0 = (1<<IRQ_UART1); | ||
172 | } | ||