kerneltest/e32test/iic/iic_psl/i2c.h
changeset 0 a41df078684a
child 90 947f0dc9f7a8
child 256 c1f20ce4abcf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/iic/iic_psl/i2c.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,152 @@
+// 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/i2c.h
+//
+
+#ifndef I2C_H_
+#define I2C_H_
+
+#include <drivers/iic_channel.h>
+#include "../t_iic.h"
+
+#define NUM_CHANNELS 3 // Arbitrary
+
+#ifdef LOG_I2C
+#define I2C_PRINT(str) Kern::Printf str
+#else
+#define I2C_PRINT(str)
+#endif
+
+_LIT(KI2cThreadName,"I2cChannelThread");
+
+#ifndef STANDALONE_CHANNEL
+#if defined(MASTER_MODE)
+const TInt8 KI2cChannelNumBase = 10;	// Arbitrary, real platform may consult the Configuration Repository
+										// Note limit of 5 bit representation (0-31)
+
+#else/*MASTER_MODE*/
+const TInt8 KI2cChannelNumBase = 10 + NUM_CHANNELS;	// For Slave mode, want to provide different response
+													// If client assumes Master mode, should be informed not available
+#endif/*MASTER_MODE*/
+#endif/*STANDALONE_CHANNEL*/
+
+
+#if defined(MASTER_MODE)
+const TInt KI2cThreadPriority = 5; // Arbitrary, can be 0-7, 7 highest
+#endif
+
+const TInt16 KI2cSlaveChannelIdBase = 0x1D00;	// Arbitrary
+
+#ifdef MASTER_MODE
+class DSimulatedIicBusChannelMasterI2c : public DIicBusChannelMaster
+	{
+	// platform specific implementation
+	public:
+#ifdef STANDALONE_CHANNEL
+	IMPORT_C
+#endif
+	DSimulatedIicBusChannelMasterI2c(const TBusType aBusType, const TChannelDuplex aChanDuplex);
+	inline TInt Create() {return DoCreate();}
+	TInt DoCreate();
+
+
+private:
+	TInt CheckHdr(TDes8* aHdr);	// Check the header is valid for this channel
+	TInt StaticExtension(TUint aFunction, TAny* aParam1, TAny* aParam2);	
+public:
+	// gateway function for PSL implementation
+	TInt DoRequest(TIicBusTransaction* aTransaction);
+	TInt HandleSlaveTimeout();
+
+	// Test functions to allow simulating delayed processing of requests
+	static TBool IsRequestDelayed(DSimulatedIicBusChannelMasterI2c* aChan);
+	static void SetRequestDelayed(DSimulatedIicBusChannelMasterI2c* aChan,TBool aDelay);
+
+	TInt ProcessTrans(); // Accessed by callback
+	inline TInt8 GetChanNum() {return iChannelNumber;};
+private:
+	TDynamicDfcQue*	iDynamicDfcQ;
+
+	static TInt8 iCurrentChanNum;
+
+	TBool iReqDelayed;
+	};
+#ifndef STANDALONE_CHANNEL
+TInt8 DSimulatedIicBusChannelMasterI2c::iCurrentChanNum = KI2cChannelNumBase; // Initialise static member of DSimulatedIicBusChannelMasterI2c
+#endif
+#endif/*MASTER_MODE*/
+
+#ifdef SLAVE_MODE
+class DSimulatedIicBusChannelSlaveI2c : public DIicBusChannelSlave
+	{
+public:
+	// platform specific implementation
+#ifdef STANDALONE_CHANNEL
+	IMPORT_C
+#endif
+	DSimulatedIicBusChannelSlaveI2c(const DIicBusChannel::TBusType aBusType, const DIicBusChannel::TChannelDuplex aChanDuplex);
+	~DSimulatedIicBusChannelSlaveI2c();
+	// gateway function for PSL implementation
+	TInt DoRequest(TInt aTrigger);
+	void ProcessData(TInt aTrigger, TIicBusSlaveCallback*  aCb);
+	TInt StaticExtension(TUint aFunction, TAny* aParam1, TAny* aParam2);	
+
+	inline TInt Create() {return DoCreate();}
+	virtual TInt DoCreate();
+
+	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(TBool aAsynch);
+		virtual TInt ReleaseChannelPsl();
+		TInt PrepareTrigger(TInt aTrigger);
+	private:
+
+		TInt8 iDeltaWordsToRx;
+		TInt8 iDeltaWordsToTx;
+		TInt8 iNumWordsWereRx;
+		TInt8 iNumWordsWereTx;
+		TInt8 iRxTxUnderOverRun;
+
+		TInt8* iTxCheckBuf;
+
+		TInt iBlockedTrigger;
+		TBool iBlockNotification;
+
+		NTimer iSlaveTimer; // Used to simulate an asynchronous capture operation
+		};
+#endif/*SLAVE_MODE*/
+
+#if defined(MASTER_MODE) && defined(SLAVE_MODE)
+class DSimulatedIicBusChannelMasterSlaveI2c : public DIicBusChannelMasterSlave
+	{
+public:
+#ifdef STANDALONE_CHANNEL
+	IMPORT_C
+#endif
+	DSimulatedIicBusChannelMasterSlaveI2c(TBusType /*aBusType*/, TChannelDuplex aChanDuplex, DSimulatedIicBusChannelMasterI2c* aMasterChan, DSimulatedIicBusChannelSlaveI2c* aSlaveChan);
+				
+	TInt StaticExtension(TUint aFunction, TAny* aParam1, TAny* aParam2);	
+	};
+#endif/*(MASTER_MODE) && (SLAVE_MODE)*/
+
+#endif /*I2C_H_*/