--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/device/t_usb.h Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,293 @@
+// Copyright (c) 1997-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:
+// e32test\device\t_usb.h
+//
+//
+
+#ifndef __T_USB_H__
+#define __T_USB_H__
+
+#include <e32cons.h>
+#include <e32svr.h>
+#include <e32std.h>
+#include <f32file.h>
+
+#include <d32usbc.h>
+#include <d32otgdi.h>
+
+
+static const TInt KMaxBufSize = 1024 * 1024; // max data buffer size: 1MB
+static const TInt KPreambleLength = 8; // length of preamble data (bytes)
+
+
+enum TXferMode
+ {
+ ENone,
+ ELoop,
+ ELoopComp,
+ EReceiveOnly,
+ ETransmitOnly
+ };
+
+
+class CActiveRW;
+class CActiveStallNotifier;
+class CActiveDeviceStateNotifier;
+
+class CActiveConsole : public CActive
+ {
+public:
+ static CActiveConsole* NewLC(CConsoleBase* aConsole, TBool aVerboseOutput);
+ static CActiveConsole* NewL(CConsoleBase* aConsole, TBool aVerboseOutput);
+ void ConstructL();
+ ~CActiveConsole();
+ TInt SetupInterface();
+ void RequestCharacter();
+
+private:
+ CActiveConsole(CConsoleBase* aConsole, TBool aVerboseOutput);
+ // Defined as pure virtual by CActive;
+ // implementation provided by this class.
+ virtual void DoCancel();
+ // Defined as pure virtual by CActive;
+ // implementation provided by this class,
+ virtual void RunL();
+ void ProcessKeyPressL(TChar aChar);
+ TInt QueryUsbClientL();
+ void AllocateEndpointDMA(TEndpointNumber aEndpoint);
+ void AllocateDoubleBuffering(TEndpointNumber aEndpoint);
+ void DeAllocateEndpointDMA(TEndpointNumber aEndpoint);
+ void DeAllocateDoubleBuffering(TEndpointNumber aEndpoint);
+ void QueryEndpointState(TEndpointNumber aEndpoint);
+#ifdef WITH_DUMP_OPTION
+ void QueryRxBuffer();
+#endif
+ TInt SetupDescriptors();
+ TInt ReEnumerate();
+
+private:
+ CConsoleBase* iConsole; // a console to read from
+ CActiveRW* iRW; // the USB read/write active object
+ CActiveStallNotifier* iStallNotifier;
+ CActiveDeviceStateNotifier* iDeviceStateNotifier;
+ RDevUsbcClient iPort;
+ RUsbOtgDriver iOtgPort;
+ TBool iBufferSizeChosen;
+ TBool iBandwidthPriorityChosen;
+ TBool iDMAChosen;
+ TBool iDoubleBufferingChosen;
+ TUint32 iBandwidthPriority;
+ TBool iSoftwareConnect;
+ TBool iHighSpeed;
+ TBool iOtg;
+ TBool iVerbose;
+ };
+
+
+class CActiveTimer;
+
+class CActiveRW : public CActive
+ {
+public:
+ enum TXferType
+ {
+ ENone,
+ EPreamble,
+ EReadXfer,
+ EWriteXfer
+ };
+ static CActiveRW* NewL(CConsoleBase* aConsole, RDevUsbcClient* aPort, TBool aVerboseOutput);
+ ~CActiveRW();
+ TInt ExchangeVersions();
+ void SendPreamble();
+ void SendData();
+ void ReadData();
+ void Stop();
+ void SetMaxBufSize(TInt aBufSz);
+ void SetMaxPacketSize(TInt aPktSz);
+ TInt MaxBufSize() const;
+ void SetTransferMode(TXferMode aMode);
+ TInt WriteToDisk(TBool aEnable);
+ TInt ReadFromDisk(TBool aEnable);
+
+private:
+ CActiveRW(CConsoleBase* aConsole, RDevUsbcClient* aPort, TBool aVerboseOutput);
+ void ConstructL();
+ virtual void RunL();
+ virtual void DoCancel();
+ TInt SendVersion();
+ TInt ReceiveVersion();
+ TBool CompareBuffers(TInt aLen);
+ TInt SelectDrive();
+ void WriteBufferToDisk(TDes8& aBuffer, TInt aLen);
+ void ReadBufferFromDisk(TDes8& aBuffer, TInt aLen);
+
+private:
+ TBuf8<KPreambleLength> iPreambleBuf; // 2 bytes transfer length + stuffing
+ TBuf8<KMaxBufSize> iWriteBuf;
+ TBuf8<KMaxBufSize> iReadBuf;
+ CConsoleBase* iConsole;
+ RDevUsbcClient* iPort;
+ CActiveTimer* iTimeoutTimer;
+ TInt iBufSz;
+ TInt iMaxBufSz;
+ TInt iMaxPktSz;
+ TXferType iCurrentXfer;
+ TXferMode iXferMode;
+ TBool iDoStop;
+ TUint32 iPktNum;
+ TBool iVerbose;
+ TBool iDiskAccessEnabled;
+ RFs iFs;
+ RFile iFile;
+ TFileName iFileName;
+ TInt iFileOffset;
+ };
+
+
+class CActiveStallNotifier : public CActive
+ {
+public:
+ static CActiveStallNotifier* NewL(CConsoleBase* aConsole, RDevUsbcClient* aPort, TBool aVerboseOutput);
+ ~CActiveStallNotifier();
+ void Activate();
+
+private:
+ CActiveStallNotifier(CConsoleBase* aConsole, RDevUsbcClient* aPort, TBool aVerboseOutput);
+ void ConstructL();
+ virtual void DoCancel();
+ virtual void RunL();
+
+private:
+ CConsoleBase* iConsole;
+ RDevUsbcClient* iPort;
+ TUint iEndpointState;
+ TBool iVerbose;
+ };
+
+
+class CActiveDeviceStateNotifier : public CActive
+ {
+public:
+ static CActiveDeviceStateNotifier* NewL(CConsoleBase* aConsole, RDevUsbcClient* aPort, TBool aVerboseOutput);
+ ~CActiveDeviceStateNotifier();
+ void Activate();
+
+private:
+ CActiveDeviceStateNotifier(CConsoleBase* aConsole, RDevUsbcClient* aPort, TBool aVerboseOutput);
+ void ConstructL();
+ virtual void DoCancel();
+ virtual void RunL();
+
+private:
+ CConsoleBase* iConsole;
+ RDevUsbcClient* iPort;
+ TUint iDeviceState;
+ TBool iVerbose;
+ };
+
+
+class CActiveTimer : public CActive
+ {
+public:
+ static CActiveTimer* NewL(CConsoleBase* aConsole, RDevUsbcClient* aPort, TBool aVerboseOutput);
+ ~CActiveTimer();
+ void Activate(TTimeIntervalMicroSeconds32 aDelay);
+
+private:
+ CActiveTimer(CConsoleBase* aConsole, RDevUsbcClient* aPort, TBool aVerboseOutput);
+ void ConstructL();
+ virtual void DoCancel();
+ virtual void RunL();
+
+private:
+ CConsoleBase* iConsole;
+ RDevUsbcClient* iPort;
+ RTimer iTimer;
+ TBool iVerbose;
+ };
+
+
+//
+// Helpful Defines
+//
+
+#define TUSB_PRINT(string) \
+ do { \
+ iConsole->Printf(_L(string)); \
+ iConsole->Printf(_L("\n")); \
+ RDebug::Print(_L(string)); \
+ } while (0)
+
+#define TUSB_PRINT1(string, a) \
+ do { \
+ iConsole->Printf(_L(string), (a)); \
+ iConsole->Printf(_L("\n")); \
+ RDebug::Print(_L(string), (a)); \
+ } while (0)
+
+#define TUSB_PRINT2(string, a, b) \
+ do { \
+ iConsole->Printf(_L(string), (a), (b)); \
+ iConsole->Printf(_L("\n")); \
+ RDebug::Print(_L(string), (a), (b)); \
+ } while (0)
+
+#define TUSB_PRINT3(string, a, b, c) \
+ do { \
+ iConsole->Printf(_L(string), (a), (b), (c)); \
+ iConsole->Printf(_L("\n")); \
+ RDebug::Print(_L(string), (a), (b), (c)); \
+ } while (0)
+
+#define TUSB_PRINT5(string, a, b, c, d, e) \
+ do { \
+ iConsole->Printf(_L(string), (a), (b), (c), (d), (e)); \
+ iConsole->Printf(_L("\n")); \
+ RDebug::Print(_L(string), (a), (b), (c), (d), (e)); \
+ } while (0)
+
+#define TUSB_PRINT6(string, a, b, c, d, e, f) \
+ do { \
+ iConsole->Printf(_L(string), (a), (b), (c), (d), (e), (f)); \
+ iConsole->Printf(_L("\n")); \
+ RDebug::Print(_L(string), (a), (b), (c), (d), (e), (f)); \
+ } while (0)
+
+#define TUSB_VERBOSE_PRINT(string) \
+ do { \
+ if (iVerbose) \
+ { \
+ TUSB_PRINT(string); \
+ } \
+ } while (0)
+
+#define TUSB_VERBOSE_PRINT1(string, a) \
+ do { \
+ if (iVerbose) \
+ { \
+ TUSB_PRINT1(string, a); \
+ } \
+ } while (0)
+
+#define TUSB_VERBOSE_PRINT2(string, a, b) \
+ do { \
+ if (iVerbose) \
+ { \
+ TUSB_PRINT2(string, a, b); \
+ } \
+ } while (0)
+
+
+#endif // __T_USB_H__