# HG changeset patch # User asl # Date 1100163463 0 # Node ID de3268a7fa424c837b0d5253a0871c88a9d6a331 # Parent 30d166811fe7051b530d0c30553ec1e80c7a0792 * src/at91_serial.c: Added third port diff --git a/packages/devs/serial/arm/at91/current/ChangeLog b/packages/devs/serial/arm/at91/current/ChangeLog --- 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 + + * src/at91_serial.c: Added third port + 2004-01-26 Andrew Lunn * src/at91_serial.c (at91_serial_getc_polled) diff --git a/packages/devs/serial/arm/at91/current/cdl/ser_arm_at91.cdl b/packages/devs/serial/arm/at91/current/cdl/ser_arm_at91.cdl --- 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 diff --git a/packages/devs/serial/arm/at91/current/src/at91_serial.c b/packages/devs/serial/arm/at91/current/src/at91_serial.c --- 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) {