kerneltest/e32test/iic/iic_psl/spi.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/iic/iic_psl/spi.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,156 @@
+// Copyright (c) 2008-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:
+// e32test/iic/iic_psl/spi.h
+//
+
+#ifndef SPI_H_
+#define SPI_H_
+
+#include <drivers/iic_channel.h>
+#include "../t_iic.h"
+
+#ifdef LOG_SPI
+#define SPI_PRINT(str) Kern::Printf str
+#else
+#define SPI_PRINT(str)
+#endif
+
+#ifndef STANDALONE_CHANNEL
+const TInt8 KSpiChannelNumBase = 1;	// Arbitrary, real platform may consult the Configuration Repository
+									// Note limit of 5 bit representation (0-31)
+#endif
+
+class THwDoneCallBack : public TDfc
+	{
+public:
+	inline THwDoneCallBack(THwDoneCbFn aFn, TAny* aPtr, TDfcQue* aQue, TInt aPriority) : TDfc(DfcFn, this, aQue, aPriority),iCbFn(aFn),iParam(aPtr) {}
+	inline ~THwDoneCallBack(){}
+	
+private:
+	inline static void DfcFn(TAny* aPtr)
+		{
+		THwDoneCallBack* pCb = (THwDoneCallBack*) aPtr;
+		pCb -> iCbFn(pCb->iParam);
+		}
+	
+private:
+	THwDoneCbFn iCbFn;
+	TAny* iParam;
+	};
+
+class DSimulatedIicBusChannelMasterSpi : public DIicBusChannelMaster
+	{
+	// platform specific implementation
+
+	enum TTestState
+		{
+		ETestNone=0,
+		ETestWaitPriorityTest,
+		ETestWaitTransOne,
+		ETestSlaveTimeOut
+		};
+	
+	enum TMyState
+		{
+		EIdle,
+		EBusy
+		};
+	
+	enum TIsrCause
+		{
+		EHwTransferDone,
+		ETimeExpired
+		};
+	
+public:
+#ifdef STANDALONE_CHANNEL
+	IMPORT_C
+#endif
+	DSimulatedIicBusChannelMasterSpi(const TBusType aBusType, const TChannelDuplex aChanDuplex);
+	~DSimulatedIicBusChannelMasterSpi(){iDynamicDfcQ->Destroy();};
+	inline TInt Create() {return DoCreate();}
+	TInt DoCreate();
+	TInt ReleaseChanArray();
+	void CompleteReq(TInt aResult);
+
+private:
+	TInt CheckHdr(TDes8* aHdr);	// Check the header is valid for this channel
+	virtual TInt StaticExtension(TUint aFunction, TAny* aParam1, TAny* aParam2);	
+
+	TInt CompareTransactionOne(TIicBusTransaction* aTransaction);
+
+public:
+	// gateway function for PSL implementation
+	TInt DoRequest(TIicBusTransaction* aTransaction);
+	TInt HandleSlaveTimeout();
+	// Test functions to allow simulating delayed processing of requests
+	static TBool IsRequestDelayed(DSimulatedIicBusChannelMasterSpi* aChan);
+	static void SetRequestDelayed(DSimulatedIicBusChannelMasterSpi* aChan,TBool aDelay);
+
+	TInt ProcessTrans(TIicBusTransaction* aTransaction); // Accessed by callback
+	TInt AsynchStateMachine(TInt aReason);
+	TInt DoSimulatedTransaction();
+	TInt DoHwPreparation();
+	static void TransactionTimerCallBack(TAny*);
+	
+	inline TInt8 GetChanNum() {return iChannelNumber;};
+private:
+	TDynamicDfcQue*	iDynamicDfcQ;	// Use TDynamicDfcQue since will want to DeRegister channels
+	
+	TIicBusTransaction* iCurrTrans;
+	
+	static TInt8 iCurrentChanNum;
+
+	TInt8 iTestState;
+	TInt8 iChannelState;
+	
+	TBool iReqDelayed;
+	THwDoneCallBack *iCb;
+	TInt iPriorityTestResult[KPriorityTestNum];
+	TBool iPriorityTestDone;
+	};
+#ifndef STANDALONE_CHANNEL
+TInt8 DSimulatedIicBusChannelMasterSpi::iCurrentChanNum = KSpiChannelNumBase; // Initialise static member of DSimulatedIicBusChannelMasterSpi
+#endif
+class DSimulatedIicBusChannelSlaveSpi : public DIicBusChannelSlave
+	{
+public:
+	// platform specific implementation
+#ifdef STANDALONE_CHANNEL
+	IMPORT_C
+#endif
+	DSimulatedIicBusChannelSlaveSpi(const DIicBusChannel::TBusType aBusType, const DIicBusChannel::TChannelDuplex aChanDuplex);
+	inline TInt Create() {return DoCreate();}
+	TInt DoCreate();
+	// gateway function for PSL implementation
+	TInt DoRequest(TInt aTrigger);
+	void ProcessData(TInt aTrigger, TIicBusSlaveCallback*  aCb);
+	virtual TInt StaticExtension(TUint aFunction, TAny* aParam1, TAny* aParam2);	
+	static void SlaveAsyncSimCallback(TAny* aPtr);
+	inline void ChanCaptureCb(TInt aResult) {ChanCaptureCallback(aResult);}
+	inline void SetChanNum(TInt8 aChanNum) {iChannelNumber = aChanNum;};
+protected:
+	virtual void SendBusErrorAndReturn() {return;} // Not implemented in simulated PSL
+
+	private:
+	TInt CheckHdr(TDes8* aHdr);	// Check the header is valid for this channel
+	virtual TInt CaptureChannelPsl(TDes8* aConfigHdr, TBool aAsynch);
+
+private:
+	NTimer iSlaveTimer;
+	};
+
+
+
+#endif /*SPI_H_*/