bsptemplate/asspandvariant/template_variant/inc/template_power.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bsptemplate/asspandvariant/template_variant/inc/template_power.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,177 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// template\template_variant\inc\template_power.h
+// Template Power Management Header
+// (see also assp.cpp for a discussion on Sleep modes and xyin.cpp for example
+// of usage of Resource Manager and Peripheral self power down and interaction
+// with Power Controller for Wakeup Events)
+// 
+//
+
+#ifndef __PM_STD_H__
+#define __PM_STD_H__
+#include <kernel/kpower.h>
+#include "variant.h"
+
+//
+// TO DO: (mandatory)
+//
+// Definition of the DPowerController derived class
+//
+NONSHARABLE_CLASS(DTemplatePowerController) : public DPowerController
+	{
+public: // from DPowerController
+	void CpuIdle();
+	void EnableWakeupEvents();
+	void AbsoluteTimerExpired();
+	void DisableWakeupEvents();
+	void PowerDown(TTimeK aWakeupTime);
+public:
+	DTemplatePowerController();
+private:
+	void DoStandby(TBool aTimed, TUint32 aWakeupRTC);
+public:
+	TBool iWakeupEventsOn;
+	};
+
+//
+// TO DO: (optional)
+//
+// If you need to access to the Power Controller from Drivers/Extensions/Variant 
+// or access to Resource Manager then define an accessor class as below
+//
+
+class TemplateResourceManager;
+
+class TTemplatePowerController
+	{
+public:
+	// to allow Variant/Drivers/Extensions access to Resource Manager
+	IMPORT_C static TemplateResourceManager* ResourceManager();
+	// used by drivers/extensions to signal a wakeup event to Power Controller
+	IMPORT_C static void WakeupEvent();
+
+	inline static void RegisterPowerController(DTemplatePowerController* aPowerController);
+private:
+	static DTemplatePowerController* iPowerController;
+	};
+
+NONSHARABLE_CLASS(SharedBinaryResource1) : public MPowerInput
+	{
+public: // from MPowerInput
+	void Use();
+	void Release();
+public:
+	TUint GetCount();		// gets current usage count
+private:
+	TUint	iCount;
+	};
+
+// Prototype class for Multilevel resources
+
+class MSharedMultilevelResource			// Multilevel Shared Input
+	{
+public:
+	virtual void IncreaseToLevel(TUint aLevel, TInt aRequester) = 0;
+	virtual void ReduceToLevel(TUint aLevel, TInt aRequester) = 0;
+	virtual TUint GetResourceLevel() = 0;
+	};
+
+// EXAMPLE ONLY
+const TUint KSharers = 3;
+
+NONSHARABLE_CLASS(SharedMultilevelResource1) : public MSharedMultilevelResource
+	{
+public:
+	enum TRequesterId
+		{
+		//
+		// Identify all possible users of this resource
+		//
+		ERequesterX = 0,
+		ERequesterY = 1,
+		ERequesterZ = 2
+		};
+	SharedMultilevelResource1();
+public:	// from MSharedMultilevelResource
+	void IncreaseToLevel(TUint aLevel, TInt aRequester);
+	void ReduceToLevel(TUint aLevel, TInt aRequester);
+	TUint GetResourceLevel();
+private:
+	void FindMaxLevel(TUint* aLevel, TInt* aId);
+private:
+	TUint	Levels[KSharers];		// one element per user of resource
+	TUint	iCurrentLevel;
+	TInt	iCurrentLevelOwnerId;
+	};
+
+//
+// TO DO: (optional)
+//
+// The Resource Manager class
+//
+NONSHARABLE_CLASS(TemplateResourceManager)
+	{
+public:
+	enum TResource			// a list of controllable resources (e.g clocks, voltages, power lines)
+		{
+		SynchBinResourceUsedByZOnly,
+		AsynchBinResourceUsedByZOnly,
+		//	... other non-shared binary resources, synchronous or asynchronous
+		BinResourceSharedByZAndY,
+		//	...	other shared binary resources, synchronous or asynchronous
+		SynchMlResourceUsedByXOnly,
+		AsynchMlResourceUsedByXOnly,
+		//	... other non-shared multilevel resources, synchronous or asynchronous
+		MlResourceSharedByXAndW,
+		//	...	other shared multilevel resources, synchronous or asynchronous
+		};
+	enum TSleepModes
+		{
+		Snooze,
+		// ...
+		Sleep,
+		// ...
+		DeepSleep,
+		// ...
+		Coma
+		};
+
+	void InitResources();									// initialises power Resources not initialised by Bootstrap
+
+	inline TSleepModes MapSleepMode(TInt aSleepPeriod);
+
+	// interface for non-shared shared resources
+
+	inline void Modify(TResource aResource, TBool aOnOff);			// for non-shared binary resources
+	inline void ModifyToLevel(TResource aResource, TInt aLevel);	// for non-shared multilevel resources
+	// the following functions may be used by Drivers/Extensions or the Idle routine to 
+	// determine what resources are On or Off or their levels
+	inline TBool GetResourceState(TResource aResource);			// for non-shared binary resources
+	inline TUint GetResourceLevel(TResource aResource);			// for non-shared multilevel resources 
+public:
+	// interface for shared resources
+
+	SharedBinaryResource1 iSharedBResource1;
+	//	...	other shared Binary resources, synchronous or asynchronous
+	inline SharedBinaryResource1* SharedBResource1();
+
+	SharedMultilevelResource1 iSharedMlResource1;
+	//	...	other shared Multilevel resources
+	inline SharedMultilevelResource1* SharedMlResource1();
+	};
+
+#include "template_power.inl"
+
+#endif