diff -r 000000000000 -r bde4ae8d615e os/kernelhwsrv/kerneltest/e32utils/testusbcldd/inc/usbcdesc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/kernelhwsrv/kerneltest/e32utils/testusbcldd/inc/usbcdesc.h Fri Jun 15 03:10:57 2012 +0200 @@ -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 + +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 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 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 iBuf; + }; + + +class TUsbcEndpointDescriptor : public TUsbcDescriptorBase + { +public: + static TUsbcEndpointDescriptor* New(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo); +private: + TUsbcEndpointDescriptor(); + TInt Construct(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo); + TBuf8 iBuf; + }; + + +class TUsbcAudioEndpointDescriptor : public TUsbcDescriptorBase + { +public: + static TUsbcAudioEndpointDescriptor* New(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo); +private: + TUsbcAudioEndpointDescriptor(); + TInt Construct(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo); + TBuf8 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 iDescriptors; + RPointerArray iStrings; + TInt iIfcIdx; + TUint8* const iEp0_TxBuf; // points to the controller's Ep0 Tx buffer + }; + + +#endif // __USBCDESC_H__