Mercurial > ecos
changeset 266:2f403b92a5ac
Add contributed at91 watchdog from Thomas Koeller
| author | jlarmour |
|---|---|
| date | Tue, 06 Aug 2002 15:33:28 +0000 |
| parents | 96fac1fabc4c |
| children | 797015ac62f3 |
| files | packages/ChangeLog packages/NEWS packages/devs/watchdog/arm/at91/current/ChangeLog packages/devs/watchdog/arm/at91/current/cdl/watchdog_at91.cdl packages/devs/watchdog/arm/at91/current/src/watchdog_at91.cxx packages/ecos.db |
| diffstat | 6 files changed, 385 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/ChangeLog +++ b/packages/ChangeLog @@ -1,3 +1,7 @@ +2002-08-06 Thomas Koeller <thomas@koeller.dyndns.org> + + * ecos.db: Add AT91 watchdog driver. + 2002-06-20 Gary Thomas <gary@chez-thomas.org> * ecos.db: A&M Viper now uses generic AMD FLASH drivers.
--- a/packages/NEWS +++ b/packages/NEWS @@ -1,3 +1,5 @@ +* Add AT91 watchdog driver. Contributed by Thomas Koeller of Basler Vision + Technologies. * SMP support added for x86. * Ported new networking stack from FreeBSD to eCos. Includes IPv6 support. * Added generic power management support, plus platform support for the iPAQ.
new file mode 100644 --- /dev/null +++ b/packages/devs/watchdog/arm/at91/current/ChangeLog @@ -0,0 +1,36 @@ +2002-08-06 Thomas Koeller <thomas@koeller.dyndns.org> + + * Added watchdog driver for ARM AT91 board. + +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, 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., +// 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. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND####
new file mode 100644 --- /dev/null +++ b/packages/devs/watchdog/arm/at91/current/cdl/watchdog_at91.cdl @@ -0,0 +1,133 @@ +# ==================================================================== +# +# watchdog_at91.cdl +# +# eCos watchdog for ARM AT91 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. +## +## 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. +## +## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +## at http://sources.redhat.com/ecos/ecos-license/ +## ------------------------------------------- +#####ECOSGPLCOPYRIGHTEND#### +# ==================================================================== +######DESCRIPTIONBEGIN#### +# +# Author(s): tkoeller +# Contributors: tkoeller +# Date: 2000-05-05 +# +#####DESCRIPTIONEND#### +# +# ==================================================================== + +cdl_package CYGPKG_DEVICES_WATCHDOG_ARM_AT91 { + parent CYGPKG_IO_WATCHDOG + active_if CYGPKG_IO_WATCHDOG + display "ARM AT91 watchdog driver" + requires CYGPKG_HAL_ARM_AT91 + requires CYGPKG_KERNEL + hardware + define_header devs_watchdog_arm_at91.h + compile watchdog_at91.cxx + implements CYGINT_WATCHDOG_HW_IMPLEMENTATIONS + active_if CYGIMP_WATCHDOG_HARDWARE + description " + This package uses the watchdog device integrated + in the ARM CPU 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_AT91_DESIRED_TMEOUT_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_AT91_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_AT91_OPTIONS { + display "AT91 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_AT91_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_AT91_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_at91.cdl
new file mode 100644 --- /dev/null +++ b/packages/devs/watchdog/arm/at91/current/src/watchdog_at91.cxx @@ -0,0 +1,200 @@ +//========================================================================== +// +// devs/watchdog/arm/at91/watchdog_at91.cxx +// +// Watchdog implementation for ARM AT91 CPU +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, 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., +// 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. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): tkoeller +// Contributors: tkoeller +// Date: 2002-05-05 +// Purpose: Watchdog class implementation +// Description: Contains an implementation of the Watchdog class for use +// with the ATMEL AT91 watchdog timer. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/kernel.h> +#include <pkgconf/infra.h> +#include <pkgconf/kernel.h> +#include <pkgconf/watchdog.h> +#include <pkgconf/devs_watchdog_arm_at91.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/plf_io.h> +#include <cyg/hal/hal_diag.h> +#include <cyg/io/watchdog.hxx> +#if !defined(CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT) +#include <cyg/hal/hal_platform_ints.h> +#include <cyg/kernel/intr.hxx> +#endif + +#define MCLK_FREQUENCY_KHZ 32768 +#define MAX_TICKS 0x0000ffff +#define BASE_TICKS (MCLK_FREQUENCY_KHZ * CYGNUM_DEVS_WATCHDOG_ARM_AT91_DESIRED_TMEOUT_MS) + +#if BASE_TICKS / 8 <= MAX_TICKS +#define DIVIDER 0 +#define DIV_FACTOR 8 +#elif BASE_TICKS / 32 <= MAX_TICKS +#define DIVIDER 1 +#define DIV_FACTOR 32 +#elif BASE_TICKS / 128 <= MAX_TICKS +#define DIVIDER 2 +#define DIV_FACTOR 128 +#elif BASE_TICKS / 1024 <= MAX_TICKS +#define DIVIDER 3 +#define DIV_FACTOR 1024 +#else +#error Desired resolution beyond hardware capabilities +#endif + +#define TICKS ((BASE_TICKS / DIV_FACTOR) | 0xfff) +#define RESOLUTION ((cyg_uint64) (TICKS * DIV_FACTOR ) * 1000000 / MCLK_FREQUENCY_KHZ) + + + +#if defined(CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT) + +#define OMRVAL (AT91_WD_OMR_OKEY | AT91_WD_OMR_RSTEN | AT91_WD_OMR_WDEN) + +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 OMRVAL (AT91_WD_OMR_OKEY | AT91_WD_OMR_IRQEN | AT91_WD_OMR_WDEN) +#define INT_PRIO 7 + + +static void * +operator new(size_t size) +{ + static cyg_uint8 buf[sizeof (Cyg_Interrupt)]; + CYG_REPORT_FUNCTION(); + CYG_REPORT_FUNCARG1XV(size); + CYG_ASSERTC(size == sizeof buf); + CYG_REPORT_RETVAL(buf); + return buf; +} + +static cyg_uint32 +isr(cyg_vector vector, CYG_ADDRWORD data) +{ + Cyg_Watchdog &wd = *(Cyg_Watchdog *) data; + + CYG_REPORT_FUNCTION(); + CYG_REPORT_FUNCARG2XV(vector, data); + + wd.trigger(); + Cyg_Interrupt::acknowledge_interrupt(CYGNUM_HAL_INTERRUPT_WATCHDOG); + CYG_REPORT_RETVAL(Cyg_Interrupt::HANDLED); + return Cyg_Interrupt::HANDLED; +} + +static Cyg_Interrupt * wdint; + +void +Cyg_Watchdog::init_hw(void) +{ + CYG_REPORT_FUNCTION(); + CYG_REPORT_FUNCARGVOID(); + + resolution = RESOLUTION; + wdint = new Cyg_Interrupt( + CYGNUM_HAL_INTERRUPT_WATCHDOG, + INT_PRIO, + (CYG_ADDRWORD) this, + isr, + NULL + ); + wdint->configure_interrupt(CYGNUM_HAL_INTERRUPT_WATCHDOG, false, true); + wdint->attach(); + wdint->acknowledge_interrupt(CYGNUM_HAL_INTERRUPT_WATCHDOG); + wdint->unmask_interrupt(CYGNUM_HAL_INTERRUPT_WATCHDOG); + 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(); + + /* Write magic code to reset the watchdog. */ + HAL_WRITE_UINT32(AT91_WD + AT91_WD_CR, AT91_WD_CR_RSTKEY); + 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(AT91_WD + AT91_WD_OMR, AT91_WD_OMR_OKEY); + HAL_WRITE_UINT32( + AT91_WD + AT91_WD_CMR, + AT91_WD_CMR_CKEY | ((TICKS >> 10) & AT91_WD_CMR_HPCV) | DIVIDER + ); + HAL_WRITE_UINT32(AT91_WD + AT91_WD_CR, AT91_WD_CR_RSTKEY); + HAL_WRITE_UINT32(AT91_WD + AT91_WD_OMR, OMRVAL); + CYG_REPORT_RETURN(); +}
--- a/packages/ecos.db +++ b/packages/ecos.db @@ -1411,6 +1411,16 @@ package CYGPKG_DEVICES_WATCHDOG_ARM_AEB ARM/AEB board." } +package CYGPKG_DEVICES_WATCHDOG_ARM_AT91 { + alias { "Watchdog driver for ARM AT91 CPU" devices_watchdog_at91 device_watchdog_at91 } + directory devs/watchdog/arm/at91 + script watchdog_at91.cdl + hardware + description " + This package provides a watchdog driver implementation for the + ARM AT91 CPU." +} + package CYGPKG_DEVICES_WATCHDOG_ARM_EBSA285 { alias { "Watchdog driver for ARM/EBSA285 board" devices_watchdog_ebsa285 device_watchdog_ebsa285 } directory devs/watchdog/arm/ebsa285
