kerneltest/e32utils/testusbcldd/inc/usbcdesc.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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__