diff -r 947f0dc9f7a8 -r ef2a444a7410 kernel/eka/drivers/usbho/usbdi_utils/zerocopytransferstrategy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/drivers/usbho/usbdi_utils/zerocopytransferstrategy.h Mon May 03 13:47:38 2010 +0300 @@ -0,0 +1,112 @@ +// Copyright (c) 2007-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: +// + +/** + @file + @internalComponent +*/ + +#ifndef ZEROCOPYTRANSFERSTRATEGY_H +#define ZEROCOPYTRANSFERSTRATEGY_H + +#include "usbtransferstrategy.h" + + +NONSHARABLE_CLASS(RUsbZeroCopyTransferStrategy) : public RUsbTransferStrategy + { +public: + RUsbZeroCopyTransferStrategy(); + virtual TInt RegisterTransferDescriptor(RUsbTransferDescriptor& aTransferDesc, TInt aRequiredSize, TUint aStartAlignment, TInt aRequiredMaxPackets); + virtual void ResetTransferDescriptors(); + virtual TInt InitialiseTransferDescriptors(RUsbInterface& aInterface); + + virtual void Close(); + +public: // Interrupt transfer descriptor methods + virtual TPtr8 IntrWritableBuffer(TInt aHandle); + virtual void IntrSaveData(TInt aHandle, TInt aLength); + virtual void IntrSetZlpStatus(TInt aHandle, RUsbTransferDescriptor::TZlpStatus aZlpStatus); + virtual TPtrC8 IntrBuffer(TInt aHandle) const; +public: // Bulk transfer descriptor methods + virtual TPtr8 BulkWritableBuffer(TInt aHandle); + virtual void BulkSaveData(TInt aHandle, TInt aLength); + virtual void BulkSetZlpStatus(TInt aHandle, RUsbTransferDescriptor::TZlpStatus aZlpStatus); + virtual TPtrC8 BulkBuffer(TInt aHandle) const; +public: // Isochronous transfer descriptor methods + virtual void IsocReset(TInt aHandle); + virtual TPacketLengths IsocLengths(TInt aHandle); + virtual TPacketResults IsocResults(TInt aHandle); + virtual TInt IsocMaxPacketSize(TInt aHandle); + virtual TPtr8 IsocWritablePackets(TInt aHandle, TInt aWriteHandle, TInt aNumPacketsRequested, TInt& aMaxNumPacketsAbleToWrite); + virtual TInt IsocSaveMultiple(TInt aHandle, TInt aWriteHandle, TInt aNumOfPackets); + virtual TPtrC8 IsocPackets(TInt aHandle, TInt aFirstPacketIndex, TInt aNumPacketsRequested, TInt& aNumPacketsReturned) const; + virtual void IsocReceivePackets(TInt aHandle, TInt aNumOfPackets); + + +private: // Standard (Bulk, Ctrl and Intr) Buffer methods + TPtr8 WritableBuffer(TInt aHandle); + void SaveData(TInt aHandle, TInt aLength); + void SetZlpStatus(TInt aHandle, RUsbTransferDescriptor::TZlpStatus aZlpStatus); + TPtrC8 Buffer(TInt aHandle) const; + +private: // Isoc Buffer methods + void Reset(TInt aHandle); + TPacketLengths Lengths(TInt aHandle); + TPacketResults Results(TInt aHandle); + TInt MaxPacketSize(TInt aHandle); + TPtr8 WritablePackets(TInt aHandle, TInt aWriteHandle, TInt aNumPacketsRequested, TInt& aMaxNumPacketsAbleToWrite); + TInt SaveMultiple(TInt aHandle, TInt aWriteHandle, TInt aNumOfPackets); + TPtrC8 Packets(TInt aHandle, TInt aFirstPacketIndex, TInt aNumPacketsRequested, TInt& aNumPacketsReturned) const; + void ReceivePackets(TInt aHandle, TInt aNumOfPackets); + +private: + NONSHARABLE_STRUCT(TUsbTransferDescriptorDetails) + { + TUsbTransferDescriptorDetails(RUsbTransferDescriptor&, TInt, TUint, TInt); + RUsbTransferDescriptor& iTransferDesc; + const TInt iRequiredSize; + TUint iRequiredAlignment; + const TInt iRequiredMaxPackets; + // Members to aid internal logic + TInt iAssignedOffset; + TInt iLengthsOffset; // Only applicable to isoc + TInt iReqLenOffset; // Only applicable to isoc + TInt iResultsOffset; // Only applicable to isoc + TInt iNumElements; // Only applicable to isoc + }; + +private: + TInt CalculateDataLayout(TInt& aCurrentOffset, TInt& aNumStandardTransfers, TInt& aNumIsocTransfers, TInt& aNumIsocElements); + void CalculateMetaDataLayout(TInt& aCurrentOffset, TInt& aMetaDataStart, TInt aNumStandardTransfers, TInt aNumIsocTransfers, TInt aNumIsocElements); + void InitialiseMetaData(TInt aMetaDataOffset, TInt aNumStandardTransfers, TInt aNumIsocTransfers, TInt aNumIsocElements); + TInt UsedPackets(TInt aHeaderOffset); + TBool IsPowerOfTwo(TUint aNumber); + TInt IncNeededToAlign(TInt aOffset, TUint aAlignment); + static TBool CompareTransferDescriptor(const RUsbTransferDescriptor* aTransferDesc, const TUsbTransferDescriptorDetails& aDetails); + +private: //Calculate additional alignment related methods + TInt GetMaximumMaxPacketSize(TInt& aMaxMaxBulk, TInt& aMaxMaxInterrupt); + TInt CaculateAdditionalAlignment(TInt aCurrentOffset, TInt aMaxMaxBulk, TInt aMaxMaxInterrupt, TUsbTransferDescriptorDetails& aTransferDetails); +private: + RArray iRegisteredTransfers; + +private: + RUsbInterface* iInterfaceHandle; + RChunk iChunk; + TInt iBaseOffset; + TInt iPageSize; + }; + +#endif // ZEROCOPYTRANSFERSTRATEGY_H