summaryrefslogtreecommitdiff
path: root/firmware/target/arm/olympus/mrobe-500/uart-mr500.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/olympus/mrobe-500/uart-mr500.c')
-rw-r--r--firmware/target/arm/olympus/mrobe-500/uart-mr500.c52
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
28static unsigned char uart1buffer[MAX_UART_BUFFER];
29int uart1read = 0, uart1write = 0, uart1count = 0;
27 30
28void do_checksums(char *data, int len, char *xor, char *add) 31void 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
40void uartSetup(void) { 43void 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
46void uartPutc(char ch) { 63void uartPutc(char ch) {
@@ -111,10 +128,10 @@ int uartPollch(unsigned int ticks) {
111 128
112bool uartAvailable(void) 129bool uartAvailable(void)
113{ 130{
114 return (IO_UART1_RFCR & 0x3f)?true:false; 131 return uart1count > 0;
115} 132}
116 133
117void uartHeartbeat(void) 134void 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
147bool 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 */
160void 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}