kernel/eka/drivers/usbho/usbdi_utils/zerocopytransferstrategy.h
author hgs
Thu, 10 Jun 2010 11:48:01 +0100
changeset 149 d9f1e5bfe28c
permissions -rw-r--r--
201021_18
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
149
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
     2
// All rights reserved.
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
     7
//
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
     8
// Initial Contributors:
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    10
//
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    11
// Contributors:
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    12
//
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    13
// Description:
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    14
//
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    15
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    16
/**
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    17
 @file
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    18
 @internalComponent
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    19
*/
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    20
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    21
#ifndef ZEROCOPYTRANSFERSTRATEGY_H
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    22
#define ZEROCOPYTRANSFERSTRATEGY_H
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    23
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    24
#include "usbtransferstrategy.h"
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    25
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    26
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    27
NONSHARABLE_CLASS(RUsbZeroCopyTransferStrategy) : public RUsbTransferStrategy
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    28
	{
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    29
public:
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    30
	RUsbZeroCopyTransferStrategy();
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    31
	virtual TInt RegisterTransferDescriptor(RUsbTransferDescriptor& aTransferDesc, TInt aRequiredSize, TUint aStartAlignment, TInt aRequiredMaxPackets);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    32
	virtual void ResetTransferDescriptors();
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    33
	virtual TInt InitialiseTransferDescriptors(RUsbInterface& aInterface);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    34
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    35
	virtual void Close();
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    36
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    37
public: // Interrupt transfer descriptor methods
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    38
	virtual TPtr8	IntrWritableBuffer(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    39
	virtual void	IntrSaveData(TInt aHandle, TInt aLength);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    40
	virtual void	IntrSetZlpStatus(TInt aHandle, RUsbTransferDescriptor::TZlpStatus aZlpStatus);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    41
	virtual TPtrC8	IntrBuffer(TInt aHandle) const;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    42
public: // Bulk transfer descriptor methods
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    43
	virtual TPtr8	BulkWritableBuffer(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    44
	virtual void	BulkSaveData(TInt aHandle, TInt aLength);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    45
	virtual void	BulkSetZlpStatus(TInt aHandle, RUsbTransferDescriptor::TZlpStatus aZlpStatus);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    46
	virtual TPtrC8	BulkBuffer(TInt aHandle) const;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    47
public: // Isochronous transfer descriptor methods
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    48
	virtual void	IsocReset(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    49
	virtual TPacketLengths IsocLengths(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    50
	virtual TPacketResults IsocResults(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    51
	virtual TInt	IsocMaxPacketSize(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    52
	virtual TPtr8	IsocWritablePackets(TInt aHandle, TInt aWriteHandle, TInt aNumPacketsRequested, TInt& aMaxNumPacketsAbleToWrite);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    53
	virtual TInt	IsocSaveMultiple(TInt aHandle, TInt aWriteHandle, TInt aNumOfPackets);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    54
	virtual TPtrC8	IsocPackets(TInt aHandle, TInt aFirstPacketIndex, TInt aNumPacketsRequested, TInt& aNumPacketsReturned) const;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    55
	virtual void	IsocReceivePackets(TInt aHandle, TInt aNumOfPackets);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    56
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    57
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    58
private: // Standard (Bulk, Ctrl and Intr) Buffer methods
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    59
	TPtr8	WritableBuffer(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    60
	void	SaveData(TInt aHandle, TInt aLength);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    61
	void	SetZlpStatus(TInt aHandle, RUsbTransferDescriptor::TZlpStatus aZlpStatus);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    62
	TPtrC8	Buffer(TInt aHandle) const;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    63
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    64
private: // Isoc Buffer methods
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    65
	void	Reset(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    66
	TPacketLengths Lengths(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    67
	TPacketResults Results(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    68
	TInt	MaxPacketSize(TInt aHandle);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    69
	TPtr8	WritablePackets(TInt aHandle, TInt aWriteHandle, TInt aNumPacketsRequested, TInt& aMaxNumPacketsAbleToWrite);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    70
	TInt	SaveMultiple(TInt aHandle, TInt aWriteHandle, TInt aNumOfPackets);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    71
	TPtrC8	Packets(TInt aHandle, TInt aFirstPacketIndex, TInt aNumPacketsRequested, TInt& aNumPacketsReturned) const;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    72
	void	ReceivePackets(TInt aHandle, TInt aNumOfPackets);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    73
	
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    74
private:
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    75
	NONSHARABLE_STRUCT(TUsbTransferDescriptorDetails)
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    76
		{
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    77
        TUsbTransferDescriptorDetails(RUsbTransferDescriptor&, TInt, TUint, TInt);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    78
		RUsbTransferDescriptor& iTransferDesc;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    79
		const TInt iRequiredSize;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    80
		TUint iRequiredAlignment;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    81
		const TInt iRequiredMaxPackets;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    82
		// Members to aid internal logic
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    83
		TInt iAssignedOffset;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    84
		TInt iLengthsOffset; // Only applicable to isoc
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    85
		TInt iReqLenOffset; // Only applicable to isoc
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    86
		TInt iResultsOffset; // Only applicable to isoc
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    87
		TInt iNumElements; // Only applicable to isoc
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    88
		};
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    89
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    90
private:
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    91
	TInt CalculateDataLayout(TInt& aCurrentOffset, TInt& aNumStandardTransfers, TInt& aNumIsocTransfers, TInt& aNumIsocElements);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    92
	void CalculateMetaDataLayout(TInt& aCurrentOffset, TInt& aMetaDataStart, TInt aNumStandardTransfers, TInt aNumIsocTransfers, TInt aNumIsocElements);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    93
	void InitialiseMetaData(TInt aMetaDataOffset, TInt aNumStandardTransfers, TInt aNumIsocTransfers, TInt aNumIsocElements);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    94
	TInt UsedPackets(TInt aHeaderOffset);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    95
	TBool IsPowerOfTwo(TUint aNumber);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    96
	TInt IncNeededToAlign(TInt aOffset, TUint aAlignment);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    97
	static TBool CompareTransferDescriptor(const RUsbTransferDescriptor* aTransferDesc, const TUsbTransferDescriptorDetails& aDetails);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    98
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
    99
private: //Calculate additional alignment related methods
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   100
	TInt GetMaximumMaxPacketSize(TInt& aMaxMaxBulk, TInt& aMaxMaxInterrupt);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   101
	TInt CaculateAdditionalAlignment(TInt aCurrentOffset, TInt aMaxMaxBulk, TInt aMaxMaxInterrupt, TUsbTransferDescriptorDetails& aTransferDetails);
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   102
private:
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   103
	RArray<TUsbTransferDescriptorDetails> iRegisteredTransfers;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   104
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   105
private:
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   106
	RUsbInterface* iInterfaceHandle;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   107
	RChunk iChunk;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   108
	TInt iBaseOffset;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   109
	TInt iPageSize;
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   110
	};
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   111
d9f1e5bfe28c 201021_18
hgs
parents:
diff changeset
   112
#endif // ZEROCOPYTRANSFERSTRATEGY_H