author | mikek |
Sun, 27 Jun 2010 21:43:55 +0100 | |
branch | GCC_SURGE |
changeset 181 | bd8f1e65581b |
parent 0 | a41df078684a |
permissions | -rw-r--r-- |
// Copyright (c) 2004-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: // f32test\testusbcldd\inc\dtestusblogdev.h // Test USB logical channel classes. // // /** @file @internalTechnology */ #ifndef __DTESTUSBCLOGDEVICE_H_ #define __DTESTUSBCLOGDEVICE_H_ #include "kerndefs.h" #include "usbcdesc.h" const TInt KTestUsbcMajorVersion = 0; const TInt KTestUsbcMinorVersion = 1; const TInt KTestUsbcBuildVersion = 1; const TInt KTestUsbcMaxRequests = 10; /** The USB version we are compliant with (BCD) */ const TUint16 KUsbcUsbVersion = 0x0110; /** The Ep0 tx buffer area */ const TInt KUsbcBufSz_Ep0Tx = 1024; /** Size of buffer for transferring data from client and host */ const TInt KTransferBufSize = 1024; /** Must correspond to the max enum of TRequest + 1; currently this is ERequestEndpointStatusNotify = 9 */ const TInt KUsbcMaxRequests = 10; /** Maximum number of endpoints an Interface may have */ const TInt KUsbcMaxEpNumber = 5; /** Size of endpoint buffers */ const TInt KEndpointBufferSize = 16 * 1024; class DTestUsbcEndpoint; class DTestUsbcLogDevice : public DLogicalDevice { public: DTestUsbcLogDevice(); ~DTestUsbcLogDevice(); TInt Install(); void GetCaps(TDes8& aDes) const; TInt Create(DLogicalChannelBase*& aChannel); DLogicalChannel* CreateL(); private: RPointerArray<DTestUsbcEndpoint> iEndpoints; }; class TUsbcInterfaceSet; class TUsbcLogicalEndpoint; /** This is one 'Alternate Setting' of an interface. */ class TUsbcInterface { public: TUsbcInterface(TUsbcInterfaceSet* aIfcSet, TUint8 aSetting); ~TUsbcInterface(); public: /** Array of endpoints making up (belonging to) this setting. */ RPointerArray<TUsbcLogicalEndpoint> iEndpoints; /** 'Back' pointer. */ TUsbcInterfaceSet* const iInterfaceSet; /** bAlternateSetting (zero-based). */ const TUint8 iSettingCode; }; /** This is an 'Interface' (owning 1 or more alternate settings TUsbcInterface). */ class TUsbcInterfaceSet { public: TUsbcInterfaceSet(const DBase* aClientId, TUint8 aIfcNum); ~TUsbcInterfaceSet(); const TUsbcInterface* CurrentInterface() const; TUsbcInterface* CurrentInterface(); public: /** Array of alternate settings provided by (belonging to) this interface. */ RPointerArray<TUsbcInterface> iInterfaces; /** Pointer to the LDD which created and owns this interface. */ const DBase* const iClientId; /** bInterfaceNumber (zero-based). */ TUint8 iInterfaceNumber; /** bAlternateSetting (zero-based). */ TUint8 iCurrentInterface; }; /** This is a logical 'Endpoint', as used by our device configuration model. */ class TUsbcLogicalEndpoint { public: TUsbcLogicalEndpoint(TUint aEndpointNum, const TUsbcEndpointInfo& aInfo, TUsbcInterface* aInterface); ~TUsbcLogicalEndpoint(); public: /** The virtual (logical) endpoint number. */ const TInt iLEndpointNum; /** This endpoint's info structure. */ TUsbcEndpointInfo iInfo; /** 'Back' pointer. */ const TUsbcInterface* iInterface; }; class DLddTestUsbcChannel : public DLogicalChannel { public: DLddTestUsbcChannel(RPointerArray<DTestUsbcEndpoint>& aEndpoints); void HandleMsg(TMessageBase* aMsg); TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); ~DLddTestUsbcChannel(); private: TInt DoCancel(TInt aReqNo); void DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2); TInt DoControl(TInt aFunction, TAny* a1, TAny* a2); TBool ValidateEndpoint(TUsbcEndpointInfo* aEndpointInfo); TInt SetInterface(TInt aInterfaceNumber, TUsbcInterfaceInfoBuf *aUserInterfaceInfoBuf, TPtr8* aInterfaceString); TInt SetInterface(TInt aInterfaceNumber, TUsbcClassInfo& aClass, TDesC8* aString, TInt aTotalEndpointsUsed, const TUsbcEndpointInfo aEndpointData[]); TUsbcInterface* CreateInterface(TInt aIfc); void DeleteInterface(TInt aIfc); void DeleteInterfaceSet(); TInt CreateEndpoints(TUsbcInterface* aIfc, TInt aEndpointsUsed, const TUsbcEndpointInfo aEndpointData[]); TInt SetupIfcDescriptor(TUsbcInterface* aIfc, TUsbcClassInfo& aClass, TDesC8* aString, const TUsbcEndpointInfo aEndpointData[]); TInt ReleaseInterface(TInt aInterfaceNumber); TInt HostEndpointStatusNotify(TInt aEndpointNumber, TRequestStatus* aStatus); TInt EndpointStatusNotify(TUint* aEndpointMask, TRequestStatus* aStatus); void EndpointStatusNotifyCallback(); TInt ClearEndpoint(TInt aEndpointNumber); TInt DoTransferAsyncReq(TInt aEndpointNumber, TAny* a1, TAny* a2, TRequestStatus& aStatus); TBool ValidEndpoint(TInt aEndpointNumber); TInt FindRealEndpoint(TInt aEndpointNumber); TInt HaltClearEndpoint(TBool aHalt, TInt aEndpointNumber); void AlternateDeviceStatusNotify(); TInt SetAlternateDeviceStatusNotify(TRequestStatus* aStatus, TUint* aValue); void CancelAlternateDeviceStatusNotify(); TInt ReEnumerate(TRequestStatus* aStatus); void SetDeviceState(TUsbcDeviceState aState); private: DThread* iClient; TUsbcDescriptorPool iDescriptors; TUsbcInterfaceSet iIfcSet; RPointerArray<DTestUsbcEndpoint>& iEndpoints; TUint* iEndpointStatusMask; TRequestStatus* iEndpointStatusNotifyRequest; TRequestStatus* iAlternateDeviceStatusNotifyRequest; TUint* iAlternateDeviceStatusNotifyValue; TUsbcDeviceState iDeviceState; public: static const TUsbcEndpointData iEndpointData[]; friend class DTestUsbcEndpoint; }; class DTestUsbcEndpoint : public DBase { public: DTestUsbcEndpoint(); ~DTestUsbcEndpoint(); TInt Create(const TUsbcEndpointCaps& aCaps); TInt TryToComplete(); TInt CopyData(TInt aSrcOffset, DThread* aDestClient, TDesC8* aDest, TInt aDestOffset, TInt aLen); TBool SupportsDir(TUint aDir); TBool EndpointSuitable(const TUsbcEndpointInfo& aInfo); void DoCancel(); TInt Halt(); TInt Clear(); TBool IsHalted(); void SetClearCallback(DLddTestUsbcChannel* aCallback); TInt HostStatusNotify(DThread* aHost, TRequestStatus* aStatus); TInt NewRequest(DThread* aClient, TRequestStatus* aStatus, TEndpointTransferInfo& aInfo, TTransferType aType); TInt NewHostRequest(DThread* aHost, TRequestStatus* aStatus, TEndpointTransferInfo& aInfo, TTransferType aType); private: TRequestStatus* iClientStatus; TRequestStatus* iHostStatus; TRequestStatus* iHostNotifyStatus; DThread* iClient; DThread* iHost; DThread* iNotifyHost; TUsbcEndpointCaps iCaps; TBool iRequestPending; TBool iHostRequestPending; TEndpointTransferInfo iClientTransferInfo; TEndpointTransferInfo iHostTransferInfo; TInt iDataTransferred; TInt iHostDataTransferred; TTransferType iRequestType; TTransferType iHostRequestType; HBuf8Plat* iBuffer; TBool iHalted; DLddTestUsbcChannel* iClearCallback; public: TBool iReserve; }; #endif // __DTESTUSBCLOGDEVICE_H_