Mercurial > ecos
changeset 1840:cc0f35e15ab8
* include/arm_lpc2xxx_ser.inl:
Serial driver for ARM LPC2XXX, using generic 16X5X driver.
| author | asl |
|---|---|
| date | Sun, 14 Nov 2004 14:12:13 +0000 |
| parents | 12386c4b2c0c |
| children | d1d0fbf4647d |
| files | packages/devs/serial/arm/lpc2xxx/current/ChangeLog packages/devs/serial/arm/lpc2xxx/current/cdl/ser_arm_lpc2xxx.cdl packages/devs/serial/arm/lpc2xxx/current/include/arm_lpc2xxx_ser.inl |
| diffstat | 3 files changed, 413 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/lpc2xxx/current/ChangeLog @@ -0,0 +1,37 @@ +2004-09-12 Jani Monoses <jani@iv.ro> + + * include/arm_lpc2xxx_ser.inl: + Serial driver for ARM LPC2XXX, using generic 16X5X driver. + +//=========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2004 eCosCentric Limited +// +// 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., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 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. +// +// 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#### +//===========================================================================
new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/lpc2xxx/current/cdl/ser_arm_lpc2xxx.cdl @@ -0,0 +1,193 @@ +# ==================================================================== +# +# ser_arm_lpc2xxx.cdl +# +# eCos serial ARM/LPC2XXX configuration data +# +# ==================================================================== +#####ECOSGPLCOPYRIGHTBEGIN#### +## ------------------------------------------- +## This file is part of eCos, the Embedded Configurable Operating System. +## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +## Copyright (C) 2004 eCosCentric Limited +## +## 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., +## 59 Temple Place, Suite 330, Boston, MA 02111-1307 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. +## +## 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): jskov +# Original data: gthomas +# Contributors: +# Date: 1999-07-07 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_IO_SERIAL_ARM_LPC2XXX { + display "ARM LPC2XXX serial device drivers" + + parent CYGPKG_IO_SERIAL_DEVICES + active_if CYGPKG_IO_SERIAL + active_if CYGPKG_HAL_ARM_LPC2XXX + + requires CYGPKG_ERROR + include_dir cyg/io + + description " + This option enables the serial device drivers for the + ARM LPC2XXX." + + # FIXME: This really belongs in the GENERIC_16X5X package + cdl_interface CYGINT_IO_SERIAL_GENERIC_16X5X_REQUIRED { + display "Generic 16x5x serial driver required" + } + define_proc { + puts $::cdl_header "#define CYGPRI_IO_SERIAL_GENERIC_16X5X_STEP 4" + } + + + define_proc { + puts $::cdl_system_header "/***** serial driver proc output start *****/" + puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_GENERIC_16X5X_INL <cyg/io/arm_lpc2xxx_ser.inl>" + puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_GENERIC_16X5X_CFG <pkgconf/io_serial_arm_lpc2xxx.h>" + puts $::cdl_system_header "/***** serial driver proc output end *****/" + } + + cdl_component CYGPKG_IO_SERIAL_ARM_LPC2XXX_SERIAL0 { + display "ARM LPC2XXX serial port 0 driver" + flavor bool + default_value 1 + + implements CYGINT_IO_SERIAL_GENERIC_16X5X_REQUIRED + implements CYGINT_IO_SERIAL_FLOW_CONTROL_HW + implements CYGINT_IO_SERIAL_LINE_STATUS_HW + + description " + This option includes the serial device driver for the ARM + LPC2XXX port 0." + + cdl_option CYGDAT_IO_SERIAL_ARM_LPC2XXX_SERIAL0_NAME { + display "Device name for ARM LPC2XXX serial port 0 driver" + flavor data + default_value {"\"/dev/ser0\""} + description " + This option specifies the name of the serial device + for the ARM LPC2XXX port 0." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL0_BAUD { + display "Baud rate for the ARM LPC2XXX 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 ARM LPC2XXX port 0." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL0_BUFSIZE { + display "Buffer size for the ARM LPC2XXX 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 ARM LPC2XXX port 0." + } + } + + cdl_component CYGPKG_IO_SERIAL_ARM_LPC2XXX_SERIAL1 { + display "ARM LPC2XXX serial port 1 driver" + flavor bool + default_value 1 + + implements CYGINT_IO_SERIAL_GENERIC_16X5X_REQUIRED + implements CYGINT_IO_SERIAL_FLOW_CONTROL_HW + implements CYGINT_IO_SERIAL_LINE_STATUS_HW + + description " + This option includes the serial device driver for the ARM + LPC2XXX port 1." + + cdl_option CYGDAT_IO_SERIAL_ARM_LPC2XXX_SERIAL1_NAME { + display "Device name for ARM LPC2XXX serial port 1 driver" + flavor data + default_value {"\"/dev/ser1\""} + description " + This option specifies the name of the serial device + for the ARM LPC2XXX port 1." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL1_BAUD { + display "Baud rate for the ARM LPC2XXX 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 ARM LPC2XXX port 1." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL1_BUFSIZE { + display "Buffer size for the ARM LPC2XXX 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 ARM LPC2XXX port 1." + } + } + + cdl_component CYGPKG_IO_SERIAL_ARM_LPC2XXX_TESTING { + display "Testing parameters" + flavor bool + calculated 1 + active_if CYGPKG_IO_SERIAL_ARM_LPC2XXX_SERIAL0 + + implements CYGINT_IO_SERIAL_TEST_SKIP_9600 + implements CYGINT_IO_SERIAL_TEST_SKIP_115200 + implements CYGINT_IO_SERIAL_TEST_SKIP_PARITY_EVEN + + cdl_option CYGPRI_SER_TEST_SER_DEV { + display "Serial device used for testing" + flavor data + default_value { CYGDAT_IO_SERIAL_ARM_LPC2XXX_SERIAL0_NAME } + } + + define_proc { + puts $::cdl_header "#define CYGPRI_SER_TEST_CRASH_ID \"armlpc2xxx\"" + puts $::cdl_header "#define CYGPRI_SER_TEST_TTY_DEV \"/dev/tty0\"" + } + } +} + +# EOF ser_arm_lpc2xxx.cdl
new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/lpc2xxx/current/include/arm_lpc2xxx_ser.inl @@ -0,0 +1,183 @@ +//========================================================================== +// +// io/serial/arm/arm_lpc2xxx_ser.inl +// +// ARM LPC2XXX Serial I/O definitions +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2004 eCosCentric Limited +// +// 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., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 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. +// +// 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): jani +// Contributors: gthomas, jlarmour +// Date: 1999-02-04 +// Purpose: LPC2XXX Serial I/O module (interrupt driven version) +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <cyg/hal/hal_intr.h> + +//----------------------------------------------------------------------------- +// Baud rate specification + +static unsigned int select_baud[] = { + 9999, // Unused + 50, + 75, + 110, + 134.5, + 150, + 200, + 300, + 600, + 1200, + 1800, + 2400, + 3600, + 4800, + 7200, + 9600, + 14400, + 19200, + 38400, + 57600, + 115200, + 230400 +}; + +// we need dynamically generated divider values because they depend on the +// value of pclk which in turn is changeable + +externC int cyg_var_baud_generator(int baud); +#define CYG_IO_SERIAL_GENERIC_16X5X_BAUD_GENERATOR \ + CYG_HAL_ARM_LPC2XXX_BAUD_GENERATOR + +#ifdef CYGPKG_IO_SERIAL_ARM_LPC2XXX_SERIAL0 +static pc_serial_info lpc2xxx_serial_info0 = + { CYGARC_HAL_LPC2XXX_REG_UART0_BASE, + CYGNUM_HAL_INTERRUPT_UART0 + }; + +#if CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL0_BUFSIZE > 0 +static unsigned char +lpc2xxx_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL0_BUFSIZE]; +static unsigned char +lpc2xxx_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL0_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(lpc2xxx_serial_channel0, + pc_serial_funs, + lpc2xxx_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &lpc2xxx_serial_out_buf0[0], + sizeof(lpc2xxx_serial_out_buf0), + &lpc2xxx_serial_in_buf0[0], + sizeof(lpc2xxx_serial_in_buf0) + ); +#else +static SERIAL_CHANNEL(lpc2xxx_serial_channel0, + pc_serial_funs, + lpc2xxx_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(lpc2xxx_serial_io0, + CYGDAT_IO_SERIAL_ARM_LPC2XXX_SERIAL0_NAME, + 0, // Does not depend on a lower + // level interface + &cyg_io_serial_devio, + pc_serial_init, + pc_serial_lookup, // Serial driver may need initializing + &lpc2xxx_serial_channel0 + ); +#endif // CYGPKG_IO_SERIAL_ARM_LPC2XXX_SERIAL0 + +#ifdef CYGPKG_IO_SERIAL_ARM_LPC2XXX_SERIAL1 +static pc_serial_info lpc2xxx_serial_info1 = + { CYGARC_HAL_LPC2XXX_REG_UART1_BASE, + CYGNUM_HAL_INTERRUPT_UART1 + }; +#if CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL1_BUFSIZE > 0 +static unsigned char +lpc2xxx_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL1_BUFSIZE]; +static unsigned char +lpc2xxx_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL1_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(lpc2xxx_serial_channel1, + pc_serial_funs, + lpc2xxx_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &lpc2xxx_serial_out_buf1[0], + sizeof(lpc2xxx_serial_out_buf1), + &lpc2xxx_serial_in_buf1[0], + sizeof(lpc2xxx_serial_in_buf1) + ); +#else +static SERIAL_CHANNEL(lpc2xxx_serial_channel1, + pc_serial_funs, + lpc2xxx_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC2XXX_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(lpc2xxx_serial_io1, + CYGDAT_IO_SERIAL_ARM_LPC2XXX_SERIAL1_NAME, + 0, // Does not depend on a lower + // level interface + &cyg_io_serial_devio, + pc_serial_init, + pc_serial_lookup, // Serial driver may need initializing + &lpc2xxx_serial_channel1 + ); +#endif // CYGPKG_IO_SERIAL_ARM_LPC2XXX_SERIAL1 + +// EOF arm_lpc2xxx_ser.inl
