Mercurial > ecos
diff packages/services/power/common/current/include/power.h @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | |
| children | d2c90368aeef |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/services/power/common/current/include/power.h @@ -0,0 +1,249 @@ +#ifndef CYGONCE_POWER_POWER_H +# define CYGONCE_POWER_POWER_H +//========================================================================== +// +// include/power.h +// +// Definitions of power management support +// +//========================================================================== +//####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): bartv +// Contributors: bartv +// Date: 2001-06-12 +// +// +//####DESCRIPTIONEND#### +//========================================================================== + +#include <pkgconf/power.h> +#include <cyg/infra/cyg_type.h> +#include <cyg/hal/hal_tables.h> + +#ifdef CYGPKG_POWER_THREAD +#include <cyg/kernel/kapi.h> // CYGPKG_POWER_THREAD is active_if CYGPKG_KERNEL so + // the kernel's headers are guaranteed to be available. +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// The four defined modes of power operation. +#define PowerMode_Min 0 +#define PowerMode_Active 0 +#define PowerMode_Idle 1 +#define PowerMode_Sleep 2 +#define PowerMode_Off 3 +#define PowerMode_Max 3 +typedef cyg_uint8 PowerMode; + +// Whether a mode change is initiated globally or per-controller +#define PowerModeChange_Controller 0 +#define PowerModeChange_ControllerNow 1 +#define PowerModeChange_Global 2 +typedef cyg_uint32 PowerModeChange; + +// Some priorities. +#define PowerPri_Early 1000 +#define PowerPri_Typical 5000 +#define PowerPri_Late 9000 + +typedef struct PowerController { + void (*change_mode)(struct PowerController*, PowerMode, PowerModeChange); +#ifdef CYGIMP_POWER_PROVIDE_STRINGS + char* id; +#endif +#ifdef CYGIMP_POWER_PROVIDE_POLICY_DATA + CYG_ADDRWORD policy_data; +#endif + PowerMode mode; + PowerMode desired_mode; + cyg_uint8 change_this; + cyg_uint8 attached; +} CYG_HAL_TABLE_TYPE PowerController; + +// The table of power controllers, allowing application code +// to access all of them. +extern PowerController __POWER__[], __POWER_END__; + +// There should always be a power controller for the cpu which can +// be accessed by any client. +extern PowerController power_controller_cpu; + +// If a separate power management thread is being used, its handle +// is exported so that other code can e.g. manipulate its priority +#ifdef CYGPKG_POWER_THREAD +extern cyg_handle_t power_thread_handle; +#endif + +// Inline functions and supporting data. +extern PowerMode __power_mode; +extern PowerMode __power_desired_mode; +typedef void (*__power_policy_callback_t)(PowerController*, PowerMode, PowerMode, PowerMode, PowerMode); +extern __power_policy_callback_t __power_policy_callback; + +// This macro is overridden elsewhere in this package when defining linkable +// extern (i.e. non-inline) versions of these functions. +#ifndef POWER_INLINE +# define POWER_INLINE extern inline +#endif + +POWER_INLINE PowerMode +power_get_mode(void) +{ + return __power_mode; +} + +POWER_INLINE PowerMode +power_get_desired_mode(void) +{ + return __power_desired_mode; +} + +POWER_INLINE PowerMode +power_get_controller_mode(PowerController* controller) +{ + return controller->mode; +} + +POWER_INLINE PowerMode +power_get_controller_desired_mode(PowerController* controller) +{ + return controller->desired_mode; +} + +POWER_INLINE void +power_set_policy_callback(__power_policy_callback_t new_callback) +{ + __power_policy_callback = new_callback; +} + +POWER_INLINE __power_policy_callback_t +power_get_policy_callback(void) +{ + return __power_policy_callback; +} + +#ifdef CYGIMP_POWER_PROVIDE_STRINGS +POWER_INLINE const char* +power_get_controller_id(PowerController* controller) +{ + return controller->id; +} +#endif + +#ifdef CYGIMP_POWER_PROVIDE_POLICY_DATA +POWER_INLINE void +power_set_controller_policy_data(PowerController* controller, CYG_ADDRWORD data) +{ + controller->policy_data = data; +} + +POWER_INLINE CYG_ADDRWORD +power_get_controller_policy_data(PowerController* controller) +{ + return controller->policy_data; +} +#endif + +POWER_INLINE cyg_bool +power_get_controller_attached(PowerController* controller) +{ + return controller->attached; +} + +POWER_INLINE void +power_set_controller_attached(PowerController* controller, cyg_bool new_value) +{ + controller->attached = new_value; +} + +POWER_INLINE void +power_set_controller_mode_now(PowerController* controller, PowerMode new_mode) +{ + controller->desired_mode = new_mode; + if (controller->mode != controller->desired_mode) { + (*controller->change_mode)(controller, new_mode, PowerModeChange_ControllerNow); + } +} + +// Now for the non-inline functions. +extern void power_set_controller_mode(PowerController*, PowerMode); +extern void power_set_mode(PowerMode); + +// Implementation support. +#ifdef CYGIMP_POWER_PROVIDE_STRINGS +# define POWER_CONTROLLER_ID(_id_) id: _id_, +#else +# define POWER_CONTROLLER_ID(_id_) +#endif +#ifdef CYGIMP_POWER_PROVIDE_POLICY_DATA +# define POWER_CONTROLLER_POLICY_DATA policy_data: 0, +#else +# define POWER_CONTROLLER_POLICY_DATA +#endif + +#define POWER_CONTROLLER(_name_, _pri_, _id_, _fn_) \ +PowerController _name_ \ + CYG_HAL_TABLE_QUALIFIED_ENTRY(power, _pri_) = { \ + change_mode: _fn_, \ + POWER_CONTROLLER_ID(_id_) \ + POWER_CONTROLLER_POLICY_DATA \ + mode: PowerMode_Active, \ + desired_mode: PowerMode_Active, \ + change_this: 0, \ + attached: 1 \ +} + +#define POWER_CONTROLLER_CPU(_id_, _fn_) \ +PowerController power_controller_cpu \ + CYG_HAL_TABLE_EXTRA(power) = { \ + change_mode: _fn_, \ + POWER_CONTROLLER_ID(_id_) \ + POWER_CONTROLLER_POLICY_DATA \ + mode: PowerMode_Active, \ + desired_mode: PowerMode_Active, \ + change_this: 0, \ + attached: 1, \ +} + +#ifdef __cplusplus +} // extern "C" { +#endif + +#endif // CYGONCE_POWER_POWER_H
