kernel/eka/drivers/usbho/usbdi_utils/zerocopymetadata.h
changeset 102 ef2a444a7410
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/drivers/usbho/usbdi_utils/zerocopymetadata.h	Mon May 03 13:47:38 2010 +0300
@@ -0,0 +1,152 @@
+// 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.
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef ZEROCOPYMETADATA_H
+#define ZEROCOPYMETADATA_H
+
+#include <e32def.h>
+
+// The type used to represent an address various betwen user and kernel
+// mode.  To aid us we use a macro to produce only one definition.
+#ifndef __KERNEL_MODE__
+#define TAddrType TUint8*
+#else // __KERNEL_MODE__
+#define TAddrType TLinAddr
+#endif // __KERNEL_MODE__
+
+
+NONSHARABLE_CLASS(UsbZeroCopyChunkHeaderBase)
+	{
+public:
+	static inline RUsbTransferDescriptor::TTransferType& TransferType(TAddrType aBase, TInt aHeaderOffset);
+protected:
+	enum THeaderBaseSizes
+		{
+		ETransferTypeSize = sizeof(RUsbTransferDescriptor::TTransferType)
+		};
+	enum THeaderBaseLayout
+		{
+		ETransferType	= 0,
+		// End of fields
+		EHeaderBaseSize	= ETransferType + ETransferTypeSize
+		};
+	};
+
+
+NONSHARABLE_CLASS(UsbZeroCopyBulkIntrChunkHeader) : public UsbZeroCopyChunkHeaderBase
+	{
+public:
+	static inline TInt HeaderSize();
+	
+	static inline TInt& DataOffset(TAddrType aBase, TInt aHeaderOffset);
+	static inline TInt& DataLength(TAddrType aBase, TInt aHeaderOffset);
+	static inline TInt& DataMaxLength(TAddrType aBase, TInt aHeaderOffset);
+	static inline RUsbTransferDescriptor::TZlpStatus& ZlpStatus(TAddrType aBase, TInt aHeaderOffset);
+private:
+	enum THeaderSizes
+		{
+		EDataOffsetSize		= sizeof(TInt),
+		EDataLengthSize		= sizeof(TInt),
+		EDataMaxLengthSize	= sizeof(TInt),
+		EZlpStatusSize		= sizeof(RUsbTransferDescriptor::TZlpStatus)
+		};
+	enum THeaderLayout
+		{
+		EDataOffset		= EHeaderBaseSize,
+		EDataLength		= EDataOffset + EDataOffsetSize,
+		EDataMaxLength	= EDataLength + EDataLengthSize,
+		EZlpStatus		= EDataMaxLength + EDataMaxLengthSize,
+		// End of fields
+		EHeaderSize		= EZlpStatus + EZlpStatusSize
+		};
+	};
+
+
+NONSHARABLE_CLASS(UsbZeroCopyIsocChunkHeader) : public UsbZeroCopyChunkHeaderBase
+	{
+public: // Lengths Array constants
+	static const TInt KLengthsElementSize = sizeof(TUint16);
+	static const TInt KResultsElementSize = sizeof(TInt);
+public:
+	static inline TInt HeaderSize();
+	
+	static inline TInt& FirstElementOffset(TAddrType aBase, TInt aHeaderOffset);
+	static inline TInt& MaxNumPackets(TAddrType aBase, TInt aHeaderOffset);
+	static inline TInt& MaxPacketSize(TAddrType aBase, TInt aHeaderOffset);
+	static inline TInt& LengthsOffset(TAddrType aBase, TInt aHeaderOffset);
+	static inline TInt& ReqLenOffset(TAddrType aBase, TInt aHeaderOffset);
+	static inline TInt& ResultsOffset(TAddrType aBase, TInt aHeaderOffset);
+private:
+	enum THeaderSizes
+		{
+		EFirstElementOffsetSize	= sizeof(TInt),
+		EMaxNumPacketsSize		= sizeof(TInt),
+		EMaxPacketSizeSize		= sizeof(TInt),
+		ELengthsOffsetSize		= sizeof(TInt),
+		EReqLenOffsetSize		= sizeof(TInt),
+		EResultsOffsetSize		= sizeof(TInt)
+		};
+	enum THeaderLayout
+		{
+		EFirstElementOffset	= EHeaderBaseSize,
+		EMaxNumPackets		= EFirstElementOffset + EFirstElementOffsetSize,
+		EMaxPacketSize		= EMaxNumPackets + EMaxNumPacketsSize,
+		ELengthsOffset		= EMaxPacketSize + EMaxPacketSizeSize,
+		EReqLenOffset		= ELengthsOffset + ELengthsOffsetSize,
+		EResultsOffset		= EReqLenOffset + EReqLenOffsetSize,
+		// End of fields
+		EHeaderSize			= EResultsOffset + EResultsOffsetSize
+		};
+	};
+
+
+NONSHARABLE_CLASS(UsbZeroCopyIsocChunkElement)
+	{
+public: 
+	// NumOfPackets constants
+	static const TInt KInvalidElement = -1;
+	// NextElementOffset constants
+	static const TInt KEndOfList = -1;
+public:
+	static inline TInt ElementSize();
+	
+	static inline TInt& DataOffset(TAddrType aBase, TInt aHeaderOffset);
+	static inline TInt& NumPackets(TAddrType aBase, TInt aHeaderOffset);
+	static inline TInt& NextElementOffset(TAddrType aBase, TInt aHeaderOffset);
+private:
+	enum THeaderSizes
+		{
+		EDataOffsetSize			= sizeof(TInt),
+		ENumPacketsSize			= sizeof(TInt),
+		ENextElementOffsetSize	= sizeof(TInt),
+		};
+	enum THeaderLayout
+		{
+		EDataOffset			= 0,
+		ENumPackets			= EDataOffset + EDataOffsetSize,
+		ENextElementOffset	= ENumPackets + ENumPacketsSize,
+		// End of fields
+		EElementSize		= ENextElementOffset + ENextElementOffsetSize
+		};
+	};
+
+#include "zerocopymetadata.inl"
+
+#undef TAddrType // Prevent the macro from leaking outside this header
+
+#endif // ZEROCOPYMETADATA_H