sl@0: // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // e32test\dma\d_dma.h sl@0: // User-side API for LDD used to test DMA framework. sl@0: // sl@0: // sl@0: sl@0: #ifndef __D_DMA_H__ sl@0: #define __D_DMA_H__ sl@0: sl@0: #include sl@0: #ifndef __KLIB_H__ sl@0: #include sl@0: #endif sl@0: sl@0: #ifdef __DMASIM__ sl@0: _LIT(KTestDmaLddName, "TestDmaSim"); sl@0: #else sl@0: _LIT(KTestDmaLddName, "TestDma"); sl@0: #endif sl@0: sl@0: inline TVersion TestDmaLddVersion() { return TVersion(1, 0, 1); } sl@0: sl@0: class RTestDma : public RBusLogicalChannel sl@0: { sl@0: public: sl@0: struct TFragmentInfo sl@0: { sl@0: TInt iRequestIdx; sl@0: TInt iSrcBufIdx; sl@0: TInt iDestBufIdx; sl@0: TInt iSize; sl@0: TRequestStatus* iRs; sl@0: }; sl@0: struct TOpenInfo sl@0: { sl@0: enum { EGetInfo, EOpen } iWhat; sl@0: union sl@0: { sl@0: TAny* iInfo; sl@0: struct sl@0: { sl@0: TUint32 iId; sl@0: TInt iDesCount; sl@0: TInt iMaxTransferSize; sl@0: } iOpen; sl@0: } U; sl@0: }; sl@0: enum TControl sl@0: { sl@0: EAllocBuffer, sl@0: EFreeAllBuffers, sl@0: EFillBuffer, sl@0: ECheckBuffer, sl@0: EFragment, sl@0: EExecute, sl@0: EFailNext, sl@0: EFragmentCount, sl@0: EMissInterrupts, sl@0: }; sl@0: enum { KMaxChannels = 32 }; sl@0: struct TInfo sl@0: { sl@0: TInt iMaxTransferSize; sl@0: TUint iMemAlignMask; sl@0: TInt iMaxSbChannels; sl@0: TUint32 iSbChannels[KMaxChannels]; sl@0: TInt iMaxDbChannels; sl@0: TUint32 iDbChannels[KMaxChannels]; sl@0: TInt iMaxSgChannels; sl@0: TUint32 iSgChannels[KMaxChannels]; sl@0: }; sl@0: public: sl@0: #ifndef __KERNEL_MODE__ sl@0: inline TInt GetInfo(TInfo& aInfo); sl@0: inline TInt Open(TUint32 aId, TInt aDesCount, TInt aMaxTransferSize); sl@0: inline TInt AllocBuffer(TInt aBufIdx, TInt aSize); sl@0: inline void FreeAllBuffers(); sl@0: inline void FillBuffer(TInt aBufIdx, TUint8 aFillValue); sl@0: inline TBool CheckBuffer(TInt aBufIdx, TUint8 aValue); sl@0: inline TInt Fragment(TInt aRequestIdx, TInt aSrcBufIdx, TInt aDestBufIdx, TInt aSize, TRequestStatus* aRs=NULL); sl@0: inline TInt Execute(const TDesC8& aCmd); sl@0: inline TInt FailNext(TInt aFragmentCount); sl@0: inline TInt FragmentCount(TInt aRequestIdx); sl@0: inline TInt MissNextInterrupts(TInt aInterruptCount); sl@0: inline TBool FragmentCheck(TInt aRequestIdx, TInt aExpectedCount); sl@0: #endif sl@0: }; sl@0: sl@0: #ifndef __KERNEL_MODE__ sl@0: sl@0: inline TInt RTestDma::GetInfo(TInfo& aInfo) sl@0: { sl@0: TPckgBuf infoBuf; sl@0: infoBuf().iWhat = TOpenInfo::EGetInfo; sl@0: infoBuf().U.iInfo = &aInfo; sl@0: return DoCreate(KTestDmaLddName, TestDmaLddVersion(), 0, NULL, &infoBuf) == KErrDied ? KErrNone : KErrGeneral; sl@0: } sl@0: sl@0: inline TInt RTestDma::Open(TUint32 aId, TInt aDesCount, TInt aMaxTransferSize) sl@0: { sl@0: TPckgBuf infoBuf; sl@0: infoBuf().iWhat = TOpenInfo::EOpen; sl@0: infoBuf().U.iOpen.iId = aId; sl@0: infoBuf().U.iOpen.iDesCount = aDesCount; sl@0: infoBuf().U.iOpen.iMaxTransferSize = aMaxTransferSize; sl@0: return DoCreate(KTestDmaLddName, TestDmaLddVersion(), 0, NULL, &infoBuf, EOwnerThread); sl@0: } sl@0: sl@0: inline TInt RTestDma::AllocBuffer(TInt aBufIdx, TInt aSize) sl@0: { sl@0: return DoControl(EAllocBuffer, (TAny*)aBufIdx, (TAny*)aSize); sl@0: } sl@0: sl@0: inline void RTestDma::FreeAllBuffers() sl@0: { sl@0: DoControl(EFreeAllBuffers, NULL, NULL); sl@0: } sl@0: sl@0: inline void RTestDma::FillBuffer(TInt aBufIdx, TUint8 aFillValue) sl@0: { sl@0: DoControl(EFillBuffer, (TAny*)aBufIdx, (TAny*)(TUint)aFillValue); sl@0: } sl@0: sl@0: inline TBool RTestDma::CheckBuffer(TInt aBufIdx, TUint8 aValue) sl@0: { sl@0: return DoControl(ECheckBuffer, (TAny*)aBufIdx, (TAny*)(TUint)aValue); sl@0: } sl@0: sl@0: inline TInt RTestDma::Fragment(TInt aRequestIdx, TInt aSrcBufIdx, TInt aDestBufIdx, TInt aSize, TRequestStatus* aRs) sl@0: { sl@0: TFragmentInfo info; sl@0: info.iRequestIdx = aRequestIdx; sl@0: info.iSrcBufIdx = aSrcBufIdx; sl@0: info.iDestBufIdx = aDestBufIdx; sl@0: info.iSize = aSize; sl@0: info.iRs = aRs; sl@0: if (aRs != NULL) sl@0: *aRs = KRequestPending; sl@0: return DoControl(EFragment, &info, NULL); sl@0: } sl@0: sl@0: inline TInt RTestDma::Execute(const TDesC8& aCmd) sl@0: { sl@0: return DoControl(EExecute, (TDesC8*)&aCmd, NULL); sl@0: } sl@0: sl@0: inline TInt RTestDma::FailNext(TInt aFragmentCount) sl@0: { sl@0: return DoControl(EFailNext, (TAny*)aFragmentCount, NULL); sl@0: } sl@0: sl@0: inline TInt RTestDma::FragmentCount(TInt aRequestIdx) sl@0: { sl@0: return DoControl(EFragmentCount, (TAny*)aRequestIdx, NULL); sl@0: } sl@0: sl@0: inline TInt RTestDma::MissNextInterrupts(TInt aInterruptCount) sl@0: { sl@0: return DoControl(EMissInterrupts, (TAny*)aInterruptCount, NULL); sl@0: } sl@0: sl@0: /** sl@0: @param The number of fragments expected, 0 means don't check sl@0: */ sl@0: inline TBool RTestDma::FragmentCheck(TInt aRequestIdx, TInt aExpectedCount) sl@0: { sl@0: if(aExpectedCount) sl@0: { sl@0: TInt actualCount = FragmentCount(aRequestIdx); sl@0: if(actualCount == aExpectedCount) sl@0: return ETrue; sl@0: else sl@0: { sl@0: RDebug::Printf("Fragment count error: expected %d, got %d", aExpectedCount, actualCount); sl@0: return EFalse; sl@0: } sl@0: } sl@0: else sl@0: return ETrue; sl@0: } sl@0: #endif // #ifndef __KERNEL_MODE__ sl@0: sl@0: #endif