Mercurial > ecos-v3_0-branch
changeset 1839:12386c4b2c0c
* Added watchdog driver for ARM LPC2XXX based on the AT91 code.
| author | asl |
|---|---|
| date | Sun, 14 Nov 2004 14:11:45 +0000 |
| parents | afa0c55e7d89 |
| children | cc0f35e15ab8 |
| files | packages/devs/watchdog/arm/lpc2xxx/current/ChangeLog packages/devs/watchdog/arm/lpc2xxx/current/cdl/watchdog_lpc2xxx.cdl packages/devs/watchdog/arm/lpc2xxx/current/src/watchdog_lpc2xxx.cxx |
| diffstat | 3 files changed, 366 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/devs/watchdog/arm/lpc2xxx/current/ChangeLog @@ -0,0 +1,35 @@ +2004-10-04 Jani Monoses <jani@iv.ro> + + * Added watchdog driver for ARM LPC2XXX based on the AT91 code. + +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2003 Nick Garnett <nickg@calivar.com> +// 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/watchdog/arm/lpc2xxx/current/cdl/watchdog_lpc2xxx.cdl @@ -0,0 +1,132 @@ +# ==================================================================== +# +# watchdog_lpc2xxx.cdl +# +# eCos watchdog for ARM LPC2XXX driver 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) 2003 Nick Garnett <nickg@calivar.com> +## 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): tkoeller +# Contributors: tkoeller, nickg +# Date: 2000-05-05 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_DEVICES_WATCHDOG_ARM_LPC2XXX { + parent CYGPKG_IO_WATCHDOG + active_if CYGPKG_IO_WATCHDOG + display "ARM LPC2XXX watchdog driver" + requires CYGPKG_HAL_ARM_LPC2XXX + requires CYGPKG_KERNEL + hardware + define_header devs_watchdog_arm_lpc2xxx.h + compile watchdog_lpc2xxx.cxx + implements CYGINT_WATCHDOG_HW_IMPLEMENTATIONS + active_if CYGIMP_WATCHDOG_HARDWARE + description " + This package uses the watchdog device integrated + in the LPC2XXX to execute a predefined action if the + application fails to call the reset function for + longer than a given timeout interval." + + cdl_option CYGIMP_WATCHDOG_HARDWARE { + parent CYGPKG_IO_WATCHDOG_IMPLEMENTATION + display "Hardware watchdog" + calculated 1 + implements CYGINT_WATCHDOG_IMPLEMENTATIONS + } + + cdl_option CYGNUM_DEVS_WATCHDOG_ARM_LPC2XXX_DESIRED_TIMEOUT_MS { + display "Desired timeout value" + flavor data + legal_values 1 to 2047 + default_value 100 + description " + This parameter controls the watchdog timeout interval. + Note that you may not get the exact value requested + here, the timeout interval may have to be adjusted + because of hardware limitations. The actual timeout + used will be the smallest possible value that is not + less than this parameter." + } + + cdl_option CYGSEM_DEVS_WATCHDOG_ARM_LPC2XXX_RESET { + display "Generate reset on watchdog expiration" + flavor bool + default_value 1 + implements CYGINT_WATCHDOG_RESETS_ON_TIMEOUT + description " + Enabling this option changes the watchdog operation mode + to generate a system reset upon expiration instead of + invoking an application-defined action." + } + + cdl_component CYGPKG_DEVICES_WATCHDOG_ARM_LPC2XXX_OPTIONS { + display "LPC2XXX watchdog 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_DEVICES_WATCHDOG_ARM_LPC2XXX_CFLAGS_ADD { + display "Additional compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the watchdog device. These flags are used in addition + to the set of global flags." + } + + cdl_option CYGPKG_DEVICES_WATCHDOG_ARM_LPC2XXX_CFLAGS_REMOVE { + display "Suppressed compiler flags" + flavor data + no_define + default_value { "" } + description " + This option modifies the set of compiler flags for + building the watchdog device. These flags are removed from + the set of global flags if present." + } + + } +} + +# EOF watchdog_lpc2xxx.cdl
new file mode 100644 --- /dev/null +++ b/packages/devs/watchdog/arm/lpc2xxx/current/src/watchdog_lpc2xxx.cxx @@ -0,0 +1,199 @@ +//========================================================================== +// +// devs/watchdog/arm/lpc2xxx/watchdog_lpc2xxx.cxx +// +// Watchdog implementation for ARM LPC2XXX CPU +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2003 Nick Garnett <nickg@calivar.com> +// 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: tkoeller, nickg +// Date: 2004-10-05 +// Purpose: Watchdog class implementation +// Description: Contains an implementation of the Watchdog class for use +// with the Philips LPC2XXX watchdog timer. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/kernel.h> +#include <pkgconf/infra.h> +#include <pkgconf/kernel.h> +#include <pkgconf/watchdog.h> +#include <pkgconf/devs_watchdog_arm_lpc2xxx.h> + +#include <cyg/infra/cyg_type.h> +#include <cyg/infra/cyg_ass.h> +#include <cyg/infra/cyg_trac.h> +#include <cyg/hal/hal_io.h> +#include <cyg/hal/hal_diag.h> + +#include <cyg/io/watchdog.hxx> + +#include <cyg/hal/hal_var_ints.h> +#if !defined(CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT) +#include <cyg/kernel/intr.hxx> +#endif + +//========================================================================== + +#define TICKS (CYG_HAL_ARM_LPC2XXX_PCLK()/4000 * \ + CYGNUM_DEVS_WATCHDOG_ARM_LPC2XXX_DESIRED_TIMEOUT_MS) + +#define RESOLUTION CYGNUM_DEVS_WATCHDOG_ARM_LPC2XXX_DESIRED_TIMEOUT_MS*1000000 + +//========================================================================== + +#if defined(CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT) + +#define MODVAL (CYGARC_HAL_LPC2XXX_REG_WDMOD_WDEN | \ + CYGARC_HAL_LPC2XXX_REG_WDMOD_WDRESET) + +void +Cyg_Watchdog::init_hw(void) +{ + CYG_REPORT_FUNCTION(); + CYG_REPORT_FUNCARGVOID(); + resolution = RESOLUTION; + CYG_REPORT_RETURN(); +} + +#else /* defined(CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT) */ + +//========================================================================== + +#define MODVAL (CYGARC_HAL_LPC2XXX_REG_WDMOD_WDEN | \ + CYGARC_HAL_LPC2XXX_REG_WDMOD_WDINT) +#define INT_PRIO 7 + +//========================================================================== + +static Cyg_Watchdog *wd; + +//========================================================================== + +static cyg_uint32 +isr(cyg_vector vector, CYG_ADDRWORD data) +{ + CYG_REPORT_FUNCTION(); + CYG_REPORT_FUNCARG2XV(vector, data); + + wd->trigger(); + Cyg_Interrupt::acknowledge_interrupt(CYGNUM_HAL_INTERRUPT_WD); + CYG_REPORT_RETVAL(Cyg_Interrupt::HANDLED); + return Cyg_Interrupt::HANDLED; +} + +//========================================================================== + +static Cyg_Interrupt wdint( + CYGNUM_HAL_INTERRUPT_WD, + INT_PRIO, + 0, + isr, + NULL + ); + +//========================================================================== + +void +Cyg_Watchdog::init_hw(void) +{ + CYG_REPORT_FUNCTION(); + CYG_REPORT_FUNCARGVOID(); + + wd = this; + resolution = RESOLUTION; + wdint.configure_interrupt(CYGNUM_HAL_INTERRUPT_WD, false, true); + wdint.attach(); + wdint.acknowledge_interrupt(CYGNUM_HAL_INTERRUPT_WD); + wdint.unmask_interrupt(CYGNUM_HAL_INTERRUPT_WD); + CYG_REPORT_RETURN(); +} + +#endif /* defined(CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT) */ + +//========================================================================== +/* + * Reset watchdog timer. This needs to be called regularly to prevent + * the watchdog from firing. + */ + +void +Cyg_Watchdog::reset(void) +{ + CYG_REPORT_FUNCTION(); + CYG_REPORT_FUNCARGVOID(); + + /* Feed magic values to reset the watchdog. */ + HAL_WRITE_UINT32(CYGARC_HAL_LPC2XXX_REG_WD_BASE + + CYGARC_HAL_LPC2XXX_REG_WDFEED, + CYGARC_HAL_LPC2XXX_REG_WDFEED_MAGIC1); + HAL_WRITE_UINT32(CYGARC_HAL_LPC2XXX_REG_WD_BASE + + CYGARC_HAL_LPC2XXX_REG_WDFEED, + CYGARC_HAL_LPC2XXX_REG_WDFEED_MAGIC2); + CYG_REPORT_RETURN(); +} + +//========================================================================== +/* + * Start watchdog to generate a hardware reset + * or interrupt when expiring. + */ + +void +Cyg_Watchdog::start(void) +{ + CYG_REPORT_FUNCTION(); + CYG_REPORT_FUNCARGVOID(); + + HAL_WRITE_UINT32(CYGARC_HAL_LPC2XXX_REG_WD_BASE + + CYGARC_HAL_LPC2XXX_REG_WDTC, TICKS); + HAL_WRITE_UINT32(CYGARC_HAL_LPC2XXX_REG_WD_BASE + + CYGARC_HAL_LPC2XXX_REG_WDMOD, MODVAL); + /* Feed magic values to reset the watchdog. */ + HAL_WRITE_UINT32(CYGARC_HAL_LPC2XXX_REG_WD_BASE + + CYGARC_HAL_LPC2XXX_REG_WDFEED, + CYGARC_HAL_LPC2XXX_REG_WDFEED_MAGIC1); + HAL_WRITE_UINT32(CYGARC_HAL_LPC2XXX_REG_WD_BASE + + CYGARC_HAL_LPC2XXX_REG_WDFEED, + CYGARC_HAL_LPC2XXX_REG_WDFEED_MAGIC2); + CYG_REPORT_RETURN(); +} + +//========================================================================== +// End of watchdog_lpc2xxx.cxx
