halservices/hal/src/userhal.cpp
changeset 0 a41df078684a
child 36 bbf8bed59bcb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/halservices/hal/src/userhal.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,931 @@
+// Copyright (c) 1999-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:
+// hal\src\userhal.cpp
+// 
+//
+
+#include <kernel/hal_int.h>
+#include "u32std.h"
+#include <videodriver.h>
+
+
+
+_LIT(KLitHalUserHal,"HAL-UserHal");
+
+enum THalUserHalPanic
+	{
+	EInvalidStartupType=0,
+	EInvalidAttributeDP=1,
+	EInvalidAttributeDNM=2,
+	EInvalidAttributeDM=3,
+	EInvalidAttributeDS=4,
+	EInvalidAttributeCMI=5,
+	EInvalidAttributeSMI=6,
+	EInvalidAttributeDC=7,
+	EInvalidAttributeMB=8,
+	EInvalidAttributeMC=9,
+	EInvalidAttributeSMI2=10,
+	EInvalidAttributeSD=11,
+	EInvalidAttributeSDMA=12,
+	EInvalidAttribKeybd=13,
+	EInvalidAttribPen=14,
+	EInvalidAttribMouse=15,
+	EInvalidAttrib3DPointer=16
+	};
+
+void Panic(THalUserHalPanic aPanic)
+	{
+	User::Panic(KLitHalUserHal,aPanic);		
+	}
+
+// ECPUSpeed
+TInt GetCPUSpeed(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+
+      TVariantInfoV01 info;
+	TPckg<TVariantInfoV01> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupVariant, EVariantHalVariantInfo, (TAny*)&infoPckg, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=info.iProcessorClockInKHz;
+		}
+	return r;
+	}
+	
+// ECpuProfilingDefaultInterruptBase
+TInt GetCPUProfilerInterrupt(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+
+	return UserSvr::HalFunction(EHalGroupVariant, EVariantHalProfilingDefaultInterruptBase, aInOut, NULL);
+	}
+	
+
+// ESystemStartupReason
+TInt GetSystemStartupReason(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TInt reason;
+	TInt r=UserSvr::HalFunction(EHalGroupKernel, EKernelHalStartupReason, (TAny*)&reason, NULL);
+	if (r==KErrNone)
+		{
+		switch (reason)
+			{
+			case EStartupCold:
+			case EStartupColdReset:
+			case EStartupNewOs:
+				*(TInt*)aInOut=HAL::ESystemStartupReason_Cold;
+				break;
+			case EStartupPowerFail:
+			case EStartupWarmReset:
+			case EStartupSafeReset:
+				*(TInt*)aInOut=HAL::ESystemStartupReason_Warm;
+				break;
+			case EStartupKernelFault:
+				*(TInt*)aInOut=HAL::ESystemStartupReason_Fault;
+				break;
+			default:
+				Panic(EInvalidStartupType);
+				break;
+			}
+		}
+	return r;
+	}
+
+// ESystemException
+TInt GetSystemException(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupKernel, EKernelHalExceptionId, aInOut, NULL);
+	}
+
+// EMemoryRAM
+TInt GetRAMSize(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TMemoryInfoV1 info;
+	TPckg<TMemoryInfoV1> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupKernel, EKernelHalMemoryInfo, (TAny*)&infoPckg, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=info.iTotalRamInBytes;
+		}
+	return r;
+	}
+
+// EMemoryRAMFree
+TInt GetFreeRAM(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TMemoryInfoV1 info;
+	TPckg<TMemoryInfoV1> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupKernel, EKernelHalMemoryInfo, (TAny*)&infoPckg, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=info.iFreeRamInBytes;
+		}
+	return r;
+	}
+
+// EMemoryROM
+TInt GetROMSize(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TMemoryInfoV1 info;
+	TPckg<TMemoryInfoV1> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupKernel, EKernelHalMemoryInfo, (TAny*)&infoPckg, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=info.iTotalRomInBytes;
+		}
+	return r;
+	}
+
+// EPowerGood
+TInt GetPowerGoodState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TSupplyInfoV1 info;
+	TPckg<TSupplyInfoV1> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupPower, EPowerHalSupplyInfo, (TAny*)&infoPckg, NULL);
+	if (r==KErrNone)
+		{
+		TBool state=info.iExternalPowerPresent||(info.iMainBatteryStatus>=ELow);
+		*(TBool*)aInOut=state;
+		}
+	return r;
+	}
+
+// EPowerBatteryStatus
+TInt GetBatteryStatus(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TSupplyInfoV1 info;
+	TPckg<TSupplyInfoV1> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupPower, EPowerHalSupplyInfo, (TAny*)&infoPckg, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=(TInt)info.iMainBatteryStatus;
+		}
+	return r;
+	}
+
+// EAccessoryPower
+TInt GetAccessoryPowerPresent(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupPower, EPowerHalAcessoryPowerPresent, aInOut, NULL);
+	}
+
+// EPowerBackup
+TInt GetBackupPresent(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupPower, EPowerHalBackupPresent, aInOut, NULL);
+	}
+
+// EPowerBackupStatus
+TInt GetBackupStatus(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TSupplyInfoV1 info;
+	TPckg<TSupplyInfoV1> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupPower, EPowerHalSupplyInfo, (TAny*)&infoPckg, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=(TInt)info.iBackupBatteryStatus;
+		}
+	return r;
+	}
+
+// EPowerExternal
+TInt GetPowerExternalState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TSupplyInfoV1 info;
+	TPckg<TSupplyInfoV1> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupPower, EPowerHalSupplyInfo, (TAny*)&infoPckg, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=(TInt)info.iExternalPowerPresent;
+		}
+	return r;
+	}
+
+// EKeyboardState
+TInt ProcessKeyboardState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupKeyboard, EKeyboardHalSetKeyboardState, aInOut, NULL);
+	return UserSvr::HalFunction(EHalGroupKeyboard, EKeyboardHalKeyboardState, aInOut, NULL);
+	}
+
+// EKeyboard, EKeyboardDeviceKeys and EKeyboardAppKeys
+TInt ProcessKeyboardInfo(TInt /*aDeviceNumber*/, TInt aAttrib, TBool /*aSet*/, TAny* aInOut)
+	{
+	TKeyboardInfoV01 info;	
+	TPckg<TKeyboardInfoV01> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupKeyboard, EKeyboardHalKeyboardInfo, (TAny*)&infoPckg, NULL);
+	if (KErrNone == r)
+		{
+		switch (aAttrib)
+			{
+			case HAL::EKeyboard:
+				*(TInt*)aInOut=(TInt)info.iKeyboardType;
+				break;
+			case HAL::EKeyboardDeviceKeys:
+				*(TInt*)aInOut = info.iDeviceKeys;
+				break;
+			case HAL::EKeyboardAppKeys:
+				*(TInt*)aInOut = info.iAppsKeys;
+				break;
+			default:
+				__ASSERT_DEBUG(EFalse, Panic(EInvalidAttribKeybd));
+				break;
+			}
+		}
+	return r;
+	}
+
+// EKeyboardClick
+TInt GetKeyboardClickPresent(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TInt state=0;
+	TInt r=UserSvr::HalFunction(EHalGroupSound, ESoundHalKeyClickEnabled, (TAny*)state, NULL);
+	*(TInt*)aInOut=(r==KErrNone)?1:0;  // if there is a clicking device we should be able to get its state
+	return KErrNone;
+	}
+
+// EKeyboardClickVolumeMax
+TInt GetKeyboardClickVolumeMax(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupSound, ESoundHalKeyClickVolumeMax, aInOut, NULL);
+	}
+
+// EKeyboardClickState
+TInt ProcessKeyboardClickState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupSound, ESoundHalSetKeyClickEnabled, aInOut, NULL);
+	return UserSvr::HalFunction(EHalGroupSound, ESoundHalKeyClickEnabled, aInOut, NULL);
+	}
+
+// EKeyboardClickVolume
+TInt ProcessKeyboardClickVolume(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	TInt r;
+	if (aSet)
+		{
+		TInt vol=(TInt)aInOut;
+		TInt volMax=0;
+		r=UserSvr::HalFunction(EHalGroupSound, ESoundHalKeyClickVolumeMax, (TAny*)volMax, NULL);
+		if (r!=KErrNone)
+			return r;
+		if (vol<0 || vol>volMax)
+			return KErrArgument;
+		return UserSvr::HalFunction(EHalGroupSound, ESoundHalSetKeyClickLoud, (TAny*)vol, NULL);
+		}
+	TBool state;
+	r=UserSvr::HalFunction(EHalGroupSound, ESoundHalKeyClickLoud, (TAny*)&state, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=state?1:0;
+		}
+	return r;
+	}
+
+// EDisplayContrast
+TInt ProcessDisplayContrast(TInt aDeviceNumber, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		{
+		TInt x=(TInt)aInOut;
+		return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalSetDisplayContrast, (TAny*)x, NULL, aDeviceNumber);
+		}
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalDisplayContrast, aInOut, NULL, aDeviceNumber);
+	}
+
+// EDisplayBrightness
+TInt ProcessDisplayBrightness(TInt aDeviceNumber, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		{
+		TInt x=(TInt)aInOut;
+		return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalSetDisplayBrightness, (TAny*)x, NULL, aDeviceNumber);
+		}
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalDisplayBrightness, aInOut, NULL, aDeviceNumber);
+	}
+
+
+// EDisplayPaletteEntry
+TInt ProcessDisplayPaletteEntry(TInt aDeviceNumber, TInt __DEBUG_ONLY(aAttrib), TBool aSet, TAny* aInOut)
+	{
+
+	__ASSERT_DEBUG(HAL::EDisplayPaletteEntry == aAttrib, Panic(EInvalidAttributeDP));
+
+	if (aSet)
+		{
+		TInt entry =  ((TInt)aInOut >> 24) & 0xFF;
+		TInt color = ((TInt)aInOut) & 0xFFFFFF;
+		return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalSetPaletteEntry, (TAny*)entry, (TAny*)color, aDeviceNumber);
+		}
+	TInt e = (*(TInt*)aInOut) & 0xFF;
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalPaletteEntry, &e, aInOut, aDeviceNumber);
+	}
+
+// EDisplayNumModes
+TInt ProcessDisplayNumModes(TInt aDeviceNumber, TInt __DEBUG_ONLY(aAttrib), TBool /*aSet*/, TAny* aInOut)
+	{
+	__ASSERT_DEBUG(HAL::EDisplayNumModes == aAttrib, Panic(EInvalidAttributeDNM));
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalModeCount, aInOut, NULL, aDeviceNumber);
+	}
+
+// EDisplayMode
+TInt ProcessDisplayMode(TInt aDeviceNumber, TInt __DEBUG_ONLY(aAttrib), TBool aSet, TAny* aInOut)
+	{
+	__ASSERT_DEBUG(HAL::EDisplayMode == aAttrib, Panic(EInvalidAttributeDM));
+	return UserSvr::HalFunction(EHalGroupDisplay, aSet?EDisplayHalSetMode:EDisplayHalMode, aInOut, NULL, aDeviceNumber);
+	}
+
+// EDisplayState
+TInt ProcessDisplayState(TInt aDeviceNumber, TInt __DEBUG_ONLY(aAttrib), TBool aSet, TAny* aInOut)
+	{
+	__ASSERT_DEBUG(HAL::EDisplayState == aAttrib, Panic(EInvalidAttributeDS));
+
+	if (aSet)
+		{
+		TBool on = (TBool)aInOut;
+		return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalSetState, (TAny*)on, NULL, aDeviceNumber);
+		}
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalState, aInOut, NULL, aDeviceNumber);
+	
+	}
+
+// EDisplayColors
+TInt ProcessDisplayColors(TInt aDeviceNumber, TInt __DEBUG_ONLY(aAttrib), TBool /*aSet*/, TAny* aInOut)
+	{
+	__ASSERT_DEBUG(HAL::EDisplayColors == aAttrib, Panic(EInvalidAttributeDC));
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalColors, aInOut, NULL, aDeviceNumber);
+	}
+
+// EDisplayBrightnessMax
+TInt ProcessDisplayMaxBrightness(TInt aDeviceNumber, TInt __DEBUG_ONLY(aAttrib), TBool /*aSet*/, TAny* aInOut)
+	{
+	__ASSERT_DEBUG(HAL::EDisplayBrightnessMax == aAttrib, Panic(EInvalidAttributeMB));
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalMaxDisplayBrightness, aInOut, NULL, aDeviceNumber);
+	}
+
+// EDisplayContrastMax
+TInt ProcessDisplayMaxContrast(TInt aDeviceNumber, TInt __DEBUG_ONLY(aAttrib), TBool /*aSet*/, TAny* aInOut)
+	{
+	__ASSERT_DEBUG(HAL::EDisplayContrastMax == aAttrib, Panic(EInvalidAttributeMC));
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalMaxDisplayContrast, aInOut, NULL, aDeviceNumber);
+	}
+
+/*
+TInt ProcessSecureDisplayCurrentModeInfo(TInt aDeviceNumber, TInt __DEBUG_ONLY(aAttrib), TBool aSet, TAny* aInOut)
+	{
+	//only info obtainable about secure display is the address
+	__ASSERT_DEBUG(HAL::ESecureDisplayMemoryAddress == aAttrib, Panic(EInvalidAttributeSDMA));
+
+	TVideoInfoV01 info;
+	TPckg<TVideoInfoV01> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalCurrentModeInfo, (TAny*)&infoPckg, (TAny*)ETrue, aDeviceNumber);
+	if (KErrNone == r)
+		*(TInt*)aInOut = info.iVideoAddress;
+
+	return r;
+	}
+*/
+
+TInt ProcessDisplayCurrentModeInfo(TInt aDeviceNumber, TInt aAttrib, TBool /*aSet*/, TAny* aInOut)
+	{
+	TVideoInfoV01 info;
+	TPckg<TVideoInfoV01> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalCurrentModeInfo, (TAny*)&infoPckg, (TAny*)EFalse, aDeviceNumber);
+	if (KErrNone == r)
+		{
+		switch (aAttrib)
+			{
+			case HAL::EDisplayXPixels:
+				*(TInt*)aInOut = info.iSizeInPixels.iWidth;
+				break;
+
+			case HAL::EDisplayYPixels:
+				*(TInt*)aInOut = info.iSizeInPixels.iHeight;
+				break;
+			
+			case HAL::EDisplayXTwips:
+				*(TInt*)aInOut = info.iSizeInTwips.iWidth;
+				break;
+			
+			case HAL::EDisplayYTwips:
+				*(TInt*)aInOut = info.iSizeInTwips.iHeight;
+				break;
+			
+			case HAL::EDisplayMemoryAddress:
+				if (info.iVideoAddress == 0)	//if this is true, the actual address is returned by EDisplayHalGetDisplayMemoryAddress
+					{
+					r = UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalGetDisplayMemoryAddress, aInOut, (TAny*)EFalse, aDeviceNumber);
+					}
+				else
+					{
+					*(TInt*)aInOut = info.iVideoAddress;
+					}
+				break;
+
+			case HAL::EDisplayIsPixelOrderRGB:
+				*(TInt*)aInOut = info.iIsPixelOrderRGB;
+				break;
+
+			case HAL::EDisplayIsPixelOrderLandscape:
+				*(TInt*)aInOut = info.iIsPixelOrderLandscape;
+				break;
+
+			default:
+				__ASSERT_DEBUG(EFalse, Panic(EInvalidAttributeCMI));
+				break;
+
+			}
+		}
+	return r;
+	}
+
+
+TInt ProcessDisplaySpecifiedModeInfo(TInt aDeviceNumber, TInt aAttrib, TBool __DEBUG_ONLY(aSet), TAny* aInOut)
+	{
+
+	__ASSERT_DEBUG(!aSet, Panic(EInvalidAttributeSMI2));
+
+
+	TVideoInfoV01 info;
+	TPckg<TVideoInfoV01> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalSpecifiedModeInfo, aInOut, (TAny*)&infoPckg, aDeviceNumber);
+	if (KErrNone == r)
+		{
+		switch (aAttrib)
+			{
+			case HAL::EDisplayIsMono:
+				*(TInt*)aInOut = info.iIsMono;
+				break;
+			
+			case HAL::EDisplayIsPalettized:
+				*(TInt*)aInOut = info.iIsPalettized;
+				break;
+
+			case HAL::EDisplayBitsPerPixel:
+				*(TInt*)aInOut = info.iBitsPerPixel;
+				break;
+
+			case HAL::EDisplayOffsetToFirstPixel:
+				*(TInt*)aInOut = info.iOffsetToFirstPixel;
+				break;
+
+			case HAL::EDisplayOffsetBetweenLines:
+				*(TInt*)aInOut = info.iOffsetBetweenLines;
+				break;
+
+			default:
+				__ASSERT_DEBUG(EFalse, Panic(EInvalidAttributeSMI));
+				break;
+			}
+		}
+	return r;
+	}
+
+//ESecureDisplay
+/*
+TInt ProcessSecureDisplay(TInt aDeviceNumber, TInt __DEBUG_ONLY(aAttrib), TBool aSet, TAny* aInOut)
+	{
+	__ASSERT_DEBUG(HAL::ESecureDisplay == aAttrib, Panic(EInvalidAttributeSD));
+
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalSetSecure, aInOut, NULL, aDeviceNumber);
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalSecure, aInOut, NULL, aDeviceNumber);
+	}
+*/
+
+// EBacklight
+TInt GetBacklightPresent(TInt aDeviceNumber, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TInt state=0;
+	TInt r=UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalBacklightOn, (TAny*)&state, NULL, aDeviceNumber);
+	*(TInt*)aInOut=(r==KErrNone)?1:0;  // if there is a backlight we should be able to get its state
+	return KErrNone;
+	}
+
+// EBacklightState
+TInt ProcessBacklightState(TInt aDeviceNumber, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalSetBacklightOn, aInOut, NULL, aDeviceNumber);
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalBacklightOn, aInOut, NULL, aDeviceNumber);
+	}
+
+// EPen
+TInt GetPenPresent(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TDigitiserInfoV01Buf buf;
+	TInt r=UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHalXYInfo, (TAny*)&buf, NULL);
+	*(TInt*)aInOut=(r==KErrNone)?1:0;  // if there is a pen device we should be able to get info out of it
+	return KErrNone;
+	}
+
+// EPenX and EPenY
+TInt ProcessPenInfo(TInt /*aDeviceNumber*/, TInt aAttrib, TBool /*aSet*/, TAny* aInOut)
+	{
+	TDigitiserInfoV01 info;
+	TPckg<TDigitiserInfoV01> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHalXYInfo, (TAny*)&infoPckg, NULL);
+	if (KErrNone == r)
+		{
+		switch (aAttrib)
+			{
+			case HAL::EPenX:
+				*(TInt*)aInOut=(TInt)info.iDigitiserSize.iWidth;
+				break;
+			case HAL::EPenY:
+				*(TInt*)aInOut = info.iDigitiserSize.iHeight;
+				break;
+			default:
+				__ASSERT_DEBUG(EFalse, Panic(EInvalidAttribPen));
+				break;
+			}
+		}
+	return r;
+	}
+
+// EPenState
+TInt ProcessPenState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHalSetXYState, aInOut, NULL);
+	return UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHalXYState, aInOut, NULL);
+	}
+
+// EPenDisplayOn
+TInt ProcessPenDisplayOnState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupPower, EPowerHalSetPointerSwitchesOn, aInOut, NULL);
+	return UserSvr::HalFunction(EHalGroupPower, EPowerHalPointerSwitchesOn, aInOut, NULL);
+	}
+
+// EPenClick
+TInt GetPenClickPresent(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TInt state=0;
+	TInt r=UserSvr::HalFunction(EHalGroupSound, ESoundHalPointerClickEnabled, (TAny*)state, NULL);
+	*(TInt*)aInOut=(r==KErrNone)?1:0;  // if there is a clicking device we should be able to get its state
+	return KErrNone;
+	}
+
+// EPenClickVolumeMax
+TInt GetPenClickVolumeMax(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupSound, ESoundHalPointerClickVolumeMax, aInOut, NULL);
+	}
+
+// EPenClickState
+TInt ProcessPenClickState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupSound, ESoundHalSetPointerClickEnabled, aInOut, NULL);
+	return UserSvr::HalFunction(EHalGroupSound, ESoundHalPointerClickEnabled, aInOut, NULL);
+	}
+
+// EPenClickVolume
+TInt ProcessPenClickVolume(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	TInt r;
+	if (aSet)
+		{
+		TInt vol=(TInt)aInOut;
+		TInt volMax=0;
+		r=UserSvr::HalFunction(EHalGroupSound, ESoundHalPointerClickVolumeMax, (TAny*)volMax, NULL);
+		if (r!=KErrNone)
+			return r;
+		if (vol<0 || vol>volMax)	
+			return KErrArgument;
+		return UserSvr::HalFunction(EHalGroupSound, ESoundHalSetPointerClickLoud, (TAny*)vol, NULL);
+		}
+	TBool state;
+	r=UserSvr::HalFunction(EHalGroupSound, ESoundHalPointerClickLoud, (TAny*)&state, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=state?1:0;
+		}
+	return r;
+	}
+
+// ECaseSwitchDisplayOn
+TInt ProcessCaseSwitchDisplayOnState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupPower, EPowerHalSetCaseOpenSwitchesOn, aInOut, NULL);
+	return UserSvr::HalFunction(EHalGroupPower, EPowerHalCaseOpenSwitchesOn, aInOut, NULL);
+	}
+
+// ECaseSwitchDisplayOff
+TInt ProcessCaseSwitchDisplayOffState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupPower, EPowerHalSetCaseCloseSwitchesOff, aInOut, NULL);
+	return UserSvr::HalFunction(EHalGroupPower, EPowerHalCaseCloseSwitchesOff, aInOut, NULL);
+	}
+
+// ELEDs
+TInt GetLedCaps(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TVariantInfoV01 info;
+	TPckg<TVariantInfoV01> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupVariant, EVariantHalVariantInfo, (TAny*)&infoPckg, NULL);
+	if (r==KErrNone)
+		{
+		*(TInt*)aInOut=(info.iLedCapabilities)>>16;		// upper half for number of Leds, lower half for colour capabilities
+		}
+	return r;
+	}
+
+// ELEDmask
+TInt ProcessLEDMask(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		{
+		return UserSvr::HalFunction(EHalGroupVariant, EVariantHalLedMaskSet, aInOut, NULL);
+		}
+	return UserSvr::HalFunction(EHalGroupVariant, EVariantHalLedMaskGet, aInOut, NULL);
+	}
+
+// ESwitches
+TInt GetSwitches(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupVariant, EVariantHalSwitches, aInOut, NULL);
+	}
+
+// EMouse
+TInt GetMousePresent(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	TMouseInfoV01Buf buf;
+	TInt r=UserSvr::HalFunction(EHalGroupMouse, EMouseHalMouseInfo, (TAny*)&buf, NULL);
+	*(TInt*)aInOut=(r==KErrNone)?1:0;  // if there is a mouse device we should be able to get info out of it
+	return KErrNone;
+	}
+
+// EMouseX, EMouseY and EMouseButtons
+TInt ProcessMouseInfo(TInt /*aDeviceNumber*/, TInt aAttrib, TBool /*aSet*/, TAny* aInOut)
+	{
+	TMouseInfoV01 info;
+	TPckg<TMouseInfoV01> infoPckg(info);
+	TInt r=UserSvr::HalFunction(EHalGroupMouse, EMouseHalMouseInfo, (TAny*)&infoPckg, NULL);
+	if (KErrNone == r)
+		{
+		switch (aAttrib)
+			{
+			case HAL::EMouseX:
+				*(TInt*)aInOut=(TInt)info.iMouseAreaSize.iWidth;
+				break;
+			case HAL::EMouseY:
+				*(TInt*)aInOut = info.iMouseAreaSize.iHeight;
+				break;
+			case HAL::EMouseButtons:
+				*(TInt*)aInOut=(TInt)info.iMouseButtons;
+				break;
+			default:
+				__ASSERT_DEBUG(EFalse, Panic(EInvalidAttribMouse));
+				break;
+			}
+		}
+	return r;
+	}
+
+// EMouseState
+TInt ProcessMouseState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupMouse, EMouseHalSetMouseState, aInOut, NULL);
+	return UserSvr::HalFunction(EHalGroupMouse, EMouseHalMouseState, aInOut, NULL);
+	}
+
+// EMouseSpeed
+TInt ProcessMouseSpeed(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		{
+		TInt speed=(TInt)aInOut;
+		if (speed<0 || speed>255)
+			return KErrArgument;
+		return UserSvr::HalFunction(EHalGroupMouse, EMouseHalSetMouseSpeed, (TAny*)speed, NULL);
+		}
+	return UserSvr::HalFunction(EHalGroupMouse, EMouseHalMouseSpeed, aInOut, NULL);
+	}
+
+// EMouseAcceleration
+TInt ProcessMouseAcceleration(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		{
+		TInt acc=(TInt)aInOut;
+		if (acc<0 || acc>255)
+			return KErrArgument;
+		return UserSvr::HalFunction(EHalGroupMouse, EMouseHalSetMouseAcceleration, (TAny*)acc, NULL);
+		}
+	return UserSvr::HalFunction(EHalGroupMouse, EMouseHalMouseAcceleration, aInOut, NULL);
+	}
+
+// EMouseButtonState
+TInt GetMouseButtonState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* /*aInOut*/)
+	{
+	return KErrNotSupported;
+	}
+
+// EDebugPort
+TInt ProcessDebugPort(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupVariant, aSet ? EVariantHalDebugPortSet : EVariantHalDebugPortGet, aInOut, NULL);
+	}
+
+// ECustomRestart
+TInt ProcessCustomRestart(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (!aSet)
+		return KErrNotSupported;
+	return UserSvr::HalFunction(EHalGroupVariant, EVariantHalCustomRestart, aInOut, NULL);
+	}
+
+// ECustomRestartReason
+TInt ProcessCustomRestartReason(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupVariant, EVariantHalCustomRestartReason, aInOut, NULL);
+	}
+
+// EHardwareFloatingPoint
+TInt GetHardwareFloatingPoint(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupKernel, EKernelHalHardwareFloatingPoint, aInOut, NULL);
+	}
+
+// ETimeNonSecureOffset
+TInt NonsecureClockOffset(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	TInt kernelHalFnId = aSet ? EKernelHalSetNonsecureClockOffset : EKernelHalGetNonsecureClockOffset;
+	return UserSvr::HalFunction(EHalGroupKernel, kernelHalFnId, aInOut, NULL);
+	}
+
+// ECaseState
+TInt GetCaseState(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupVariant, EVariantHalCaseState, aInOut, NULL);
+	}
+
+// EPersistStartupModeKernel
+TInt ProcessPersistStartupMode(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupVariant, aSet ? EVariantHalPersistStartupMode : EVariantHalGetPersistedStartupMode, aInOut, NULL);
+	}
+
+// EAvailableCustomRestartReasons
+TInt GetMaximumCustomRestartReasons(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return KErrNotSupported;
+	return UserSvr::HalFunction(EHalGroupVariant, EVariantHalGetMaximumCustomRestartReasons, aInOut, NULL);
+	}
+
+// EMaximumRestartStartupModes
+TInt GetMaximumRestartStartupModes(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return KErrNotSupported;
+	return UserSvr::HalFunction(EHalGroupVariant, EVariantHalGetMaximumRestartStartupModes, aInOut, NULL);
+	}
+
+
+// EPointer3DThetaSupported, EPointer3PhiSupported, EPointer3DRotationSupported, EPointer3DPressureSupported,
+//EPointer3DProximityStep,EPointerMaxPointers,EPointer3DMaxPressure,EPointer3DPressureStep
+
+TInt ProcessAdvancedPointer(TInt aDeviceNumber, TInt aAttrib, TBool /*aSet*/, TAny* aInOut)
+	{
+	TDigitiserInfoV02 info;	
+	TPckg<TDigitiserInfoV02> infoPckg(info);
+
+	TInt r=UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHal3DInfo,(TAny*)&infoPckg, NULL,aDeviceNumber);
+	if (KErrNone == r)
+		{
+		switch (aAttrib)
+			{
+			case HAL::EPointer3DThetaSupported:
+				*(TInt*)aInOut=(TInt)info.iThetaSupported;
+				break;
+
+			case HAL::EPointer3DPhiSupported:
+				*(TInt*)aInOut = info.iPhiSupported;
+				break;
+
+			case HAL::EPointer3DRotationSupported:
+				*(TInt*)aInOut = info.iAlphaSupported;
+				break;
+
+			case HAL::EPointer3DPressureSupported:
+				*(TInt*)aInOut = info.iPressureSupported;
+				break;
+
+			case HAL::EPointer3DProximityStep:
+				*(TInt*)aInOut = info.iProximityStep;
+				break;
+				
+			case HAL::EPointerMaxPointers:
+				*(TInt*)aInOut = info.iMaxPointers;
+				break;
+				
+			case HAL::EPointer3DMaxPressure:
+				*(TInt*)aInOut = info.iMaxPressure;
+				break;
+
+			case HAL::EPointer3DPressureStep:
+				*(TInt*)aInOut = info.iPressureStep;
+				break;
+
+			default:
+				__ASSERT_DEBUG(EFalse, Panic(EInvalidAttrib3DPointer));
+				break;
+			}
+		}
+	return r;
+	}
+
+// EPointer3D
+TInt Get3DPointerPresent(TInt aDeviceNumber, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHal3DPointer, aInOut, NULL, aDeviceNumber);
+	}
+
+//EPointer3DMaxProximity
+TInt Process3DRange(TInt aDeviceNumber, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHalSetZRange, aInOut, NULL, aDeviceNumber);
+	else
+		{
+		TDigitiserInfoV02 info;
+		
+		TPckg<TDigitiserInfoV02> infoPckg(info);
+		TInt r =UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHal3DInfo,(TAny*)&infoPckg, NULL, aDeviceNumber);
+		if(r==KErrNone)
+			{
+			*(TInt*)aInOut=info.iZRange;
+			}
+		return r;
+		}
+	}
+
+// EPointerNumberOfPointers
+TInt ProcessNumberOfPointers(TInt aDeviceNumber, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		return UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHalSetNumberOfPointers, aInOut, NULL, aDeviceNumber);
+	else
+		{
+		TDigitiserInfoV02 info;
+		TPckg<TDigitiserInfoV02> infoPckg(info);
+		TInt r =UserSvr::HalFunction(EHalGroupDigitiser, EDigitiserHal3DInfo, (TAny*)&infoPckg, NULL, aDeviceNumber);
+		if(r==KErrNone)
+			{
+			*(TInt*)aInOut=info.iNumberOfPointers;		
+			}
+		return r;
+		}
+	}
+
+// ENanoTickPeriod
+TInt ProcessNanoTickPeriod(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupKernel,EKernelHalNTickPeriod, aInOut, NULL);
+	}
+
+// EFastCounterFrequency
+TInt ProcessFastCounterFrequency(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool /*aSet*/, TAny* aInOut)
+	{
+	return UserSvr::HalFunction(EHalGroupKernel,EKernelHalFastCounterFrequency, aInOut, NULL);
+	}
+
+//EDisplayMemoryHandle
+TInt GetDisplayMemoryHandle(TInt aDeviceNumber, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		{
+		return KErrNotSupported;
+		}
+	return UserSvr::HalFunction(EHalGroupDisplay, EDisplayHalGetDisplayMemoryHandle, aInOut, NULL, aDeviceNumber);
+	}
+
+//ENumCpus
+TInt GetNumCpus(TInt /*aDeviceNumber*/, TInt /*aAttrib*/, TBool aSet, TAny* aInOut)
+	{
+	if (aSet)
+		{
+		return KErrNotSupported;
+		}
+	*(TInt*)aInOut=UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, NULL, NULL);
+	return KErrNone;
+	}
+