changeset 1479:7f22303e92aa

* src/at91_serial.c (at91_serial_getc_polled) * src/ay91_serial.c (at91_serial_putc_polled): Only define these functions if polled IO is configured so avoiding compiler warnings. * src/at91_serial.c: If both a transmitter and a receiver interrupt arrive at the same time, process the receiver interrupt first.
author asl
date Mon, 26 Jan 2004 08:38:22 +0000
parents 5dd2b854cc32
children b657b20a6ea2
files packages/devs/serial/arm/at91/current/ChangeLog packages/devs/serial/arm/at91/current/src/at91_serial.c
diffstat 2 files changed, 57 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/packages/devs/serial/arm/at91/current/ChangeLog
+++ b/packages/devs/serial/arm/at91/current/ChangeLog
@@ -1,3 +1,16 @@
+2004-01-26  Andrew Lunn  <andrew.lunn@ascom.ch>
+
+	* src/at91_serial.c (at91_serial_getc_polled) 
+	* src/ay91_serial.c (at91_serial_putc_polled):
+	Only define these functions if polled IO is configured so
+	avoiding compiler warnings.
+
+2004-01-16  Thomas Koeller  <thomas.koeller@baslerweb.com>
+
+	* src/at91_serial.c: If both a transmitter and a receiver
+	interrupt arrive at the same time, process the receiver
+	interrupt first.
+
 2003-11-21  Thomas Koeller  <thomas.koeller@baslerweb.com>
 
 	* src/at91_serial.c: Fix endless loop that would occur if
--- a/packages/devs/serial/arm/at91/current/src/at91_serial.c
+++ b/packages/devs/serial/arm/at91/current/src/at91_serial.c
@@ -95,12 +95,18 @@ typedef struct at91_serial_info {
 
 static bool at91_serial_init(struct cyg_devtab_entry *tab);
 static bool at91_serial_putc_interrupt(serial_channel *chan, unsigned char c);
+#if (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL0) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE == 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE == 0)
 static bool at91_serial_putc_polled(serial_channel *chan, unsigned char c);
+#endif
 static Cyg_ErrNo at91_serial_lookup(struct cyg_devtab_entry **tab, 
                                     struct cyg_devtab_entry *sub_tab,
                                     const char *name);
 static unsigned char at91_serial_getc_interrupt(serial_channel *chan);
+#if (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL0) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE == 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE == 0)
 static unsigned char at91_serial_getc_polled(serial_channel *chan);
+#endif
 static Cyg_ErrNo at91_serial_set_config(serial_channel *chan, cyg_uint32 key,
                                         const void *xbuf, cyg_uint32 *len);
 static void at91_serial_start_xmit(serial_channel *chan);
@@ -331,6 +337,8 @@ at91_serial_putc_interrupt(serial_channe
     return res;
 }
 
+#if (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL0) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE == 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE == 0)
 static bool
 at91_serial_putc_polled(serial_channel *chan, unsigned char c)
 {
@@ -343,6 +351,7 @@ at91_serial_putc_polled(serial_channel *
     HAL_WRITE_UINT32(base + AT91_US_THR, c);
     return true;
 }
+#endif
 
 // Fetch a character from the device input buffer, waiting if necessary
 static unsigned char 
@@ -357,6 +366,8 @@ at91_serial_getc_interrupt(serial_channe
     return (unsigned char) c;
 }
 
+#if (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL0) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE == 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE == 0)
 static unsigned char 
 at91_serial_getc_polled(serial_channel *chan)
 {
@@ -370,7 +381,7 @@ at91_serial_getc_polled(serial_channel *
     HAL_READ_UINT32(base + AT91_US_RHR, c);
     return (unsigned char) c;
 }
-
+#endif
 // Set up the device characteristics; baud rate, etc.
 static Cyg_ErrNo
 at91_serial_set_config(serial_channel *chan, cyg_uint32 key,
@@ -485,37 +496,6 @@ at91_serial_DSR(cyg_vector_t vector, cyg
     at91_chan->stat = 0;
     cyg_drv_interrupt_unmask(vector);    
 
-    if (stat & AT91_US_IER_TxRDY) {
-        at91_chan->flags &= ~SIFLG_XMIT_BUSY;
-        (chan->callbacks->xmt_char)(chan);
-        if (at91_chan->flags & SIFLG_XMIT_CONTINUE)
-            HAL_WRITE_UINT32(base + AT91_US_IER, AT91_US_IER_TxRDY);
-    }
-    
-    if (stat & AT91_US_IER_ENDTX) {
-        (chan->callbacks->data_xmt_done)(chan, at91_chan->transmit_size);
-        if (at91_chan->flags & SIFLG_XMIT_CONTINUE) {
-            unsigned char * chars;
-            xmt_req_reply_t res;
-
-            res = (chan->callbacks->data_xmt_req)(chan, 0xffff, &at91_chan->transmit_size, &chars);
-
-            switch (res)
-            {
-                case CYG_XMT_OK:
-                    HAL_WRITE_UINT32(base + AT91_US_TPR, (CYG_WORD32) chars);
-                    HAL_WRITE_UINT32(base + AT91_US_TCR, at91_chan->transmit_size);
-                    at91_chan->flags |= SIFLG_XMIT_CONTINUE;
-                    HAL_WRITE_UINT32(base + AT91_US_IER, AT91_US_IER_ENDTX);
-                    break;
-                default:
-                    // No data or unknown error - can't do anything about it
-                    // CYG_XMT_DISABLED should not happen here!
-                    break;
-            }
-        }
-    }
-
     if (stat & (AT91_US_IER_ENDRX | AT91_US_IER_TIMEOUT)) {
         const cyg_uint8 cb = at91_chan->curbuf, nb = cb ^ 0x01;
         const cyg_uint8 * p = at91_chan->rcv_buffer[cb], * end;
@@ -531,7 +511,7 @@ at91_serial_DSR(cyg_vector_t vector, cyg
             base + AT91_US_IER,
             AT91_US_IER_ENDRX | AT91_US_IER_TIMEOUT
         );
-        
+
         while (p < end) {
             rcv_req_reply_t res;
             int space_avail;
@@ -563,5 +543,36 @@ at91_serial_DSR(cyg_vector_t vector, cyg
             }
         }
     }
+
+    if (stat & AT91_US_IER_TxRDY) {
+        at91_chan->flags &= ~SIFLG_XMIT_BUSY;
+        (chan->callbacks->xmt_char)(chan);
+        if (at91_chan->flags & SIFLG_XMIT_CONTINUE)
+            HAL_WRITE_UINT32(base + AT91_US_IER, AT91_US_IER_TxRDY);
+    }
+    
+    if (stat & AT91_US_IER_ENDTX) {
+        (chan->callbacks->data_xmt_done)(chan, at91_chan->transmit_size);
+        if (at91_chan->flags & SIFLG_XMIT_CONTINUE) {
+            unsigned char * chars;
+            xmt_req_reply_t res;
+
+            res = (chan->callbacks->data_xmt_req)(chan, 0xffff, &at91_chan->transmit_size, &chars);
+
+            switch (res)
+            {
+                case CYG_XMT_OK:
+                    HAL_WRITE_UINT32(base + AT91_US_TPR, (CYG_WORD32) chars);
+                    HAL_WRITE_UINT32(base + AT91_US_TCR, at91_chan->transmit_size);
+                    at91_chan->flags |= SIFLG_XMIT_CONTINUE;
+                    HAL_WRITE_UINT32(base + AT91_US_IER, AT91_US_IER_ENDTX);
+                    break;
+                default:
+                    // No data or unknown error - can't do anything about it
+                    // CYG_XMT_DISABLED should not happen here!
+                    break;
+            }
+        }
+    }
 }
 #endif