kerneltest/e32test/dma/d_dma.h
changeset 0 a41df078684a
child 293 0659d0e1a03c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/dma/d_dma.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,195 @@
+// Copyright (c) 2002-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\dma\d_dma.h
+// User-side API for LDD used to test DMA framework.
+// 
+//
+
+#ifndef __D_DMA_H__
+#define __D_DMA_H__
+
+#include <e32cmn.h>
+#ifndef __KLIB_H__
+#include <e32std.h>
+#endif
+
+#ifdef __DMASIM__
+_LIT(KTestDmaLddName, "TestDmaSim");
+#else
+_LIT(KTestDmaLddName, "TestDma");
+#endif
+
+inline TVersion TestDmaLddVersion() { return TVersion(1, 0, 1); }
+
+class RTestDma : public RBusLogicalChannel
+	{
+public:
+	struct TFragmentInfo
+		{
+		TInt iRequestIdx;
+		TInt iSrcBufIdx;
+		TInt iDestBufIdx;
+		TInt iSize;
+		TRequestStatus* iRs;
+		};
+	struct TOpenInfo
+		{
+		enum { EGetInfo, EOpen } iWhat;
+		union
+			{
+			TAny* iInfo;
+			struct
+				{
+				TUint32 iId;
+				TInt iDesCount;
+				TInt iMaxTransferSize;
+				} iOpen;
+			} U;
+		};
+	enum TControl
+		{
+		EAllocBuffer,
+		EFreeAllBuffers,
+		EFillBuffer,
+		ECheckBuffer,
+		EFragment,
+		EExecute,
+		EFailNext,
+		EFragmentCount,
+		EMissInterrupts,
+		};
+	enum { KMaxChannels = 32 };
+	struct TInfo
+		{
+		TInt iMaxTransferSize;
+		TUint iMemAlignMask;
+		TInt iMaxSbChannels;
+		TUint32 iSbChannels[KMaxChannels];
+		TInt iMaxDbChannels;
+		TUint32 iDbChannels[KMaxChannels];
+		TInt iMaxSgChannels;
+		TUint32 iSgChannels[KMaxChannels];
+		};
+public:
+#ifndef __KERNEL_MODE__
+	inline TInt GetInfo(TInfo& aInfo);
+	inline TInt Open(TUint32 aId, TInt aDesCount, TInt aMaxTransferSize);
+	inline TInt AllocBuffer(TInt aBufIdx, TInt aSize);
+	inline void FreeAllBuffers();
+	inline void FillBuffer(TInt aBufIdx, TUint8 aFillValue);
+	inline TBool CheckBuffer(TInt aBufIdx, TUint8 aValue);
+	inline TInt Fragment(TInt aRequestIdx, TInt aSrcBufIdx, TInt aDestBufIdx, TInt aSize, TRequestStatus* aRs=NULL);
+	inline TInt Execute(const TDesC8& aCmd);
+	inline TInt FailNext(TInt aFragmentCount);
+	inline TInt FragmentCount(TInt aRequestIdx);
+	inline TInt MissNextInterrupts(TInt aInterruptCount);
+	inline TBool FragmentCheck(TInt aRequestIdx, TInt aExpectedCount);
+#endif
+	};
+
+#ifndef __KERNEL_MODE__
+
+inline TInt RTestDma::GetInfo(TInfo& aInfo)
+	{
+	TPckgBuf<TOpenInfo> infoBuf;
+	infoBuf().iWhat = TOpenInfo::EGetInfo;
+	infoBuf().U.iInfo = &aInfo;
+	return DoCreate(KTestDmaLddName, TestDmaLddVersion(), 0, NULL, &infoBuf) == KErrDied ? KErrNone : KErrGeneral;
+	}
+
+inline TInt RTestDma::Open(TUint32 aId, TInt aDesCount, TInt aMaxTransferSize)
+	{
+	TPckgBuf<TOpenInfo> infoBuf;
+	infoBuf().iWhat = TOpenInfo::EOpen;
+	infoBuf().U.iOpen.iId = aId;
+	infoBuf().U.iOpen.iDesCount = aDesCount;
+	infoBuf().U.iOpen.iMaxTransferSize = aMaxTransferSize;
+	return DoCreate(KTestDmaLddName, TestDmaLddVersion(), 0, NULL, &infoBuf, EOwnerThread);
+	}
+
+inline TInt RTestDma::AllocBuffer(TInt aBufIdx, TInt aSize)
+	{
+	return DoControl(EAllocBuffer, (TAny*)aBufIdx, (TAny*)aSize);
+	}
+
+inline void RTestDma::FreeAllBuffers()
+	{
+	DoControl(EFreeAllBuffers, NULL, NULL);
+	}
+
+inline void RTestDma::FillBuffer(TInt aBufIdx, TUint8 aFillValue)
+	{
+	DoControl(EFillBuffer, (TAny*)aBufIdx, (TAny*)(TUint)aFillValue);
+	}
+
+inline TBool RTestDma::CheckBuffer(TInt aBufIdx, TUint8 aValue)
+	{
+	return DoControl(ECheckBuffer, (TAny*)aBufIdx, (TAny*)(TUint)aValue);
+	}
+
+inline TInt RTestDma::Fragment(TInt aRequestIdx, TInt aSrcBufIdx, TInt aDestBufIdx, TInt aSize, TRequestStatus* aRs)
+	{
+	TFragmentInfo info;
+	info.iRequestIdx = aRequestIdx;
+	info.iSrcBufIdx = aSrcBufIdx;
+	info.iDestBufIdx = aDestBufIdx;
+	info.iSize = aSize;
+	info.iRs = aRs;
+	if (aRs != NULL)
+		*aRs = KRequestPending;
+	return DoControl(EFragment, &info, NULL);
+	}
+
+inline TInt RTestDma::Execute(const TDesC8& aCmd)
+	{
+	return DoControl(EExecute, (TDesC8*)&aCmd, NULL);
+	}
+
+inline TInt RTestDma::FailNext(TInt aFragmentCount)
+	{
+	return DoControl(EFailNext, (TAny*)aFragmentCount, NULL);
+	}
+
+inline TInt RTestDma::FragmentCount(TInt aRequestIdx)
+	{
+	return DoControl(EFragmentCount, (TAny*)aRequestIdx, NULL);
+	}
+
+inline TInt RTestDma::MissNextInterrupts(TInt aInterruptCount)
+	{
+	return DoControl(EMissInterrupts, (TAny*)aInterruptCount, NULL);
+	}
+
+/**
+@param The number of fragments expected, 0 means don't check
+*/
+inline TBool RTestDma::FragmentCheck(TInt aRequestIdx, TInt aExpectedCount)
+	{
+	if(aExpectedCount)
+		{
+		TInt actualCount = FragmentCount(aRequestIdx);
+		if(actualCount == aExpectedCount)
+			return ETrue;
+		else
+			{
+			RDebug::Printf("Fragment count error: expected %d, got %d", aExpectedCount, actualCount);
+			return EFalse;
+			}
+		}
+	else
+		return ETrue;
+	}
+#endif // #ifndef __KERNEL_MODE__
+
+#endif