changeset 1825:de3268a7fa42

* src/at91_serial.c: Added third port
author asl
date Thu, 11 Nov 2004 08:57:43 +0000
parents 30d166811fe7
children 1865520e607a
files packages/devs/serial/arm/at91/current/ChangeLog packages/devs/serial/arm/at91/current/cdl/ser_arm_at91.cdl packages/devs/serial/arm/at91/current/src/at91_serial.c
diffstat 3 files changed, 123 insertions(+), 8 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,7 @@
+2004-11-10  Sebastian Block <sebastianblock@gmx.net>
+
+        * src/at91_serial.c: Added third port
+        
 2004-01-26  Andrew Lunn  <andrew.lunn@ascom.ch>
 
 	* src/at91_serial.c (at91_serial_getc_polled) 
--- a/packages/devs/serial/arm/at91/current/cdl/ser_arm_at91.cdl
+++ b/packages/devs/serial/arm/at91/current/cdl/ser_arm_at91.cdl
@@ -183,6 +183,62 @@ cdl_component CYGPKG_IO_SERIAL_ARM_AT91_
     }
 }
 
+cdl_component CYGPKG_IO_SERIAL_ARM_AT91_SERIAL2 {
+    display       "Atmel AT91 serial port 2 driver"
+    flavor        bool
+    default_value 1
+    description   "
+        This option includes the serial device driver for the Atmel AT91 
+        port 2 (serial C)."
+
+    cdl_option CYGDAT_IO_SERIAL_ARM_AT91_SERIAL2_NAME {
+        display       "Device name for Atmel AT91 serial port 1 driver"
+        flavor        data
+        default_value {"\"/dev/ser2\""}
+        description   "
+            This option specifies the name of the serial device for the 
+            Atmel AT91 port 2."
+    }
+
+    cdl_option CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BAUD {
+        display       "Baud rate for the Atmel AT91 serial port 1 driver"
+        flavor        data
+        legal_values  { 50 75 110 "134_5" 150 200 300 600 1200 1800 2400 3600
+                      4800 7200 9600 14400 19200 38400 57600 115200 230400
+        }
+        default_value 38400
+        description   "
+            This option specifies the default baud rate (speed) for the
+            Atmel AT91 port 2."
+    }
+
+    cdl_option CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE {
+        display       "Buffer size for the Atmel AT91 serial port 2 driver"
+        flavor        data
+        legal_values  0 to 8192
+        default_value 128
+        description   "
+            This option specifies the size of the internal buffers used 
+            for the Atmel AT91 port 2."
+    }
+    
+    cdl_option CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_RCV_CHUNK_SIZE {
+        display       "Receive data chunk size"
+        flavor        data
+        legal_values  1 to 65519
+        default_value 1
+        description   "
+            This parameter can be used to reduce the number of interrupts
+            that must be processed by the driver. An interrupt will only
+            be generated if either this many data bytes have been received
+            or the receiver has been idle for some time. This reduces
+            overall system load at the expense of making the driver less
+            responsive and using slightly more memory for buffering data.
+            Setting this parameter to 1 will give standard behavior."
+    }
+}
+
+
     cdl_component CYGPKG_IO_SERIAL_ARM_AT91_OPTIONS {
         display "Serial device driver build options"
         flavor  none
--- a/packages/devs/serial/arm/at91/current/src/at91_serial.c
+++ b/packages/devs/serial/arm/at91/current/src/at91_serial.c
@@ -41,7 +41,7 @@
 //#####DESCRIPTIONBEGIN####
 //
 // Author(s):     gthomas
-// Contributors:  gthomas, tkoeller
+// Contributors:  gthomas, tkoeller, sblock
 // Date:          2001-07-24
 // Purpose:       Atmel AT91/EB40 Serial I/O module (interrupt driven version)
 // Description: 
@@ -96,7 +96,8 @@ 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)
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE == 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL2) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_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, 
@@ -104,7 +105,8 @@ static Cyg_ErrNo at91_serial_lookup(stru
                                     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)
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE == 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL2) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_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,
@@ -116,7 +118,8 @@ static cyg_uint32 at91_serial_ISR(cyg_ve
 static void       at91_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
 
 #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)
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE > 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL2) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE > 0)
 static SERIAL_FUNS(at91_serial_funs_interrupt, 
                    at91_serial_putc_interrupt, 
                    at91_serial_getc_interrupt,
@@ -127,7 +130,8 @@ static SERIAL_FUNS(at91_serial_funs_inte
 #endif
 
 #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)
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE == 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL2) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE == 0)
 static SERIAL_FUNS(at91_serial_funs_polled, 
                    at91_serial_putc_polled, 
                    at91_serial_getc_polled,
@@ -193,7 +197,6 @@ static at91_serial_info at91_serial_info
     rcv_chunk_size  : CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_RCV_CHUNK_SIZE,
     rcv_buffer      : {at91_serial_rcv_buffer_1[0], at91_serial_rcv_buffer_1[1]}
 };
-
 #if CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE > 0
 static unsigned char at91_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE];
 static unsigned char at91_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE];
@@ -231,6 +234,56 @@ DEVTAB_ENTRY(at91_serial_io1,
     );
 #endif //  CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1
 
+
+#ifdef CYGPKG_IO_SERIAL_ARM_AT91_SERIAL2
+
+static cyg_uint8 at91_serial_rcv_buffer_2
+    [2][CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_RCV_CHUNK_SIZE + RCVBUF_EXTRA];
+static at91_serial_info at91_serial_info2 = {
+    base            : (CYG_ADDRWORD) AT91_USART2,
+    int_num         : CYGNUM_HAL_INTERRUPT_USART2,
+    rcv_chunk_size  : CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_RCV_CHUNK_SIZE,
+    rcv_buffer      : {at91_serial_rcv_buffer_2[0], at91_serial_rcv_buffer_2[1]}
+};
+
+#if CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE > 0
+static unsigned char at91_serial_out_buf2[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE];
+static unsigned char at91_serial_in_buf2[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE];
+
+static SERIAL_CHANNEL_USING_INTERRUPTS(at91_serial_channel2,
+                                       at91_serial_funs_interrupt, 
+                                       at91_serial_info2,
+                                       CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BAUD),
+                                       CYG_SERIAL_STOP_DEFAULT,
+                                       CYG_SERIAL_PARITY_DEFAULT,
+                                       CYG_SERIAL_WORD_LENGTH_DEFAULT,
+                                       CYG_SERIAL_FLAGS_DEFAULT,
+                                       &at91_serial_out_buf2[0], sizeof(at91_serial_out_buf2),
+                                       &at91_serial_in_buf2[0], sizeof(at91_serial_in_buf2)
+    );
+#else
+static SERIAL_CHANNEL(at91_serial_channel2,
+                      at91_serial_funs_polled, 
+                      at91_serial_info2,
+                      CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BAUD),
+                      CYG_SERIAL_STOP_DEFAULT,
+                      CYG_SERIAL_PARITY_DEFAULT,
+                      CYG_SERIAL_WORD_LENGTH_DEFAULT,
+                      CYG_SERIAL_FLAGS_DEFAULT
+    );
+#endif
+
+DEVTAB_ENTRY(at91_serial_io2, 
+             CYGDAT_IO_SERIAL_ARM_AT91_SERIAL2_NAME,
+             0,                     // Does not depend on a lower level interface
+             &cyg_io_serial_devio, 
+             at91_serial_init, 
+             at91_serial_lookup,     // Serial driver may need initializing
+             &at91_serial_channel2
+    );
+#endif //  CYGPKG_IO_SERIAL_ARM_AT91_SERIAL2
+
+
 // Internal function to actually configure the hardware to desired baud rate, etc.
 static bool
 at91_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init)
@@ -338,7 +391,8 @@ at91_serial_putc_interrupt(serial_channe
 }
 
 #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)
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE == 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL2) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE == 0)
 static bool
 at91_serial_putc_polled(serial_channel *chan, unsigned char c)
 {
@@ -367,7 +421,8 @@ at91_serial_getc_interrupt(serial_channe
 }
 
 #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)
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE == 0) \
+ || (defined(CYGPKG_IO_SERIAL_ARM_AT91_SERIAL2) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE == 0)
 static unsigned char 
 at91_serial_getc_polled(serial_channel *chan)
 {