navienginebsp/ne1_tb/test/gpio/d_gpio.cpp
changeset 0 5de814552237
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/navienginebsp/ne1_tb/test/gpio/d_gpio.cpp	Tue Sep 28 18:00:05 2010 +0100
@@ -0,0 +1,155 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: 
+*
+*/
+
+
+#include <naviengine_priv.h>
+#include <gpio.h>
+#include "d_gpio.h"
+#include "d_gpio_dev.h"
+
+#define ETestStaticExtension 0x80000000
+
+_LIT(KGpioDfscQueName, "D_GPIO_DFC");
+
+DECLARE_STANDARD_LDD()
+	{
+	return new DGpioFactory;
+	}
+
+DGpioFactory::DGpioFactory()
+	{
+	// Set version number for this device
+	iVersion=RGpio::VersionRequired();
+	iParseMask=0;
+	}
+
+TInt DGpioFactory::Install()
+	{
+	return SetName(&RGpio::Name());
+	}
+
+DGpioFactory::~DGpioFactory()
+   	{
+   	}
+
+void DGpioFactory::GetCaps(TDes8& aDes) const
+	{
+	// Create a capabilities object
+	RGpio::TCaps caps;
+	caps.iVersion = iVersion;
+	// Write it back to user memory
+	Kern::InfoCopy(aDes,(TUint8*)&caps,sizeof(caps));
+	}
+
+TInt DGpioFactory::Create(DLogicalChannelBase*& aChannel)
+	{
+	aChannel=new DGpioChannel;
+	if(!aChannel)
+		return KErrNoMemory;
+
+	return KErrNone;
+	}
+
+DGpioChannel::DGpioChannel()
+	{
+	iClient=&Kern::CurrentThread();
+	iClient->Open();
+	}
+
+TInt DGpioChannel::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer)
+	{
+	TDynamicDfcQue* dfcq = NULL; 
+	TInt r = Kern::DynamicDfcQCreate(dfcq, 27, KGpioDfscQueName); 
+
+	if(r == KErrNone) 
+		{ 
+		iDfcQ = dfcq; 
+		SetDfcQ(iDfcQ); 
+		iMsgQ.Receive(); 
+		} 
+	return r;
+	}
+
+DGpioChannel::~DGpioChannel()
+	{
+	((TDynamicDfcQue*)iDfcQ)->Destroy();
+	Kern::SafeClose((DObject*&)iClient,NULL);
+	}
+
+TInt DGpioChannel::RequestUserHandle(DThread* aThread, TOwnerType aType)
+	{
+	// Make sure that only our client can get a handle
+	if (aType!=EOwnerThread || aThread!=iClient)
+		return KErrAccessDenied;
+	return KErrNone;
+	}
+
+void DGpioChannel::HandleMsg(TMessageBase* aMsg)
+	{
+	TThreadMessage& m=*(TThreadMessage*)aMsg;
+
+	// Get message type
+	TInt id=m.iValue;
+
+	// Decode the message type and dispatch it to the relevent handler function...
+
+	if (id==(TInt)ECloseMsg)
+		{
+		m.Complete(KErrNone, EFalse);
+		return;
+		}
+
+	if (id==KMaxTInt)
+		{
+		m.Complete(KErrNone,ETrue);
+		return;
+		}
+
+	if (id<0)
+		{
+		TInt r=DoControl(id);
+		m.Complete(r, KErrNotSupported);
+		}
+	else
+		{
+		// DoControl
+		TInt r=DoControl(id);
+		m.Complete(r,ETrue);
+		}
+	}
+
+/**
+  Process synchronous 'control' requests
+*/
+TInt DGpioChannel::DoControl(TInt aFunction)
+	{
+	TInt r=KErrNone;
+
+	switch (aFunction)
+		{
+	case RGpio::ECallStaticExtension:
+		r = GPIO::StaticExtension(0, ETestStaticExtension, NULL, NULL);
+		break;
+
+	default:
+		r = KErrNotSupported;
+		break;
+		}
+
+	return r;
+	}
+