diff -r 000000000000 -r a41df078684a kernel/eka/include/d32usbdi.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/d32usbdi.h Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,256 @@ +// Copyright (c) 2007-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: +// + +#ifndef D32USBDI_H +#define D32USBDI_H + +#ifdef __KERNEL_MODE__ +#include +#else +#include +#include +#endif +#include +#include + +/** +@file +@publishedPartner +@prototype +Intended to be available to 3rd parties later +*/ + + +class RUsbPipe; +class RUsbTransferDescriptor; +class RUsbTransferStrategy; + +typedef TUint32 TUsbBusId; +typedef void* TUsbBus; // handle for an os_bus + +/** +Functions which act on a specific interface on a remote device. +*/ +class RUsbInterface : public RBusLogicalChannel + { +public: + NONSHARABLE_CLASS(TUsbTransferRequestDetails) + { + public: + enum TEp0TransferFlags + { + EShortTransferOk = 0x04, + }; + + public: + TUint8 iRequestType; + TUint8 iRequest; + TUint16 iValue; + TUint16 iIndex; + TInt iFlags; + + // Internal: these should not be set or used, however making them private + // would require the internal DUsbChannel class be exposed as a friend in + // userside + const TDesC8* iSend; + TDes8* iRecv; + }; + + NONSHARABLE_CLASS(TChunkRequestDetails) + { + public: + // In + TInt iRequestSize; + //Out + TInt* iChunkHandle; + TInt* iOffset; + }; + + NONSHARABLE_CLASS(TTransferMemoryDetails) + { + public: + TInt iType; + TUint iAlignment; + TInt iSize; + TInt iMaxPackets; + }; + + enum TDeviceSpeed + { + ELowSpeed, + EFullSpeed, + EHighSpeed + }; + enum TUsbInterfaceRequest + { + ESuspend, + EEp0Transfer, + }; + enum TUsbInterfaceControl + { + EOpenPipe, + EPermitRemoteWakeup, + EGetInterfaceDescriptorSize, + EGetInterfaceDescriptor, + EGetStringDescriptor, + ESelectAlternateInterface, + EAllocChunk, + EGetDeviceSpeed, + EGetBusId, + EHcdPageSize, + EGetSizeAndAlignment, + }; + enum TUsbInterfaceCancel + { + ECancelSuspend = 0x00000001, + ECancelWaitForResume = 0x00000002, + ECancelEp0Transfer = 0x00000004 + }; + +public: + inline static const TDesC& Name(); + inline static TVersion VersionRequired(); + +#ifndef __KERNEL_MODE__ +friend class RUsbPipe; +friend class RUsbZeroCopyTransferStrategy; + +public: + inline RUsbInterface(); + + // + // Standard R-class lifetime controls + // + IMPORT_C TInt Open(TUint32 aToken, TOwnerType aType = EOwnerProcess); + IMPORT_C void Close(); + + // + // Transfer allocation/initialisation functions + // + IMPORT_C TInt RegisterTransferDescriptor(RUsbTransferDescriptor& aTransfer); + IMPORT_C void ResetTransferDescriptors(); + IMPORT_C TInt InitialiseTransferDescriptors(); + + // + // Endpoint Zero transfer utilities + // + inline void Ep0Transfer(TUsbTransferRequestDetails& aDetails, const TDesC8& aSend, TDes8& aRecv, TRequestStatus& aRequest); + inline void CancelEP0Transfer(); + inline TInt GetStringDescriptor(TDes8& aStringDescriptor, TUint8 aIndex, TUint16 aLangId); + + // + // Suspend/Resume functionality + // + inline void PermitSuspendAndWaitForResume(TRequestStatus& aResumeSignal); + inline void CancelPermitSuspend(); + inline void CancelWaitForResume(); + inline TInt PermitRemoteWakeup(TBool aPermitted); + + + // + // Descriptor access functions + // + inline TInt GetInterfaceDescriptor(TUsbInterfaceDescriptor& aDescriptor); + inline TInt GetAlternateInterfaceDescriptor(TInt aAlternateInterface, TUsbInterfaceDescriptor& aDescriptor); + inline TInt GetEndpointDescriptor(TInt aAlternateInterface, TInt aEndpoint, TUsbEndpointDescriptor& aDescriptor); + + // Utility functions to avoid having to parse the entire descriptor tree in simple cases. + inline TInt GetAlternateInterfaceCount(); + inline TInt EnumerateEndpointsOnInterface(TInt aAlternateInterface); + + // + // Interface configuration functions + // + inline TInt SelectAlternateInterface(TInt aAlternateInterface); + inline TInt OpenPipeForEndpoint(RUsbPipe& aPipe, TInt aEndpoint, TBool aUseDMA); + + // + // Some utility functions + // + inline TInt GetBusId(TUsbBusId& aBusId); + inline TInt HcdPageSize(); + inline TInt GetDeviceSpeed(TDeviceSpeed& aDeviceSpeed); + +private: + inline TInt AllocateSharedChunk(RChunk& aChunk, TInt aSize, TInt& aOffset); + TInt RegisterTransferDescriptor(RUsbTransferDescriptor& aTransfer, TUsbBusId aBusId); + inline TInt GetEndpointDescriptor(TInt aAlternateInterface, TInt aEndpoint, TUsbEndpointDescriptor*& aDescriptor); + +private: + TUsbInterfaceDescriptor* iHeadInterfaceDescriptor; + HBufC8* iInterfaceDescriptorData; + + RUsbTransferStrategy* iTransferStrategy; + + TInt iAlternateSetting; +#endif + }; + +typedef TUint64 TUsbEndpointId; + +/** +Functions which act on an individual pipe established between the local host and a remote device. +*/ +class RUsbPipe + { +public: + enum TUsbPipeRequest + { + EIssueTransfer = 0x4000000, // Start from a different value compared to interfaces + // to allow them to be distinguished while debugging + }; + enum TUsbPipeControl + { + EClose = 0x4000000, // Start from a different value compared to interfaces + // to allow them to be distinguished while debugging + EAbort, + EClearRemoteStall, + EGetEndpointId, + }; + +#ifndef __KERNEL_MODE__ +friend class RUsbInterface; +friend class RUsbTransferStrategy; +friend class RUsbZeroCopyTransferStrategy; +public: + inline RUsbPipe(); + + inline void Close(); + inline TUint32 Handle() const; + + inline TInt GetEndpointId(TUsbEndpointId& aEndpointId); + inline TInt GetBusId(TUsbBusId& aBusId); + + inline TInt GetEndpointDescriptor(TUsbEndpointDescriptor& aDescriptor); + + IMPORT_C void Transfer(RUsbTransferDescriptor& aTransfer, TRequestStatus& aRequest); + inline void CancelAllTransfers(); + + inline TInt ClearRemoteStall(); + +private: + inline void IssueTransfer(TInt aTransferHandle, TRequestStatus& aRequest); + +private: + TUint32 iHandle; + RUsbInterface* iInterface; + TUsbEndpointDescriptor* iHeadEndpointDescriptor; +#endif + }; + + +#include + +#endif // D32USBDI_H