---
 software/bios/isr.c        |    6 +---
 software/demo/isr.c        |    6 +---
 software/demo/shell.c      |    7 +---
 software/libbase/console.c |    4 +-
 software/libbase/uart.c    |   60 +++++++++++++++++++++++--------------------
 software/libhal/vga.c      |    4 +-
 6 files changed, 42 insertions(+), 45 deletions(-)

diff --git a/software/bios/isr.c b/software/bios/isr.c
index d3b13e5..80a6bda 100644
--- a/software/bios/isr.c
+++ b/software/bios/isr.c
@@ -28,10 +28,8 @@ void isr()
 
        irqs = irq_pending() & irq_getmask();
 
-       if(irqs & IRQ_UARTRX)
-               uart_isr_rx();
-       if(irqs & IRQ_UARTTX)
-               uart_isr_tx();
+       if(irqs & IRQ_UART)
+               uart_isr();
                
        if(irqs & IRQ_TMU)
                tmu_isr();
diff --git a/software/demo/isr.c b/software/demo/isr.c
index c0c125c..5c1bd8f 100644
--- a/software/demo/isr.c
+++ b/software/demo/isr.c
@@ -35,10 +35,8 @@ void isr()
 
        irqs = irq_pending() & irq_getmask();
 
-       if(irqs & IRQ_UARTRX)
-               uart_isr_rx();
-       if(irqs & IRQ_UARTTX)
-               uart_isr_tx();
+       if(irqs & IRQ_UART)
+               uart_isr();
 
        if(irqs & IRQ_TIMER0)
                time_isr();
diff --git a/software/demo/shell.c b/software/demo/shell.c
index 5ba9dc8..daffca7 100644
--- a/software/demo/shell.c
+++ b/software/demo/shell.c
@@ -780,16 +780,14 @@ static void irtest()
 static void midiprint()
 {
        unsigned int r;
-       if(irq_pending() & IRQ_MIDIRX) {
+       if(CSR_MIDI_STAT & MIDI_STAT_DR) {
                r = CSR_MIDI_RXTX;
-               irq_ack(IRQ_MIDIRX);
                printf("RX: %02x\n", r);
        }
 }
 
 static void midirx()
 {
-       irq_ack(IRQ_MIDIRX);
        while(!readchar_nonblock()) midiprint();
 }
 
@@ -797,9 +795,8 @@ static void midisend(int c)
 {
        printf("TX: %02x\n", c);
        CSR_MIDI_RXTX = c;
-       while(!(irq_pending() & IRQ_MIDITX));
+       while(!(CSR_MIDI_STAT & MIDI_STAT_THRE));
        printf("TX done\n");
-       irq_ack(IRQ_MIDITX);
        midiprint();
 }
 
diff --git a/software/libbase/console.c b/software/libbase/console.c
index 8d56a2d..1271d27 100644
--- a/software/libbase/console.c
+++ b/software/libbase/console.c
@@ -65,7 +65,7 @@ int puts(const char *s)
        unsigned int oldmask;
 
        oldmask = irq_getmask();
-       irq_setmask(IRQ_UARTRX); // HACK: prevent UART data loss
+       irq_setmask(IRQ_UART); // HACK: prevent UART data loss
 
        while(*s) {
                writechar(*s);
@@ -82,7 +82,7 @@ void putsnonl(const char *s)
        unsigned int oldmask;
 
        oldmask = irq_getmask();
-       irq_setmask(IRQ_UARTRX); // HACK: prevent UART data loss
+       irq_setmask(IRQ_UART); // HACK: prevent UART data loss
        
        while(*s) {
                writechar(*s);
diff --git a/software/libbase/uart.c b/software/libbase/uart.c
index 7e9b190..4e220d0 100644
--- a/software/libbase/uart.c
+++ b/software/libbase/uart.c
@@ -34,11 +34,33 @@ static char rx_buf[UART_RINGBUFFER_SIZE_RX];
 static volatile unsigned int rx_produce;
 static volatile unsigned int rx_consume;
 
-void uart_isr_rx()
+#define UART_RINGBUFFER_SIZE_TX 131072
+#define UART_RINGBUFFER_MASK_TX (UART_RINGBUFFER_SIZE_TX-1)
+
+static char tx_buf[UART_RINGBUFFER_SIZE_TX];
+static unsigned int tx_produce;
+static unsigned int tx_consume;
+static volatile int tx_cts;
+
+static int force_sync;
+
+
+void uart_isr()
 {
-       irq_ack(IRQ_UARTRX);
-       rx_buf[rx_produce] = CSR_UART_RXTX;
-       rx_produce = (rx_produce + 1) & UART_RINGBUFFER_MASK_RX;
+       irq_ack(IRQ_UART);
+
+       if(CSR_UART_STAT & UART_STAT_DR) {
+               rx_buf[rx_produce] = CSR_UART_RXTX;
+               rx_produce = (rx_produce + 1) & UART_RINGBUFFER_MASK_RX;
+       }
+
+       if(CSR_UART_STAT & UART_STAT_THRE) {
+               if(tx_produce != tx_consume) {
+                       CSR_UART_RXTX = tx_buf[tx_consume];
+                       tx_consume = (tx_consume + 1) & UART_RINGBUFFER_MASK_TX;
+               } else
+                       tx_cts = 1;
+       }
 }
 
 /* Do not use in interrupt handlers! */
@@ -57,36 +79,16 @@ int uart_read_nonblock()
        return (rx_consume != rx_produce);
 }
 
-#define UART_RINGBUFFER_SIZE_TX 131072
-#define UART_RINGBUFFER_MASK_TX (UART_RINGBUFFER_SIZE_TX-1)
-
-static char tx_buf[UART_RINGBUFFER_SIZE_TX];
-static unsigned int tx_produce;
-static unsigned int tx_consume;
-static volatile int tx_cts;
-
-static int force_sync;
-
-void uart_isr_tx()
-{
-       irq_ack(IRQ_UARTTX);
-       if(tx_produce != tx_consume) {
-               CSR_UART_RXTX = tx_buf[tx_consume];
-               tx_consume = (tx_consume + 1) & UART_RINGBUFFER_MASK_TX;
-       } else
-               tx_cts = 1;
-}
-
 void uart_write(char c)
 {
        unsigned int oldmask;
        
        oldmask = irq_getmask();
        irq_setmask(0);
+
        if(force_sync) {
                CSR_UART_RXTX = c;
-               while(!(irq_pending() & IRQ_UARTTX));
-               irq_ack(IRQ_UARTTX);
+               while(!(CSR_UART_STAT & UART_STAT_THRE));
        } else {
                if(tx_cts) {
                        tx_cts = 0;
@@ -109,10 +111,12 @@ void uart_init()
        tx_consume = 0;
        tx_cts = 1;
 
-       irq_ack(IRQ_UARTRX|IRQ_UARTTX);
+       irq_ack(IRQ_UART);
+
+       CSR_UART_CTRL = UART_CTRL_TX_INT | UART_CTRL_RX_INT;
 
        mask = irq_getmask();
-       mask |= IRQ_UARTRX|IRQ_UARTTX;
+       mask |= IRQ_UART;
        irq_setmask(mask);
 }
 
diff --git a/software/libhal/vga.c b/software/libhal/vga.c
index 871ed90..3748f43 100644
--- a/software/libhal/vga.c
+++ b/software/libhal/vga.c
@@ -360,10 +360,10 @@ static void scroll_callback(struct tmu_td *td)
        unsigned int oldmask;
        unsigned int ie;
        
-       /* HACK: allow nested UART RX interrupts to prevent data loss */
+       /* HACK: allow nested UART interrupts to prevent data loss */
        ie = irq_getie();
        oldmask = irq_getmask();
-       irq_setmask(IRQ_UARTRX);
+       irq_setmask(IRQ_UART);
        irq_enable(1);
        
        flush_cpu_dcache();
-- 
1.7.2.5

_______________________________________________
http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org
IRC: #milkymist@Freenode
Twitter: www.twitter.com/milkymistvj
Ideas? http://milkymist.uservoice.com

Reply via email to