--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32utils/testusbcldd/inc/dtestusblogdev.h Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,218 @@
+// 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_