kerneltest/e32test/dma/d_dma.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 137 8aab599e3476
parent 0 a41df078684a
child 293 0659d0e1a03c
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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