software: interrupt driven UART working
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Mon, 6 Feb 2012 22:53:29 +0000 (23:53 +0100)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Mon, 6 Feb 2012 22:53:29 +0000 (23:53 +0100)
software/bios/isr.c
software/bios/main.c
software/include/base/irq.h
software/libbase/uart.c

index 25badec3b772a1c054e7f5e8fe55ea24ec8406d3..21c480aae245950d4276177362056763520cad01 100644 (file)
  */
 
 #include <hw/interrupts.h>
+#include <hw/uart.h>
 #include <irq.h>
+#include <uart.h>
 
 void isr(void)
 {
        unsigned int irqs;
+       
        irqs = irq_pending() & irq_getmask();
+       
+       if(irqs & IRQ_UART)
+               uart_isr();
 }
index b2f90e3b3a43781c358e569ae924e96e5a50959b..36e21c628b38fdb1aa7d5ccc0ecfd6ce5431ba16 100644 (file)
@@ -1,16 +1,14 @@
-#include <hw/uart.h>
-
-static void print(const char *s)
-{
-       while(*s) {
-               while(CSR_UART_EV_STAT & UART_EV_TX);
-               CSR_UART_RXTX = *s;
-               s++;
-       }
-}
+#include <stdio.h>
+#include <irq.h>
+#include <uart.h>
 
 int main(void)
 {
-       print("Hello World\n");
+       irq_setmask(0);
+       irq_setie(1);
+       uart_init();
+       
+       printf("Hello World with IRQs\n");
+       
        while(1);
 }
index 43e447344ef2e58a807ff9bfd69254725e119e7a..37cf73fd0d4c35b5c651488c4ad0004c3c3eb628 100644 (file)
 #ifndef __IRQ_H
 #define __IRQ_H
 
-static inline void irq_enable(unsigned int en)
+static inline unsigned int irq_getie(void)
 {
-       __asm__ __volatile__("wcsr IE, %0" : : "r" (en));
+       unsigned int ie;
+       __asm__ __volatile__("rcsr %0, IE" : "=r" (ie));
+       return ie;
+}
+
+static inline void irq_setie(unsigned int ie)
+{
+       __asm__ __volatile__("wcsr IE, %0" : : "r" (ie));
 }
 
 static inline unsigned int irq_getmask(void)
@@ -47,16 +54,4 @@ static inline void irq_ack(unsigned int mask)
        __asm__ __volatile__("wcsr IP, %0" : : "r" (mask));
 }
 
-static inline unsigned int irq_getie(void)
-{
-       unsigned int ie;
-       __asm__ __volatile__("rcsr %0, IE" : "=r" (ie));
-       return ie;
-}
-
-static inline void irq_setie(unsigned int ie)
-{
-       __asm__ __volatile__("wcsr IE, %0" : : "r" (ie));
-}
-
 #endif /* __IRQ_H */
index 6ca28629fc030518f14bce5e6a7fc1a7b19d71ab..8490bcdf84a6574e005cacce7dfb633c9c3ce5d0 100644 (file)
@@ -44,7 +44,9 @@ static volatile int tx_cts;
 
 void uart_isr(void)
 {
-       unsigned int stat = CSR_UART_EV_PENDING;
+       unsigned int stat;
+       
+       stat = CSR_UART_EV_PENDING;
 
        if(stat & UART_EV_RX) {
                rx_buf[rx_produce] = CSR_UART_RXTX;