usbdrv/peripheral/public/d32usbdescriptors.h
changeset 33 089413cdde3c
child 55 3b97f0de7605
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbdrv/peripheral/public/d32usbdescriptors.h	Fri Jul 23 15:54:47 2010 +0800
@@ -0,0 +1,548 @@
+// 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:
+//
+
+#ifndef D32USBDESCRIPTORS_H
+#define D32USBDESCRIPTORS_H
+
+#include <e32base.h>
+
+
+/*****************************************************************************/
+/*                                                                           */
+/* USB descriptors parser framework                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+class TUsbGenericDescriptor;
+
+/**
+The Symbian USB Descriptor Parsing Framework class.
+
+This class is to aid users of USBDI by providing the facilities to parse the
+raw descriptor data into wrapper classes that allow access to the fields in 
+the descriptor bodies, and pointers to map the serial data blob into the tree 
+structure that descriptors logically have.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(UsbDescriptorParser)
+	{
+public:
+	typedef TUsbGenericDescriptor* (*TUsbDescriptorParserL)(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+
+public:
+	// Main parse function.
+	IMPORT_C static TInt Parse(const TDesC8& aUsbDes, TUsbGenericDescriptor*& aDesc);
+
+	// Custom parsing framework.
+	IMPORT_C static void RegisterCustomParserL(TUsbDescriptorParserL aParserFunc);
+	IMPORT_C static void UnregisterCustomParser(TUsbDescriptorParserL aParserFunc);
+
+private:
+	static TUsbGenericDescriptor* FindParserAndParseAndCheckL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	static TUsbGenericDescriptor* FindParserAndParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	static void ParseDescriptorTreeL(TPtrC8& aUsbDes, TUsbGenericDescriptor& aPreviousDesc);
+	static void BuildTreeL(TUsbGenericDescriptor& aNewDesc, TUsbGenericDescriptor& aPreviousDesc);
+	static TUsbGenericDescriptor& FindSuitableParentL(TUsbGenericDescriptor& aNewDesc, TUsbGenericDescriptor& aTopParent);
+	static TUsbGenericDescriptor* UnknownUsbDescriptorParserL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	};
+
+
+/*****************************************************************************/
+/*                                                                           */
+/* USB standard descriptors                                                  */
+/*                                                                           */
+/*****************************************************************************/
+
+
+/**
+Base class for USB descriptors.
+All USB descriptors contain type and length, and may have peers and children.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+class TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbGenericDescriptor();
+	
+	IMPORT_C void DestroyTree();
+
+	IMPORT_C TUint8 TUint8At(TInt aOffset) const;
+	IMPORT_C TUint16 TUint16At(TInt aOffset) const;
+	IMPORT_C TUint32 TUint32At(TInt aOffset) const;
+
+	IMPORT_C TUsbGenericDescriptor& operator=(const TUsbGenericDescriptor& aDescriptor);
+
+	/**
+	Helper function to allow TUsbGenericDescriptor types to be placed on the cleanup stack.
+	*/
+	inline operator TCleanupItem() { return TCleanupItem(Cleanup,this); }
+
+public:
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	virtual TBool IsChild(TUsbGenericDescriptor& aPotentialChild);
+
+private:
+	IMPORT_C static void Cleanup(TAny* aPtr);
+	static void WalkAndDelete(TUsbGenericDescriptor* aDesc);
+
+public:		// USB standard fields
+	/**
+	The offset in a standard USB descriptor to the bLength field.
+	*/
+	static const TInt KbLengthOffset = 0;
+
+	/**
+	The offset in a standard USB descriptor to the bDescriptorType field.
+	*/
+	static const TInt KbDescriptorTypeOffset = 1;
+
+	/**
+	Standard Length field.
+	*/
+	TUint8	ibLength;
+	
+	/**
+	Standard Type field.
+	*/
+	TUint8	ibDescriptorType;
+	
+public:
+	/**
+	The flag to indicate whether the USB descriptor has been recognised
+	and parsed.
+	*/
+	enum TUsbGenericDescriptorFlags
+		{
+		EUnrecognised = 0x00,
+		ERecognised = 0x01,
+		};
+	
+public:		// Symbian generated fields
+	/**
+	Flag to show if the descriptor has been recognised and parsed, or if its data can only be represented as a
+	binary blob.  This field should particularly be checked if writing code which may run on older versions of
+	the operating system, where a (now) known descriptor may not have been parsed, or before parsing a new
+	descriptor from a blob, where later versions of the operating system may have already extracted the fields.
+	*/
+	TUint8	iRecognisedAndParsed;
+
+	/**
+	A pointer to the next peer of this descriptor, or NULL.
+	As an example, an endpoint descriptor will contain pointers to any other endpoint descriptors on the same
+	interface.
+	*/
+	TUsbGenericDescriptor* iNextPeer;
+
+	/**
+	A pointer to the first child of this descriptor, or NULL.
+	As an example, an interface descriptor will contain a pointer to the first endpoint descriptor on the
+	interface. The iNextPeer member can then be used to examine other endpoints on the interface.
+	*/
+	TUsbGenericDescriptor* iFirstChild;
+	
+	/**
+	A pointer to the parent to this descriptor, or NULL.
+	As an example an endpoint descriptor from a configuration bundle will have the interface that it
+	is a member of as it's parent.
+	*/
+	TUsbGenericDescriptor* iParent;
+
+	/**
+	The binary blob that contains this descriptor
+	*/
+	TPtrC8			iBlob;
+	};
+
+enum TUsbDescriptorType
+	{
+	EDevice						= 1,
+	EConfiguration				= 2,
+	EString						= 3,
+	EInterface					= 4,
+	EEndpoint					= 5,
+	EDeviceQualifier			= 6,
+	EOtherSpeedConfiguration	= 7,
+	EInterfacePower				= 8,
+	EOTG						= 9,
+	EDebug						= 10,
+	EInterfaceAssociation		= 11,
+	};
+
+/**
+Device descriptor.
+
+See section 9.6.1 of the USB 2.0 specification.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(TUsbDeviceDescriptor) : public TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbDeviceDescriptor();
+	IMPORT_C static TUsbDeviceDescriptor* Cast(TUsbGenericDescriptor* aOriginal);
+
+public:
+	static const TInt KSizeInOctets = 18;
+	enum TFieldOffsets
+		{
+		EbcdUSB				= 2,
+		EbDeviceClass		= 4,
+		EbDeviceSubClass	= 5,
+		EbDeviceProtocol	= 6,
+		EbMaxPacketSize0	= 7,
+		EidVendor			= 8,
+		EidProduct			= 10,
+		EbcdDevice			= 12,
+		EiManufacturer		= 14,
+		EiProduct			= 15,
+		EiSerialNumber		= 16,
+		EbNumConfigurations	= 17
+		};
+
+public:
+	IMPORT_C TUint16 USBBcd() const;
+	IMPORT_C TUint8 DeviceClass() const;
+	IMPORT_C TUint8 DeviceSubClass() const;
+	IMPORT_C TUint8 DeviceProtocol() const;
+	IMPORT_C TUint8 MaxPacketSize0() const;
+	IMPORT_C TUint16 VendorId() const;
+	IMPORT_C TUint16 ProductId() const;
+	IMPORT_C TUint16 DeviceBcd() const;
+	IMPORT_C TUint8 ManufacturerIndex() const;
+	IMPORT_C TUint8 ProductIndex() const;
+	IMPORT_C TUint8 SerialNumberIndex() const;
+	IMPORT_C TUint8 NumConfigurations() const;
+
+public:
+	static TUsbDeviceDescriptor* ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	};
+
+
+/**
+Device Qualifier descriptor.
+
+See section 9.6.2 of the USB 2.0 specification.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(TUsbDeviceQualifierDescriptor) : public TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbDeviceQualifierDescriptor();
+	IMPORT_C static TUsbDeviceQualifierDescriptor* Cast(TUsbGenericDescriptor* aOriginal);
+	
+public:
+	static const TInt KSizeInOctets = 10;
+	enum TFieldOffsets
+		{
+		EbcdUSB				= 2,
+		EbDeviceClass		= 4,
+		EbDeviceSubClass	= 5,
+		EbDeviceProtocol	= 6,
+		EbMaxPacketSize0	= 7,
+		EbNumConfigurations	= 8,
+		EbReserved			= 9
+		};
+
+public:
+	IMPORT_C TUint16 USBBcd() const;
+	IMPORT_C TUint8 DeviceClass() const;
+	IMPORT_C TUint8 DeviceSubClass() const;
+	IMPORT_C TUint8 DeviceProtocol() const;
+	IMPORT_C TUint8 MaxPacketSize0() const;
+	IMPORT_C TUint8 NumConfigurations() const;
+	IMPORT_C TUint8 Reserved() const;
+	
+public:
+	static TUsbDeviceQualifierDescriptor* ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	};
+
+
+/**
+Configuration descriptor.
+
+See section 9.6.3 of the USB 2.0 specification.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(TUsbConfigurationDescriptor) : public TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbConfigurationDescriptor();
+	IMPORT_C static TUsbConfigurationDescriptor* Cast(TUsbGenericDescriptor* aOriginal);
+
+public:
+	static const TInt KSizeInOctets = 9;
+	enum TFieldOffsets
+		{
+		EwTotalLength			= 2,
+		EbNumInterfaces			= 4,
+		EbConfigurationValue	= 5,
+		EiConfiguration			= 6,
+		EbmAttributes			= 7,
+		EbMaxPower				= 8
+		};
+
+public:
+	IMPORT_C TUint16 TotalLength() const;
+	IMPORT_C TUint8 NumInterfaces() const;
+	IMPORT_C TUint8 ConfigurationValue() const;
+	IMPORT_C TUint8 ConfigurationIndex() const;
+	IMPORT_C TUint8 Attributes() const;
+	IMPORT_C TUint8 MaxPower() const;
+
+public:
+	static TUsbConfigurationDescriptor* ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	};
+
+
+/**
+Other Speed descriptor.
+
+See section 9.6.4 of the USB 2.0 specification.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(TUsbOtherSpeedDescriptor) : public TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbOtherSpeedDescriptor();
+	IMPORT_C static TUsbOtherSpeedDescriptor* Cast(TUsbGenericDescriptor* aOriginal);
+
+public:
+	static const TInt KSizeInOctets = 9;
+	enum TFieldOffsets
+		{
+		EwTotalLength 			= 2,
+		EbNumInterfaces			= 4,
+		EbConfigurationValue	= 5,
+		EiConfiguration			= 6,
+		EbmAttributes			= 7,
+		EbMaxPower				= 8
+		};
+
+public:
+	IMPORT_C TUint16 TotalLength() const;
+	IMPORT_C TUint8 NumInterfaces() const;
+	IMPORT_C TUint8 ConfigurationValue() const;
+	IMPORT_C TUint8 ConfigurationIndex() const;
+	IMPORT_C TUint8 Attributes() const;
+	IMPORT_C TUint8 MaxPower() const;
+	
+public:
+	static TUsbOtherSpeedDescriptor* ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	};
+
+
+/**
+Interface Association Descriptor
+
+See the USB IAD ECN.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(TUsbInterfaceAssociationDescriptor) : public TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbInterfaceAssociationDescriptor();
+	IMPORT_C static TUsbInterfaceAssociationDescriptor* Cast(TUsbGenericDescriptor* aOriginal);
+
+public:
+	static const TInt KSizeInOctets = 8;
+	enum TFieldOffsets
+		{
+		EbFirstInterface	= 2,
+		EbInterfaceCount	= 3,
+		EbFunctionClass		= 4,
+		EbFunctionSubClass	= 5,
+		EbFunctionProtocol	= 6,
+		EiFunction			= 7
+		};
+	
+public:
+	IMPORT_C TUint8 FirstInterface() const;
+	IMPORT_C TUint8 InterfaceCount() const;
+	IMPORT_C TUint8 FunctionClass() const;
+	IMPORT_C TUint8 FunctionSubClass() const;
+	IMPORT_C TUint8 FunctionProtocol() const;
+	IMPORT_C TUint8 FunctionIndex() const;
+	
+public:
+	static TUsbInterfaceAssociationDescriptor* ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	virtual TBool IsChild(TUsbGenericDescriptor& aPotentialChild);
+	};
+
+/**
+Interface descriptor.
+
+See section 9.6.5 of the USB 2.0 specification.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(TUsbInterfaceDescriptor) : public TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbInterfaceDescriptor();
+	IMPORT_C static TUsbInterfaceDescriptor* Cast(TUsbGenericDescriptor* aOriginal);
+
+public:
+	static const TInt KSizeInOctets = 9;
+	enum TFieldOffsets
+		{
+		EbInterfaceNumber	= 2,
+		EbAlternateSetting	= 3,
+		EbNumEndpoints		= 4,
+		EbInterfaceClass	= 5,
+		EbInterfaceSubClass	= 6,
+		EbInterfaceProtocol	= 7,
+		EiInterface			= 8
+		};
+	
+public:
+	IMPORT_C TUint8 InterfaceNumber() const;
+	IMPORT_C TUint8 AlternateSetting() const;
+	IMPORT_C TUint8 NumEndpoints() const;
+	IMPORT_C TUint8 InterfaceClass() const;
+	IMPORT_C TUint8 InterfaceSubClass() const;
+	IMPORT_C TUint8 InterfaceProtocol() const;
+	IMPORT_C TUint8 Interface() const;
+	
+public:
+	static TUsbInterfaceDescriptor* ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	};
+
+/**
+Endpoint descriptor.
+
+See section 9.6.6 of the USB 2.0 specification.
+Note these exclude support support for:
+'Standard AC Interrupt Endpoint Descriptor'
+'Standard AS Isochronous Synch Endpoint Descriptor'
+'Standard AS Isochronous Audio Data Endpoint Descriptor'
+as defined in USB Audio Device Class Spec v1.0 which are all 9 bytes in size.
+To support these custom descriptors may be registered with the
+parser.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(TUsbEndpointDescriptor) : public TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbEndpointDescriptor();
+	IMPORT_C static TUsbEndpointDescriptor* Cast(TUsbGenericDescriptor* aOriginal);
+
+public:
+	static const TInt KSizeInOctets = 7;
+	enum TFieldOffsets
+		{
+		EbEndpointAddress	= 2,
+		EbmAttributes		= 3,
+		EwMaxPacketSize		= 4,
+		EbInterval			= 6
+		};
+
+public:
+	IMPORT_C TUint8 EndpointAddress() const;
+	IMPORT_C TUint8 Attributes() const;
+	IMPORT_C TUint16 MaxPacketSize() const;
+	IMPORT_C TUint8 Interval() const;
+	
+public:
+	static TUsbEndpointDescriptor* ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	};
+
+/**
+String descriptor
+
+See section 9.6.7 of the USB 2.0 specification.
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(TUsbStringDescriptor) : public TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbStringDescriptor();
+	IMPORT_C static TUsbStringDescriptor* Cast(TUsbGenericDescriptor* aOriginal);
+
+public:
+	IMPORT_C TInt GetLangId(TInt aIndex) const;
+	IMPORT_C void StringData(TDes16& aString) const;
+
+public:
+	static TUsbStringDescriptor* ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	};
+
+/**
+OTG descriptor.
+
+See section 6.4 of the USB 2.0 On-The-Go Supplement Revision 1.3
+
+@publishedPartner Intended to be available to 3rd parties later
+@prototype
+*/
+NONSHARABLE_CLASS(TUsbOTGDescriptor) : public TUsbGenericDescriptor
+	{
+public:
+	IMPORT_C TUsbOTGDescriptor();
+	IMPORT_C static TUsbOTGDescriptor* Cast(TUsbGenericDescriptor* aOriginal);
+
+public:
+	static const TInt KSizeInOctets = 3;
+	enum TFieldOffsets
+		{
+		EbmAttributes		= 2
+		};
+
+public:
+	IMPORT_C TUint8 Attributes() const;
+    IMPORT_C TBool HNPSupported() const;
+    IMPORT_C TBool SRPSupported() const;
+public:
+	static TUsbOTGDescriptor* ParseL(TPtrC8& aUsbDes, TUsbGenericDescriptor* aPreviousDesc);
+	virtual TBool IsParent(TUsbGenericDescriptor& aPotentialParent);
+	virtual TBool IsPeer(TUsbGenericDescriptor& aPotentialPeer);
+	};
+
+
+#endif	// D32USBDESCRIPTORS_H