diff options
author | Michael Gielda <mgielda@antmicro.com> | 2014-04-03 14:53:04 +0200 |
---|---|---|
committer | Michael Gielda <mgielda@antmicro.com> | 2014-04-03 14:53:04 +0200 |
commit | ae1e4e08a1005a0c487f03ba189d7536e7fdcba6 (patch) | |
tree | f1c296f8a966a9a39876b0e98e16d9c5da1776dd /ecos/packages/devs/serial/arm/at91/current | |
parent | f157da5337118d3c5cd464266796de4262ac9dbd (diff) |
Added the OS files
Diffstat (limited to 'ecos/packages/devs/serial/arm/at91/current')
4 files changed, 1152 insertions, 0 deletions
diff --git a/ecos/packages/devs/serial/arm/at91/current/ChangeLog b/ecos/packages/devs/serial/arm/at91/current/ChangeLog new file mode 100644 index 0000000..3528435 --- /dev/null +++ b/ecos/packages/devs/serial/arm/at91/current/ChangeLog @@ -0,0 +1,102 @@ +2007-06-01 Jim Seymour <jim@cipher.com> + + * src/at91_serial.c (at91_serial_DSR): Remove CYG_FAIL if receive + buffer fills up; eliminate compiler warning when setting "end" + pointer. + +2006-03-05 Oliver Munz <munz@speag.ch> + + * src/at91_serial.c (at91_serial_ISR): Only call the DSR if there + is work to do. + +2006-02-28 Andrew Lunn <andrew.lunn@ascom.ch> + Oliver Munz <munz@speag.ch> + + * src/at91_serial.c (at91_serial_config_port): Enable the DMA + if the control register exists. + +2006-02-19 Andrew Lunn <andrew.lunn@ascom.ch> + + * src/at91_serial.c (at91_serial_lookup): Enable the peripheral + clock at lookup time to keep the power usage low. + +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) + * 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 + high-level driver was not ready to accept data received. + +2003-11-07 Thomas Koeller <thomas.koeller@baslerweb.com> + + * src/at91_serial.c: + * cdl/ser_arm_at91.cdl: Major rewrite to achieve reliable + operation at higher baud rates. + +2003-10-16 Nick Garnett <nickg@balti.calivar.com> + + * src/at91_serial.c (at91_serial_config_port): Added update of + channel configuration, which was missing. + +2003-02-24 Jonathan Larmour <jifl@eCosCentric.com> + + * cdl/ser_arm_at91.cdl: Remove irrelevant doc link. + +2001-09-20 Jesper Skov <jskov@redhat.com> + + * src/at91_serial.c (at91_serial_init): Use valid interrupt priority. + +2001-09-10 Jonathan Larmour <jlarmour@redhat.com> + + * cdl/ser_arm_at91.cdl: + Fix 234000->230400 typo. + +2001-08-14 Jonathan Larmour <jlarmour@redhat.com> + + * src/at91_serial.c (at91_serial_stop_xmit): Write to IDR, not IER. + (at91_serial_ISR): Return CYG_ISR_HANDLED. + +2001-07-24 Gary Thomas <gthomas@redhat.com> + + * src/at91_serial.h: + * src/at91_serial.c: + * cdl/ser_arm_at91.cdl: New file(s) - initial package. + +//=========================================================================== +// ####GPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 or (at your option) any +// later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the +// Free Software Foundation, Inc., 51 Franklin Street, +// Fifth Floor, Boston, MA 02110-1301, USA. +// ------------------------------------------- +// ####GPLCOPYRIGHTEND#### +//=========================================================================== diff --git a/ecos/packages/devs/serial/arm/at91/current/cdl/ser_arm_at91.cdl b/ecos/packages/devs/serial/arm/at91/current/cdl/ser_arm_at91.cdl new file mode 100644 index 0000000..914c05b --- /dev/null +++ b/ecos/packages/devs/serial/arm/at91/current/cdl/ser_arm_at91.cdl @@ -0,0 +1,292 @@ +# ==================================================================== +# +# ser_arm_at91.cdl +# +# eCos serial Atmel AT91 (ARM) configuration data +# +# ==================================================================== +## ####ECOSGPLCOPYRIGHTBEGIN#### +## ------------------------------------------- +## This file is part of eCos, the Embedded Configurable Operating System. +## Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +## +## eCos is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free +## Software Foundation; either version 2 or (at your option) any later +## version. +## +## eCos is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +## for more details. +## +## You should have received a copy of the GNU General Public License +## along with eCos; if not, write to the Free Software Foundation, Inc., +## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +## +## As a special exception, if other files instantiate templates or use +## macros or inline functions from this file, or you compile this file +## and link it with other works to produce a work based on this file, +## this file does not by itself cause the resulting work to be covered by +## the GNU General Public License. However the source code for this file +## must still be made available in accordance with section (3) of the GNU +## General Public License v2. +## +## This exception does not invalidate any other reasons why a work based +## on this file might be covered by the GNU General Public License. +## ------------------------------------------- +## ####ECOSGPLCOPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): gthomas +# Contributors: tkoeller +# Date: 2001-07-24 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + + +cdl_package CYGPKG_IO_SERIAL_ARM_AT91 { + display "Atmel AT91 serial device drivers" + + parent CYGPKG_IO_SERIAL_DEVICES + active_if CYGPKG_IO_SERIAL + active_if CYGPKG_HAL_ARM_AT91 + + requires CYGPKG_ERROR + include_dir cyg/io + include_files ; # none _exported_ whatsoever + description " + This option enables the serial device drivers for the + Atmel AT91." + + implements CYGINT_IO_SERIAL_BLOCK_TRANSFER + + compile -library=libextras.a at91_serial.c + + define_proc { + puts $::cdl_system_header "/***** serial driver proc output start *****/" + puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_DEVICE_HEADER <pkgconf/io_serial_arm_at91.h>" + puts $::cdl_system_header "/***** serial driver proc output end *****/" + } + +cdl_component CYGPKG_IO_SERIAL_ARM_AT91_SERIAL0 { + display "Atmel AT91 serial port 0 driver" + flavor bool + default_value 0 + description " + This option includes the serial device driver for the Atmel AT91 + port 0 (serial A)." + + cdl_option CYGDAT_IO_SERIAL_ARM_AT91_SERIAL0_NAME { + display "Device name for Atmel AT91 serial port 0 driver" + flavor data + default_value {"\"/dev/ser0\""} + description " + This option specifies the name of the serial device for the + Atmel AT91 port 0." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BAUD { + display "Baud rate for the Atmel AT91 serial port 0 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 0." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE { + display "Buffer size for the Atmel AT91 serial port 0 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 0." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_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_SERIAL1 { + display "Atmel AT91 serial port 1 driver" + flavor bool + default_value 1 + description " + This option includes the serial device driver for the Atmel AT91 + port 1 (serial B)." + + cdl_option CYGDAT_IO_SERIAL_ARM_AT91_SERIAL1_NAME { + display "Device name for Atmel AT91 serial port 1 driver" + flavor data + default_value {"\"/dev/ser1\""} + description " + This option specifies the name of the serial device for the + Atmel AT91 port 1." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_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 1." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BUFSIZE { + display "Buffer size for the Atmel AT91 serial port 1 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 1." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_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_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 + description " + Package specific build options including control over + compiler flags used only in building this package, + and details of which tests are built." + + + cdl_option CYGPKG_IO_SERIAL_ARM_AT91_CFLAGS_ADD { + display "Additional compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building these serial device drivers. These flags are used in addition + to the set of global flags." + } + + cdl_option CYGPKG_IO_SERIAL_ARM_AT91_CFLAGS_REMOVE { + display "Suppressed compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building these serial device drivers. These flags are removed from + the set of global flags if present." + } + } + + cdl_component CYGPKG_IO_SERIAL_ARM_AT91_TESTING { + display "Testing parameters" + flavor bool + calculated 1 + active_if CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1 + + cdl_option CYGPRI_SER_TEST_SER_DEV { + display "Serial device used for testing" + flavor data + default_value { CYGDAT_IO_SERIAL_ARM_AT91_SERIAL1_NAME } + } + + define_proc { + puts $::cdl_header "#define CYGPRI_SER_TEST_CRASH_ID \"eb40\"" + puts $::cdl_header "#define CYGPRI_SER_TEST_TTY_DEV \"/dev/tty1\"" + } + } +} + +# EOF ser_arm_at91.cdl diff --git a/ecos/packages/devs/serial/arm/at91/current/src/at91_serial.c b/ecos/packages/devs/serial/arm/at91/current/src/at91_serial.c new file mode 100644 index 0000000..26b0d14 --- /dev/null +++ b/ecos/packages/devs/serial/arm/at91/current/src/at91_serial.c @@ -0,0 +1,650 @@ +//========================================================================== +// +// devs/serial/arm/at91/at91_serial.c +// +// Atmel AT91/EB40 Serial I/O Interface Module (interrupt driven) +// +//========================================================================== +// ####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later +// version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License +// along with eCos; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// As a special exception, if other files instantiate templates or use +// macros or inline functions from this file, or you compile this file +// and link it with other works to produce a work based on this file, +// this file does not by itself cause the resulting work to be covered by +// the GNU General Public License. However the source code for this file +// must still be made available in accordance with section (3) of the GNU +// General Public License v2. +// +// This exception does not invalidate any other reasons why a work based +// on this file might be covered by the GNU General Public License. +// ------------------------------------------- +// ####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas, tkoeller, sblock +// Date: 2001-07-24 +// Purpose: Atmel AT91/EB40 Serial I/O module (interrupt driven version) +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/hal.h> +#include <pkgconf/infra.h> +#include <pkgconf/system.h> +#include <pkgconf/io_serial.h> +#include <pkgconf/io.h> +#include <pkgconf/kernel.h> + +#include <cyg/io/io.h> +#include <cyg/hal/hal_io.h> +#include <cyg/hal/hal_intr.h> +#include <cyg/io/devtab.h> +#include <cyg/io/serial.h> +#include <cyg/infra/diag.h> +#include <cyg/infra/cyg_type.h> +#include <cyg/infra/cyg_ass.h> + +externC void * memcpy( void *, const void *, size_t ); + +#ifdef CYGPKG_IO_SERIAL_ARM_AT91 + +#include "at91_serial.h" + +#define RCVBUF_EXTRA 16 +#define RCV_TIMEOUT 10 + +#define SIFLG_NONE 0x00 +#define SIFLG_TX_READY 0x01 +#define SIFLG_XMIT_BUSY 0x02 +#define SIFLG_XMIT_CONTINUE 0x04 + +typedef struct at91_serial_info { + CYG_ADDRWORD base; + CYG_WORD int_num; + CYG_WORD stat; + int transmit_size; + cyg_interrupt serial_interrupt; + cyg_handle_t serial_interrupt_handle; + cyg_uint8 *rcv_buffer[2]; + cyg_uint16 rcv_chunk_size; + cyg_uint8 curbuf; + cyg_uint8 flags; +} 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_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, + 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) \ + || (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, + const void *xbuf, cyg_uint32 *len); +static void at91_serial_start_xmit(serial_channel *chan); +static void at91_serial_stop_xmit(serial_channel *chan); + +static cyg_uint32 at91_serial_ISR(cyg_vector_t vector, cyg_addrword_t data); +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_SERIAL2) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE > 0) +static SERIAL_FUNS(at91_serial_funs_interrupt, + at91_serial_putc_interrupt, + at91_serial_getc_interrupt, + at91_serial_set_config, + at91_serial_start_xmit, + at91_serial_stop_xmit + ); +#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_SERIAL2) && CYGNUM_IO_SERIAL_ARM_AT91_SERIAL2_BUFSIZE == 0) +static SERIAL_FUNS(at91_serial_funs_polled, + at91_serial_putc_polled, + at91_serial_getc_polled, + at91_serial_set_config, + at91_serial_start_xmit, + at91_serial_stop_xmit + ); +#endif + +#ifdef CYGPKG_IO_SERIAL_ARM_AT91_SERIAL0 +static cyg_uint8 at91_serial_rcv_buffer_0 + [2][CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_RCV_CHUNK_SIZE + RCVBUF_EXTRA]; +static at91_serial_info at91_serial_info0 = { + base : (CYG_ADDRWORD) AT91_USART0, + int_num : CYGNUM_HAL_INTERRUPT_USART0, + rcv_chunk_size : CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_RCV_CHUNK_SIZE, + rcv_buffer : {at91_serial_rcv_buffer_0[0], at91_serial_rcv_buffer_0[1]} +}; + +#if CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE > 0 +static unsigned char at91_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE]; +static unsigned char at91_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(at91_serial_channel0, + at91_serial_funs_interrupt, + at91_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &at91_serial_out_buf0[0], sizeof(at91_serial_out_buf0), + &at91_serial_in_buf0[0], sizeof(at91_serial_in_buf0) + ); +#else +static SERIAL_CHANNEL(at91_serial_channel0, + at91_serial_funs_polled, + at91_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_AT91_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(at91_serial_io0, + CYGDAT_IO_SERIAL_ARM_AT91_SERIAL0_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_channel0 + ); +#endif // CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1 + +#ifdef CYGPKG_IO_SERIAL_ARM_AT91_SERIAL1 +static cyg_uint8 at91_serial_rcv_buffer_1 + [2][CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_RCV_CHUNK_SIZE + RCVBUF_EXTRA]; +static at91_serial_info at91_serial_info1 = { + base : (CYG_ADDRWORD) AT91_USART1, + int_num : CYGNUM_HAL_INTERRUPT_USART1, + 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]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(at91_serial_channel1, + at91_serial_funs_interrupt, + at91_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &at91_serial_out_buf1[0], sizeof(at91_serial_out_buf1), + &at91_serial_in_buf1[0], sizeof(at91_serial_in_buf1) + ); +#else +static SERIAL_CHANNEL(at91_serial_channel1, + at91_serial_funs_polled, + at91_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_AT91_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(at91_serial_io1, + CYGDAT_IO_SERIAL_ARM_AT91_SERIAL1_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_channel1 + ); +#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) +{ + at91_serial_info * const at91_chan = (at91_serial_info *)chan->dev_priv; + const CYG_ADDRWORD base = at91_chan->base; + cyg_uint32 parity = select_parity[new_config->parity]; + cyg_uint32 word_length = select_word_length[new_config->word_length-CYGNUM_SERIAL_WORD_LENGTH_5]; + cyg_uint32 stop_bits = select_stop_bits[new_config->stop]; + + if ((word_length == 0xFF) || + (parity == 0xFF) || + (stop_bits == 0xFF)) { + return false; // Unsupported configuration + } + + // Reset device + HAL_WRITE_UINT32(base + AT91_US_CR, AT91_US_CR_RxRESET | AT91_US_CR_TxRESET); + + // Configuration + HAL_WRITE_UINT32(base + AT91_US_MR, parity | word_length | stop_bits); + + // Baud rate + HAL_WRITE_UINT32(base + AT91_US_BRG, AT91_US_BAUD(select_baud[new_config->baud])); + + // Disable all interrupts + HAL_WRITE_UINT32(base + AT91_US_IDR, 0xFFFFFFFF); + + // Start receiver + at91_chan->curbuf = 0; + HAL_WRITE_UINT32(base + AT91_US_RPR, (CYG_ADDRESS) at91_chan->rcv_buffer[0]); + HAL_WRITE_UINT32(base + AT91_US_RTO, RCV_TIMEOUT); + HAL_WRITE_UINT32(base + AT91_US_IER, AT91_US_IER_ENDRX | AT91_US_IER_TIMEOUT); + HAL_WRITE_UINT32(base + AT91_US_RCR, at91_chan->rcv_chunk_size); + + // Enable RX and TX + HAL_WRITE_UINT32( + base + AT91_US_CR, + AT91_US_CR_RxENAB | AT91_US_CR_TxENAB | AT91_US_CR_RSTATUS | AT91_US_CR_STTTO + ); + + // Enable the DMA is the control register exists +#ifdef AT91_US_PTCR + HAL_WRITE_UINT32(base + AT91_US_PTCR, + AT91_US_PTCR_RXTEN | + AT91_US_PTCR_TXTEN); +#endif + + if (new_config != &chan->config) { + chan->config = *new_config; + } + + return true; +} + +// Function to initialize the device. Called at bootstrap time. +static bool +at91_serial_init(struct cyg_devtab_entry *tab) +{ + serial_channel * const chan = (serial_channel *) tab->priv; + at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv; + int res; + +#ifdef CYGDBG_IO_INIT + diag_printf("AT91 SERIAL init - dev: %x.%d\n", at91_chan->base, at91_chan->int_num); +#endif + at91_chan->curbuf = 0; + at91_chan->flags = SIFLG_NONE; + at91_chan->stat = 0; + (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices + if (chan->out_cbuf.len != 0) { + cyg_drv_interrupt_create(at91_chan->int_num, + 4, // Priority + (cyg_addrword_t)chan, // Data item passed to interrupt handler + at91_serial_ISR, + at91_serial_DSR, + &at91_chan->serial_interrupt_handle, + &at91_chan->serial_interrupt); + cyg_drv_interrupt_attach(at91_chan->serial_interrupt_handle); + cyg_drv_interrupt_unmask(at91_chan->int_num); + } + res = at91_serial_config_port(chan, &chan->config, true); + return res; +} + +// This routine is called when the device is "looked" up (i.e. attached) +static Cyg_ErrNo +at91_serial_lookup(struct cyg_devtab_entry **tab, + struct cyg_devtab_entry *sub_tab, + const char *name) +{ + serial_channel * const chan = (serial_channel *) (*tab)->priv; + +#ifdef AT91_PMC_PCER + // Enable the peripheral clock to the device + at91_serial_info * const at91_chan = (at91_serial_info *)chan->dev_priv; + HAL_WRITE_UINT32(AT91_PMC+AT91_PMC_PCER, + (1 << at91_chan->int_num)); +#endif + (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices + return ENOERR; +} + +// Send a character to the device output buffer. +// Return 'true' if character is sent to device +static bool +at91_serial_putc_interrupt(serial_channel *chan, unsigned char c) +{ + at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv; + const bool res = (at91_chan->flags & SIFLG_XMIT_BUSY) == 0; + + if (res) { + const CYG_ADDRWORD base = at91_chan->base; + HAL_WRITE_UINT32(base + AT91_US_THR, c); + at91_chan->flags |= SIFLG_XMIT_BUSY; + } + 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) \ + || (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) +{ + at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv; + const CYG_ADDRWORD base = at91_chan->base; + CYG_WORD32 w; + + while (HAL_READ_UINT32(base + AT91_US_CSR, w), (w & AT91_US_IER_TxRDY) == 0) + CYG_EMPTY_STATEMENT; + 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 +at91_serial_getc_interrupt(serial_channel *chan) +{ + at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv; + const CYG_ADDRWORD base = at91_chan->base; + CYG_WORD32 c; + + // Read data + HAL_READ_UINT32(base + AT91_US_RHR, c); + 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) \ + || (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) +{ + at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv; + const CYG_ADDRWORD base = at91_chan->base; + CYG_WORD32 c; + + while (HAL_READ_UINT32(base + AT91_US_CSR, c), (c & AT91_US_IER_RxRDY) == 0) + CYG_EMPTY_STATEMENT; + // Read data + 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, + const void *xbuf, cyg_uint32 *len) +{ + switch (key) { + case CYG_IO_SET_CONFIG_SERIAL_INFO: + { + cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf; + if ( *len < sizeof(cyg_serial_info_t) ) { + return -EINVAL; + } + *len = sizeof(cyg_serial_info_t); + if ( true != at91_serial_config_port(chan, config, false) ) + return -EINVAL; + } + break; + default: + return -EINVAL; + } + return ENOERR; +} + +// Enable the transmitter on the device +static void +at91_serial_start_xmit(serial_channel *chan) +{ + at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv; + const CYG_ADDRWORD base = at91_chan->base; + unsigned char * chars; + xmt_req_reply_t res; + + cyg_drv_dsr_lock(); + if ((at91_chan->flags & SIFLG_XMIT_CONTINUE) == 0) { + 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; + case CYG_XMT_DISABLED: + (chan->callbacks->xmt_char)(chan); // Kick transmitter + at91_chan->flags |= SIFLG_XMIT_CONTINUE; + HAL_WRITE_UINT32(base + AT91_US_IER, AT91_US_IER_TxRDY); + break; + default: + // No data or unknown error - can't do anything about it + break; + } + } + cyg_drv_dsr_unlock(); +} + +// Disable the transmitter on the device +static void +at91_serial_stop_xmit(serial_channel *chan) +{ + at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv; + const CYG_ADDRWORD base = at91_chan->base; + HAL_WRITE_UINT32(base + AT91_US_IDR, AT91_US_IER_TxRDY | AT91_US_IER_ENDTX); + at91_chan->flags &= ~SIFLG_XMIT_CONTINUE; +} + +// Serial I/O - low level interrupt handler (ISR) +static cyg_uint32 +at91_serial_ISR(cyg_vector_t vector, cyg_addrword_t data) +{ + serial_channel * const chan = (serial_channel *) data; + at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv; + const CYG_ADDRWORD base = at91_chan->base; + CYG_WORD32 stat, mask; + cyg_uint32 retcode = 0; + + HAL_READ_UINT32(base + AT91_US_CSR, stat); + HAL_READ_UINT32(base + AT91_US_IMR, mask); + stat &= mask; + + if (stat & (AT91_US_IER_ENDRX | AT91_US_IER_TIMEOUT)) { + cyg_uint32 x; + HAL_WRITE_UINT32(base + AT91_US_IDR, AT91_US_IER_ENDRX | AT91_US_IER_TIMEOUT); + HAL_WRITE_UINT32(base + AT91_US_RCR, 0); + HAL_WRITE_UINT32(base + AT91_US_RTO, 0); + HAL_READ_UINT32(base + AT91_US_RPR, x); + HAL_WRITE_UINT32( + base + AT91_US_RCR, + (CYG_ADDRESS) at91_chan->rcv_buffer[at91_chan->curbuf] + + at91_chan->rcv_chunk_size + RCVBUF_EXTRA - x + ); + retcode = CYG_ISR_CALL_DSR; + } + + if (stat & (AT91_US_IER_TxRDY | AT91_US_IER_ENDTX)) { + HAL_WRITE_UINT32(base + AT91_US_IDR, AT91_US_IER_TxRDY | AT91_US_IER_ENDTX); + retcode = CYG_ISR_CALL_DSR; + } + at91_chan->stat |= stat; + + cyg_drv_interrupt_acknowledge(vector); + return retcode; +} + +// Serial I/O - high level interrupt handler (DSR) +static void +at91_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) +{ + serial_channel * const chan = (serial_channel *) data; + at91_serial_info * const at91_chan = (at91_serial_info *) chan->dev_priv; + const CYG_ADDRWORD base = at91_chan->base; + CYG_WORD32 stat; + + cyg_drv_interrupt_mask(vector); + stat = at91_chan->stat; + at91_chan->stat = 0; + cyg_drv_interrupt_unmask(vector); + + 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; + cyg_uint32 temp_word; + + at91_chan->curbuf = nb; + HAL_WRITE_UINT32(base + AT91_US_RCR, 0); + HAL_READ_UINT32(base + AT91_US_RPR, temp_word); + end = (const cyg_uint8 *)temp_word; + HAL_WRITE_UINT32(base + AT91_US_RTO, RCV_TIMEOUT); + HAL_WRITE_UINT32(base + AT91_US_CR, AT91_US_CR_RSTATUS | AT91_US_CR_STTTO); + HAL_WRITE_UINT32(base + AT91_US_RPR, (CYG_ADDRESS) at91_chan->rcv_buffer[nb]); + HAL_WRITE_UINT32(base + AT91_US_RCR, at91_chan->rcv_chunk_size); + HAL_WRITE_UINT32( + base + AT91_US_IER, + AT91_US_IER_ENDRX | AT91_US_IER_TIMEOUT + ); + + while (p < end) { + rcv_req_reply_t res; + int space_avail; + unsigned char *space; + + res = (chan->callbacks->data_rcv_req)( + chan, + end - at91_chan->rcv_buffer[cb], + &space_avail, + &space + ); + + switch (res) + { + case CYG_RCV_OK: + memcpy(space, p, space_avail); + (chan->callbacks->data_rcv_done)(chan, space_avail); + p += space_avail; + break; + case CYG_RCV_DISABLED: + (chan->callbacks->rcv_char)(chan, *p++); + break; + default: + // Buffer full or unknown error, can't do anything about it + // Discard data + p = end; + break; + } + } + } + + 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 diff --git a/ecos/packages/devs/serial/arm/at91/current/src/at91_serial.h b/ecos/packages/devs/serial/arm/at91/current/src/at91_serial.h new file mode 100644 index 0000000..4227143 --- /dev/null +++ b/ecos/packages/devs/serial/arm/at91/current/src/at91_serial.h @@ -0,0 +1,108 @@ +#ifndef CYGONCE_ARM_AT91_SERIAL_H +#define CYGONCE_ARM_AT91_SERIAL_H + +// ==================================================================== +// +// at91_serial.h +// +// Device I/O - Description of Atmel AT91/EB40 serial hardware +// +// ==================================================================== +// ####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later +// version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License +// along with eCos; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// As a special exception, if other files instantiate templates or use +// macros or inline functions from this file, or you compile this file +// and link it with other works to produce a work based on this file, +// this file does not by itself cause the resulting work to be covered by +// the GNU General Public License. However the source code for this file +// must still be made available in accordance with section (3) of the GNU +// General Public License v2. +// +// This exception does not invalidate any other reasons why a work based +// on this file might be covered by the GNU General Public License. +// ------------------------------------------- +// ####ECOSGPLCOPYRIGHTEND#### +// ==================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 2001-07-24 +// Purpose: Internal interfaces for serial I/O drivers +// Description: +// +//####DESCRIPTIONEND#### +// +// ==================================================================== + +// Description of serial ports on Atmel AT91/EB40 + +#include <cyg/hal/plf_io.h> // Register definitions + +#define AT91_UART_RX_INTS (AT91_US_IER_RxRDY) + +static cyg_uint32 select_word_length[] = { + AT91_US_MR_LENGTH_5, + AT91_US_MR_LENGTH_6, + AT91_US_MR_LENGTH_7, + AT91_US_MR_LENGTH_8 +}; + +static cyg_uint32 select_stop_bits[] = { + 0, + AT91_US_MR_STOP_1, // 1 stop bit + AT91_US_MR_STOP_1_5, // 1.5 stop bit + AT91_US_MR_STOP_2 // 2 stop bits +}; + +static cyg_uint32 select_parity[] = { + AT91_US_MR_PARITY_NONE, // No parity + AT91_US_MR_PARITY_EVEN, // Even parity + AT91_US_MR_PARITY_ODD, // Odd parity + AT91_US_MR_PARITY_MARK, // Mark (1) parity + AT91_US_MR_PARITY_SPACE // Space (0) parity +}; + +static cyg_int32 select_baud[] = { + 0, // Unused + 50, // 50 + 75, // 75 + 110, // 110 + 0, // 134.5 + 150, // 150 + 200, // 200 + 300, // 300 + 600, // 600 + 1200, // 1200 + 1800, // 1800 + 2400, // 2400 + 3600, // 3600 + 4800, // 4800 + 7200, // 7200 + 9600, // 9600 + 14400, // 14400 + 19200, // 19200 + 38400, // 38400 + 57600, // 57600 + 115200, // 115200 + 230400, // 230400 +}; + +#endif // CYGONCE_ARM_AT91_SERIAL_H |