kerneltest/e32utils/testusbcldd/inc/usbcdesc.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32utils/testusbcldd/inc/usbcdesc.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,249 @@
+// Copyright (c) 2002-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:
+// e32\include\drivers\usbcdesc.h
+// USB descriptors and their management.
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#if !defined(__USBCDESC_H__)
+#define __USBCDESC_H__
+
+#include "kerndefs.h"
+#include <d32usbc.h>
+
+class TUsbcDescriptorBase
+	{
+public:
+	virtual ~TUsbcDescriptorBase();
+	void SetByte(TUint aPosition, TUint8 aValue);
+	void SetWord(TUint aPosition, TUint16 aValue);
+	TUint8 Byte(TUint aPosition) const;
+	TUint16 Word(TUint aPosition) const;
+	void GetDescriptorData(TDes8& aBuffer) const;
+	TInt GetDescriptorData(TUint8* aBuffer) const;
+	TInt GetDescriptorData(TUint8* aBuffer, TInt aMaxSize) const;
+	const TDes8& DescriptorData() const;
+	TDes8& DescriptorData();
+	TInt Size() const;
+	TUint8 Type() const;
+protected:
+	TUsbcDescriptorBase();
+	void SetBufferPointer(const TDesC8& aDes);
+private:
+#ifdef USB_SUPPORTS_SET_DESCRIPTOR_REQUEST
+	TUint8 iIndex;											// only needed for SET_DESCRIPTOR
+#endif
+	TPtr8 iBufPtr;
+	};
+
+
+class TUsbcDeviceDescriptor : public TUsbcDescriptorBase
+	{
+public:
+	static TUsbcDeviceDescriptor* New(TUint8 aDeviceClass, TUint8 aDeviceSubClass,
+									  TUint8 aDeviceProtocol, TUint8 aMaxPacketSize0,
+									  TUint16 aVendorId, TUint16 aProductId,
+									  TUint16 aDeviceRelease, TUint8 aNumConfigurations);
+private:
+	TUsbcDeviceDescriptor();
+	TInt Construct(TUint8 aDeviceClass, TUint8 aDeviceSubClass, TUint8 aDeviceProtocol,
+				   TUint8 aMaxPacketSize0, TUint16 aVendorId, TUint16 aProductId,
+				   TUint16 aDeviceRelease, TUint8 aNumConfigurations);
+	TBuf8<KUsbDescSize_Device> iBuf;
+	};
+
+
+class TUsbcConfigDescriptor : public TUsbcDescriptorBase
+	{
+public:
+	static TUsbcConfigDescriptor* New(TUint8 aConfigurationValue, TBool aSelfPowered, TBool aRemoteWakeup,
+									  TUint8 aMaxPower);	// give MaxPower in milliamps!
+private:
+	TUsbcConfigDescriptor();
+	TInt Construct(TUint8 aConfigurationValue, TBool aSelfPowered, TBool aRemoteWakeup, TUint8 aMaxPower);
+	TBuf8<KUsbDescSize_Config> iBuf;
+	};
+
+
+class TUsbcInterfaceDescriptor : public TUsbcDescriptorBase
+	{
+public:
+	static TUsbcInterfaceDescriptor* New(TUint8 aInterfaceNumber, TUint8 aAlternateSetting, TInt NumEndpoints,
+										 const TUsbcClassInfo& aClassInfo);
+private:
+	TUsbcInterfaceDescriptor();
+	TInt Construct(TUint8 aInterfaceNumber, TUint8 aAlternateSetting, TInt aNumEndpoints,
+				   const TUsbcClassInfo& aClassInfo);
+	TBuf8<KUsbDescSize_Interface> iBuf;
+	};
+
+
+class TUsbcEndpointDescriptor : public TUsbcDescriptorBase
+	{
+public:
+	static TUsbcEndpointDescriptor* New(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo);
+private:
+	TUsbcEndpointDescriptor();
+	TInt Construct(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo);
+	TBuf8<KUsbDescSize_Endpoint> iBuf;
+	};
+
+
+class TUsbcAudioEndpointDescriptor : public TUsbcDescriptorBase
+	{
+public:
+	static TUsbcAudioEndpointDescriptor* New(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo);
+private:
+	TUsbcAudioEndpointDescriptor();
+	TInt Construct(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo);
+	TBuf8<KUsbDescSize_AudioEndpoint> iBuf;
+	};
+
+
+class TUsbcClassSpecificDescriptor : public TUsbcDescriptorBase
+	{
+public:
+	virtual ~TUsbcClassSpecificDescriptor();
+	static TUsbcClassSpecificDescriptor* New(TUint8 aType, TInt aSize);
+private:
+	TUsbcClassSpecificDescriptor();
+	TInt Construct(TUint8 aType, TInt aSize);
+	HBuf8Plat* iBuf;
+	};
+
+
+class TUsbcStringDescriptorBase
+	{
+public:
+	virtual ~TUsbcStringDescriptorBase();
+	TUint16 Word(TUint aPosition) const;
+	TInt GetDescriptorData(TUint8* aBuffer) const;
+	TInt GetDescriptorData(TUint8* aBuffer, TInt aMaxSize) const;
+	const TDes8& StringData() const;
+	TDes8& StringData();
+	TInt Size() const;
+	void SetBufferPointer(const TDesC8& aDes);
+protected:
+	TUsbcStringDescriptorBase();
+	TBuf8<2> iSBuf;
+	TPtr8 iBufPtr;
+private:
+//	TUint8 iIndex;											// not needed in DescriptorPool: position == index
+	};
+
+
+class TUsbcStringDescriptor : public TUsbcStringDescriptorBase
+	{
+public:
+	virtual ~TUsbcStringDescriptor();
+	static TUsbcStringDescriptor* New(const TDesC8& aString);
+private:
+	TUsbcStringDescriptor();								// use static New
+	TInt Construct(const TDesC8& aString);
+	HBuf8Plat* iBuf;
+	};
+
+
+// Currently we support only one language, and thus there's no need to provide
+// a LangId string descriptor with more than one array element.
+class TUsbcLangIdDescriptor : public TUsbcStringDescriptorBase
+	{
+public:
+	virtual ~TUsbcLangIdDescriptor();
+	static TUsbcLangIdDescriptor* New(TUint16 aLangId);
+private:
+	TUsbcLangIdDescriptor();								// use static New
+	TInt Construct(TUint16 aLangId);
+	TBuf8<2> iBuf;
+	};
+
+
+class TUsbcDescriptorPool
+	{
+public:
+	TUsbcDescriptorPool(TUint8* aEp0_TxBuf);
+	~TUsbcDescriptorPool();
+	TInt Init(TUsbcDeviceDescriptor* aDeviceDesc, TUsbcConfigDescriptor* aConfigDesc,
+			  TUsbcLangIdDescriptor* aLangId, TUsbcStringDescriptor* aManufacturer,
+			  TUsbcStringDescriptor* aProduct, TUsbcStringDescriptor* aSerialNum,
+			  TUsbcStringDescriptor* aConfig);
+	// Descriptors
+	TInt FindDescriptor(TUint8 aType, TUint8 aIndex, TUint16 aLangid, TInt& aSize) const;
+	void InsertDescriptor(TUsbcDescriptorBase* aDesc);
+	void DeleteIfcDescriptor(TInt aNumber, TInt aSetting = 0);
+
+	// The TC in many of the following functions stands for 'ThreadCopy' because that's what happens there.
+	TInt GetDeviceDescriptorTC(DThread* aThread, TDes8& aBuffer) const;
+	TInt SetDeviceDescriptorTC(DThread* aThread, const TDes8& aBuffer);
+	TInt GetConfigurationDescriptorTC(DThread* aThread, TDes8& aBuffer) const;
+	TInt SetConfigurationDescriptorTC(DThread* aThread, const TDes8& aBuffer);
+	TInt GetInterfaceDescriptorTC(DThread* aThread, TDes8& aBuffer, TInt aInterface, TInt aSetting) const;
+	TInt SetInterfaceDescriptor(const TDes8& aBuffer, TInt aInterface, TInt aSetting);
+	TInt GetEndpointDescriptorTC(DThread* aThread, TDes8& aBuffer, TInt aInterface, TInt aSetting,
+								 TUint8 aEndpointAddress) const;
+	TInt SetEndpointDescriptorTC(DThread* aThread, const TDes8& aBuffer, TInt aInterface, TInt aSetting,
+								 TUint8 aEndpointAddress);
+	TInt GetEndpointDescriptorSize(TInt aInterface, TInt aSetting, TUint8 aEndpointAddress, TInt& aSize) const;
+	TInt GetCSInterfaceDescriptorTC(DThread* aThread, TDes8& aBuffer, TInt aInterface, TInt aSetting) const;
+	TInt SetCSInterfaceDescriptorTC(DThread* aThread, const TDes8& aBuffer, TInt aInterface, TInt aSetting,
+									TInt aSize);
+	TInt GetCSInterfaceDescriptorSize(TInt aInterface, TInt aSetting, TInt& aSize) const;
+	TInt GetCSEndpointDescriptorTC(DThread* aThread, TDes8& aBuffer, TInt aInterface, TInt aSetting,
+								   TUint8 aEndpointAddress) const;
+	TInt SetCSEndpointDescriptorTC(DThread* aThread, const TDes8& aBuffer, TInt aInterface, TInt aSetting,
+								   TUint8 aEndpointAddress, TInt aSize);
+	TInt GetCSEndpointDescriptorSize(TInt aInterface, TInt aSetting, TUint8 aEndpointAddress, TInt& aSize) const;
+
+	// String descriptors
+	void SetIfcStringDescriptor(TUsbcStringDescriptor* aDesc, TInt aNumber, TInt aSetting = 0);
+	TInt GetManufacturerStringDescriptorTC(DThread* aThread, TDes8& aString) const;
+	TInt SetManufacturerStringDescriptorTC(DThread* aThread, const TDes8& aString);
+	TInt GetProductStringDescriptorTC(DThread* aThread, TDes8& aString) const;
+	TInt SetProductStringDescriptorTC(DThread* aThread, const TDes8& aString);
+	TInt GetSerialNumberStringDescriptorTC(DThread* aThread, TDes8& aString) const;
+	TInt SetSerialNumberStringDescriptorTC(DThread* aThread, const TDes8& aString);
+	TInt GetConfigurationStringDescriptorTC(DThread* aThread, TDes8& aString) const;
+	TInt SetConfigurationStringDescriptorTC(DThread* aThread, const TDes8& aString);
+private:
+	void InsertDevDesc(TUsbcDescriptorBase* aDesc);
+	void InsertConfigDesc(TUsbcDescriptorBase* aDesc);
+	void InsertIfcDesc(TUsbcDescriptorBase* aDesc);
+	void InsertEpDesc(TUsbcDescriptorBase* aDesc);
+	TInt FindIfcDescriptor(TInt aIfcNumber, TInt aIfcSetting) const;
+	TInt FindEpDescriptor(TInt aIfcNumber, TInt aIfcSetting, TUint8 aEpAddress) const;
+	void DeleteDescriptors(TInt aIndex, TInt aCount = 1);
+	void DeleteString(TInt aIndex);
+	void UpdateIfcNumbers(TInt aNumber);
+	void UpdateIfcStringIndexes(TInt aStringIndex);
+	TInt GetDeviceDescriptor() const;
+	TInt GetConfigDescriptor() const;
+	TInt GetStringDescriptor(TInt aIndex) const;
+	TInt GetDeviceStringDescriptorTC(DThread* aThread, TDes8& aString, TInt aIndex) const;
+	TInt SetDeviceStringDescriptorTC(DThread* aThread, const TDes8& aString, TInt aIndex);
+	TInt ExchangeStringDescriptor(TInt aIndex, const TUsbcStringDescriptor* aDesc);
+private:
+	// Data members
+	RPointerArray<TUsbcDescriptorBase> iDescriptors;
+	RPointerArray<TUsbcStringDescriptorBase> iStrings;
+	TInt iIfcIdx;
+	TUint8* const iEp0_TxBuf;								// points to the controller's Ep0 Tx buffer
+	};
+
+
+#endif	// __USBCDESC_H__