Mercurial > ecos
changeset 2501:acea2c4b6c65
* include/arm_lpc24xx_ser.inl:
Serial driver for ARM LPC24XX, using generic 16X5X driver.
| author | asl |
|---|---|
| date | Sat, 12 Jul 2008 14:32:32 +0000 |
| parents | 365259c4fd0b |
| children | 7b16b2d61ef3 |
| files | packages/devs/serial/arm/lpc24xx/current/ChangeLog packages/devs/serial/arm/lpc24xx/current/cdl/ser_arm_lpc24xx.cdl packages/devs/serial/arm/lpc24xx/current/include/arm_lpc24xx_ser.inl |
| diffstat | 3 files changed, 561 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/lpc24xx/current/ChangeLog @@ -0,0 +1,37 @@ +2008-07-07 Uwe Kindler <uwe_kindler@web.de> + + * include/arm_lpc24xx_ser.inl: + Serial driver for ARM LPC24XX, 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/lpc24xx/current/cdl/ser_arm_lpc24xx.cdl @@ -0,0 +1,179 @@ +# ==================================================================== +# +# ser_arm_lpc24xx.cdl +# +# eCos serial ARM/LPC24XX 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): Uwe Kindler +# Original data: gthomas, jskov +# Contributors: +# Date: 2008-07-06 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_IO_SERIAL_ARM_LPC24XX { + display "ARM LPC24xx serial device drivers" + + parent CYGPKG_IO_SERIAL_DEVICES + active_if CYGPKG_IO_SERIAL + active_if CYGPKG_HAL_ARM_LPC24XX + implements CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO + requires CYGPKG_ERROR + include_dir cyg/io + + description " + This option enables the serial device drivers for the + ARM LPC24xx." + + # 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_lpc24xx_ser.inl>" + puts $::cdl_system_header "#define CYGDAT_IO_SERIAL_GENERIC_16X5X_CFG <pkgconf/io_serial_arm_lpc24xx.h>" + puts $::cdl_system_header "/***** serial driver proc output end *****/" + } + + # Support up to 4 on-chip UART modules. The number may vary between + # processor variants so it is easy to update this here + for { set ::channel 0 } { $::channel < 4 } { incr ::channel } { + + cdl_interface CYGINT_IO_SERIAL_LPC24XX_UART[set ::channel] { + display "Platform provides UART [set ::channel]" + flavor bool + description " + This interface will be implemented if the specific LPC24xx + processor being used has on-chip UART [set ::channel], and if + that UART is accessible on the target hardware." + } + + cdl_component CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL[set ::channel] { + display "ARM LPC24cxx UART [set ::channel] driver" + flavor bool + active_if CYGINT_IO_SERIAL_LPC24XX_UART[set ::channel] + 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 + LPC24xx UART [set ::channel]." + + cdl_option CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL[set ::channel]_NAME { + display "Device name for UART [set ::channel]" + flavor data + default_value [format {"\"/dev/ser%d\""} $::channel] + description " + This option specifies the name of the serial device + for the ARM LPC24xx UART [set ::channel]." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL[set ::channel]_BAUD { + display "Baud rate for UART [set ::channel]" + 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 LPC24xx UART [set ::channel]." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL[set ::channel]_BUFSIZE { + display "Buffer size for the UART [set ::channel]" + flavor data + legal_values 0 to 8192 + default_value 128 + description " + This option specifies the size of the internal buffers + used for the ARM LPC24xx UART [set ::channel]." + } + + cdl_option CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL[set ::channel]_INTPRIO { + display "Interrupt priority of UART [set ::channel]" + flavor data + legal_values 0 to 15 + default_value 15 + description " + This option selects the interupt priority for the + UART [set ::channel] interrupts. There are 16 + priority levels corresponding to the values 0 + through 15 decimal, of which 15 is the lowest + priority. The reset value of these registers + defaults all interrupt to the lowest priority, + allowing a single write to elevate the priority of + an individual interrupt." + } + } + } + + cdl_component CYGPKG_IO_SERIAL_ARM_LPC24XX_TESTING { + display "Testing parameters" + flavor bool + calculated 1 + active_if CYGPKG_IO_SERIAL_ARM_LPC24XX_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_LPC24XX_SERIAL0_NAME } + } + + define_proc { + puts $::cdl_header "#define CYGPRI_SER_TEST_CRASH_ID \"armlpc24xx\"" + puts $::cdl_header "#define CYGPRI_SER_TEST_TTY_DEV \"/dev/tty0\"" + } + } +} + +# EOF ser_arm_lpc24xx.cdl
new file mode 100644 --- /dev/null +++ b/packages/devs/serial/arm/lpc24xx/current/include/arm_lpc24xx_ser.inl @@ -0,0 +1,345 @@ +//========================================================================== +// +// io/serial/arm/arm_lpc24xx_ser.inl +// +// ARM LPC24XX 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): Uwe Kindler +// Contributors: gthomas, jlarmour +// Date: 2008-06-07 +// Purpose: LPC24XX Serial I/O module (interrupt driven version) +// Description: +// +//####DESCRIPTIONEND#### +// +//========================================================================== + + +//========================================================================== +// INCLUDES +//========================================================================== +#include <cyg/hal/hal_intr.h> +#include <cyg/hal/lpc24xx_misc.h> + + +//========================================================================== +// STATIC DATA +//========================================================================== +// Baud rate specification +static const 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 +}; + + +//========================================================================== +// Return baudrate devisor for certain baudrate +//========================================================================== +unsigned short lpc24xx_baud_generator(pc_serial_info *ser_chan, + cyg_serial_baud_rate_t baud) +{ + cyg_uint8 pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART0; + switch (ser_chan->base) + { + case CYGARC_HAL_LPC24XX_REG_UART0_BASE: + pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART0; + break; + + case CYGARC_HAL_LPC24XX_REG_UART1_BASE: + pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART1; + break; + + case CYGARC_HAL_LPC24XX_REG_UART2_BASE: + pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART2; + break; + + case CYGARC_HAL_LPC24XX_REG_UART3_BASE: + pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART3; + break; + + default: + CYG_FAIL("Invalid UART base address"); + } // (ser_chan->base) + + return CYG_HAL_ARM_LPC24XX_BAUD_GENERATOR(pclk_id, select_baud[baud]); +} + + +#define CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR(_ser_chan_, _baud_) \ + lpc24xx_baud_generator((_ser_chan_), (_baud_)) + + + +//========================================================================== +// SERIAL CHANNEL 0 +//========================================================================== +#ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL0 +static pc_serial_info lpc24xx_serial_info0 = +{ + CYGARC_HAL_LPC24XX_REG_UART0_BASE, + CYGNUM_HAL_INTERRUPT_UART0, + CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_INTPRIO +}; + +#if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BUFSIZE > 0 +static unsigned char +lpc24xx_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BUFSIZE]; +static unsigned char +lpc24xx_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel0, + pc_serial_funs, + lpc24xx_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &lpc24xx_serial_out_buf0[0], + sizeof(lpc24xx_serial_out_buf0), + &lpc24xx_serial_in_buf0[0], + sizeof(lpc24xx_serial_in_buf0) + ); +#else +static SERIAL_CHANNEL(lpc24xx_serial_channel0, + pc_serial_funs, + lpc24xx_serial_info0, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(lpc24xx_serial_io0, + CYGDAT_IO_SERIAL_ARM_LPC24XX_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 + &lpc24xx_serial_channel0 + ); +#endif // CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL0 + + +//========================================================================== +// SERIAL CHANNEL 1 +//========================================================================== +#ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL1 +static pc_serial_info lpc24xx_serial_info1 = +{ + CYGARC_HAL_LPC24XX_REG_UART1_BASE, + CYGNUM_HAL_INTERRUPT_UART1, + CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_INTPRIO +}; + +#if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BUFSIZE > 0 +static unsigned char +lpc24xx_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BUFSIZE]; +static unsigned char +lpc24xx_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel1, + pc_serial_funs, + lpc24xx_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &lpc24xx_serial_out_buf1[0], + sizeof(lpc24xx_serial_out_buf1), + &lpc24xx_serial_in_buf1[0], + sizeof(lpc24xx_serial_in_buf1) + ); +#else +static SERIAL_CHANNEL(lpc24xx_serial_channel1, + pc_serial_funs, + lpc24xx_serial_info1, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(lpc24xx_serial_io1, + CYGDAT_IO_SERIAL_ARM_LPC24XX_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 + &lpc24xx_serial_channel1 + ); +#endif // CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL1 + + +//========================================================================== +// SERIAL CHANNEL 2 +//========================================================================== +#ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL2 +static pc_serial_info lpc24xx_serial_info2 = +{ + CYGARC_HAL_LPC24XX_REG_UART2_BASE, + CYGNUM_HAL_INTERRUPT_UART2, + CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_INTPRIO +}; + +#if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BUFSIZE > 0 +static unsigned char +lpc24xx_serial_out_buf2[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BUFSIZE]; +static unsigned char +lpc24xx_serial_in_buf2[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel2, + pc_serial_funs, + lpc24xx_serial_info2, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &lpc24xx_serial_out_buf2[0], + sizeof(lpc24xx_serial_out_buf2), + &lpc24xx_serial_in_buf2[0], + sizeof(lpc24xx_serial_in_buf2) + ); +#else +static SERIAL_CHANNEL(lpc24xx_serial_channel2, + pc_serial_funs, + lpc24xx_serial_info2, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(lpc24xx_serial_io2, + CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL2_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 + &lpc24xx_serial_channel2 + ); +#endif // CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL2 + + +//========================================================================== +// SERIAL CHANNEL 3 +//========================================================================== +#ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL3 +static pc_serial_info lpc24xx_serial_info3 = +{ + CYGARC_HAL_LPC24XX_REG_UART3_BASE, + CYGNUM_HAL_INTERRUPT_UART3, + CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_INTPRIO +}; + +#if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BUFSIZE > 0 +static unsigned char +lpc24xx_serial_out_buf3[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BUFSIZE]; +static unsigned char +lpc24xx_serial_in_buf3[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BUFSIZE]; + +static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel3, + pc_serial_funs, + lpc24xx_serial_info3, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT, + &lpc24xx_serial_out_buf3[0], + sizeof(lpc24xx_serial_out_buf3), + &lpc24xx_serial_in_buf3[0], + sizeof(lpc24xx_serial_in_buf3) + ); +#else +static SERIAL_CHANNEL(lpc24xx_serial_channel3, + pc_serial_funs, + lpc24xx_serial_info3, + CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BAUD), + CYG_SERIAL_STOP_DEFAULT, + CYG_SERIAL_PARITY_DEFAULT, + CYG_SERIAL_WORD_LENGTH_DEFAULT, + CYG_SERIAL_FLAGS_DEFAULT + ); +#endif + +DEVTAB_ENTRY(lpc24xx_serial_io3, + CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL3_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 + &lpc24xx_serial_channel3 + ); +#endif // CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL3 + + +//---------------------------------------------------------------------------- +// EOF arm_lpc2xxx_ser.inl
