---
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