#ifndef CYGONCE_DEVS_WATCHDOG_HXX
|
#ifndef CYGONCE_DEVS_WATCHDOG_HXX
|
#define CYGONCE_DEVS_WATCHDOG_HXX
|
#define CYGONCE_DEVS_WATCHDOG_HXX
|
|
|
//==========================================================================
|
//==========================================================================
|
//
|
//
|
// watchdog.hxx
|
// watchdog.hxx
|
//
|
//
|
// Watchdog interface declaration
|
// Watchdog interface declaration
|
//
|
//
|
//==========================================================================
|
//==========================================================================
|
//####ECOSGPLCOPYRIGHTBEGIN####
|
//####ECOSGPLCOPYRIGHTBEGIN####
|
// -------------------------------------------
|
// -------------------------------------------
|
// This file is part of eCos, the Embedded Configurable Operating System.
|
// This file is part of eCos, the Embedded Configurable Operating System.
|
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
|
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
|
//
|
//
|
// eCos is free software; you can redistribute it and/or modify it under
|
// 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
|
// 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.
|
// 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
|
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
// for more details.
|
// for more details.
|
//
|
//
|
// You should have received a copy of the GNU General Public License along
|
// You should have received a copy of the GNU General Public License along
|
// with eCos; if not, write to the Free Software Foundation, Inc.,
|
// with eCos; if not, write to the Free Software Foundation, Inc.,
|
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
//
|
//
|
// As a special exception, if other files instantiate templates or use macros
|
// 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
|
// 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
|
// 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
|
// 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
|
// License. However the source code for this file must still be made available
|
// in accordance with section (3) of the GNU General Public License.
|
// 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 exception does not invalidate any other reasons why a work based on
|
// this file might be covered by the GNU General Public License.
|
// this file might be covered by the GNU General Public License.
|
//
|
//
|
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
|
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
|
// at http://sources.redhat.com/ecos/ecos-license/
|
// at http://sources.redhat.com/ecos/ecos-license/
|
// -------------------------------------------
|
// -------------------------------------------
|
//####ECOSGPLCOPYRIGHTEND####
|
//####ECOSGPLCOPYRIGHTEND####
|
//==========================================================================
|
//==========================================================================
|
//#####DESCRIPTIONBEGIN####
|
//#####DESCRIPTIONBEGIN####
|
//
|
//
|
// Author(s): nickg
|
// Author(s): nickg
|
// Contributors: nickg
|
// Contributors: nickg
|
// Date: 1998-07-14
|
// Date: 1998-07-14
|
// Purpose: Watchdog declarations
|
// Purpose: Watchdog declarations
|
// Description: This file defines the interface to the watchdog device
|
// Description: This file defines the interface to the watchdog device
|
// that provides timer based recovery from software and
|
// that provides timer based recovery from software and
|
// hardware faults.
|
// hardware faults.
|
// Usage: #include
|
// Usage: #include
|
//
|
//
|
//####DESCRIPTIONEND####
|
//####DESCRIPTIONEND####
|
//
|
//
|
//==========================================================================
|
//==========================================================================
|
|
|
#include
|
#include
|
#include // assertion macros
|
#include // assertion macros
|
|
|
class Cyg_Watchdog_Action;
|
class Cyg_Watchdog_Action;
|
|
|
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
// Watchdog class
|
// Watchdog class
|
|
|
class Cyg_Watchdog
|
class Cyg_Watchdog
|
{
|
{
|
|
|
Cyg_Watchdog_Action *action_list;
|
Cyg_Watchdog_Action *action_list;
|
|
|
cyg_uint64 resolution;
|
cyg_uint64 resolution;
|
|
|
public:
|
public:
|
|
|
Cyg_Watchdog();
|
Cyg_Watchdog();
|
|
|
// Return time interval allowed between resets before watchdog
|
// Return time interval allowed between resets before watchdog
|
// triggers, in nanoseconds.
|
// triggers, in nanoseconds.
|
cyg_uint64 get_resolution( void );
|
cyg_uint64 get_resolution( void );
|
|
|
// Start the watchdog running.
|
// Start the watchdog running.
|
void start( void );
|
void start( void );
|
|
|
// Reset watchdog timer. This needs to be called regularly to prevent
|
// Reset watchdog timer. This needs to be called regularly to prevent
|
// the watchdog firing.
|
// the watchdog firing.
|
void reset( void );
|
void reset( void );
|
|
|
#ifndef CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT
|
#ifndef CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT
|
// Trigger the watchdog as if the timer had expired.
|
// Trigger the watchdog as if the timer had expired.
|
void trigger( void );
|
void trigger( void );
|
|
|
// Register an action routine that will be called when the timer
|
// Register an action routine that will be called when the timer
|
// triggers.
|
// triggers.
|
void install_action( Cyg_Watchdog_Action *wdaction );
|
void install_action( Cyg_Watchdog_Action *wdaction );
|
|
|
// Deregister a previously registered action routine.
|
// Deregister a previously registered action routine.
|
void uninstall_action( Cyg_Watchdog_Action *wdaction );
|
void uninstall_action( Cyg_Watchdog_Action *wdaction );
|
#endif
|
#endif
|
|
|
// A static instance of the single system defined watchdog device.
|
// A static instance of the single system defined watchdog device.
|
static Cyg_Watchdog watchdog;
|
static Cyg_Watchdog watchdog;
|
|
|
private:
|
private:
|
void init_hw( void );
|
void init_hw( void );
|
};
|
};
|
|
|
#ifndef CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT
|
#ifndef CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT
|
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
// Watchdog action class
|
// Watchdog action class
|
|
|
class Cyg_Watchdog_Action
|
class Cyg_Watchdog_Action
|
{
|
{
|
friend class Cyg_Watchdog;
|
friend class Cyg_Watchdog;
|
|
|
Cyg_Watchdog_Action *next; // link in chain
|
Cyg_Watchdog_Action *next; // link in chain
|
|
|
void (*action)( CYG_ADDRWORD data ); // action function
|
void (*action)( CYG_ADDRWORD data ); // action function
|
|
|
CYG_ADDRWORD data; // data argument
|
CYG_ADDRWORD data; // data argument
|
|
|
public:
|
public:
|
|
|
Cyg_Watchdog_Action(
|
Cyg_Watchdog_Action(
|
void (*action)( CYG_ADDRWORD data ),
|
void (*action)( CYG_ADDRWORD data ),
|
CYG_ADDRWORD data
|
CYG_ADDRWORD data
|
);
|
);
|
|
|
~Cyg_Watchdog_Action();
|
~Cyg_Watchdog_Action();
|
|
|
void install();
|
void install();
|
|
|
void uninstall();
|
void uninstall();
|
};
|
};
|
|
|
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
// Cyg_Watchdog_Action inlines
|
// Cyg_Watchdog_Action inlines
|
|
|
inline Cyg_Watchdog_Action::Cyg_Watchdog_Action(
|
inline Cyg_Watchdog_Action::Cyg_Watchdog_Action(
|
void (*action_arg)( CYG_ADDRWORD data ),
|
void (*action_arg)( CYG_ADDRWORD data ),
|
CYG_ADDRWORD data_arg
|
CYG_ADDRWORD data_arg
|
)
|
)
|
{
|
{
|
next = NULL;
|
next = NULL;
|
action = action_arg;
|
action = action_arg;
|
data = data_arg;
|
data = data_arg;
|
}
|
}
|
|
|
inline Cyg_Watchdog_Action::~Cyg_Watchdog_Action()
|
inline Cyg_Watchdog_Action::~Cyg_Watchdog_Action()
|
{
|
{
|
Cyg_Watchdog::watchdog.uninstall_action( this );
|
Cyg_Watchdog::watchdog.uninstall_action( this );
|
}
|
}
|
|
|
inline void Cyg_Watchdog_Action::install()
|
inline void Cyg_Watchdog_Action::install()
|
{
|
{
|
Cyg_Watchdog::watchdog.install_action( this );
|
Cyg_Watchdog::watchdog.install_action( this );
|
}
|
}
|
|
|
inline void Cyg_Watchdog_Action::uninstall()
|
inline void Cyg_Watchdog_Action::uninstall()
|
{
|
{
|
Cyg_Watchdog::watchdog.uninstall_action( this );
|
Cyg_Watchdog::watchdog.uninstall_action( this );
|
}
|
}
|
|
|
#endif // CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT
|
#endif // CYGSEM_WATCHDOG_RESETS_ON_TIMEOUT
|
|
|
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
#endif // ifndef CYGONCE_DEVS_WATCHDOG_HXX
|
#endif // ifndef CYGONCE_DEVS_WATCHDOG_HXX
|
// EOF watchdog.hxx
|
// EOF watchdog.hxx
|
|
|