os/kernelhwsrv/kernel/eka/include/d32usbdi.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #ifndef D32USBDI_H
    17 #define D32USBDI_H
    18 
    19 #ifdef __KERNEL_MODE__
    20 #include <kernel/klib.h>
    21 #else
    22 #include <e32base.h>
    23 #include <d32usbdescriptors.h>
    24 #endif
    25 #include <e32ver.h>
    26 #include <d32usbdi_errors.h>
    27 
    28 /**
    29 @file
    30 @publishedPartner
    31 @prototype
    32 Intended to be available to 3rd parties later
    33 */
    34 
    35 
    36 class RUsbPipe;
    37 class RUsbTransferDescriptor;
    38 class RUsbTransferStrategy;
    39 
    40 typedef TUint32 TUsbBusId;
    41 typedef void* TUsbBus; // handle for an os_bus
    42 
    43 /**
    44 Functions which act on a specific interface on a remote device.
    45 */
    46 class RUsbInterface : public RBusLogicalChannel
    47 	{
    48 public:
    49 	NONSHARABLE_CLASS(TUsbTransferRequestDetails)
    50 		{
    51 	public:
    52 		enum TEp0TransferFlags
    53 			{
    54 			EShortTransferOk	= 0x04,
    55 			};
    56 
    57 	public:
    58 		TUint8			iRequestType;
    59 		TUint8			iRequest;
    60 		TUint16			iValue;
    61 		TUint16			iIndex;
    62 		TInt			iFlags;
    63 
    64         // Internal: these should not be set or used, however making them private
    65         // would require the internal DUsbChannel class be exposed as a friend in
    66         // userside
    67 		const TDesC8*	iSend;
    68 		TDes8*			iRecv;
    69 		};
    70 
    71 	NONSHARABLE_CLASS(TChunkRequestDetails)
    72 		{
    73 	public:
    74 		// In
    75 		TInt iRequestSize;
    76 		//Out
    77 		TInt* iChunkHandle;
    78 		TInt* iOffset;
    79 		};
    80 
    81 	NONSHARABLE_CLASS(TTransferMemoryDetails)
    82 		{
    83 	public:
    84 		TInt	iType;
    85 		TUint	iAlignment;
    86 		TInt	iSize;
    87 		TInt	iMaxPackets;
    88 		};
    89 
    90 	enum TDeviceSpeed
    91 		{
    92 		ELowSpeed,
    93 		EFullSpeed,
    94 		EHighSpeed
    95 		};
    96 	enum TUsbInterfaceRequest
    97 		{
    98 		ESuspend,
    99 		EEp0Transfer,
   100 		};
   101 	enum TUsbInterfaceControl
   102 		{
   103 		EOpenPipe,
   104 		EPermitRemoteWakeup,
   105 		EGetInterfaceDescriptorSize,
   106 		EGetInterfaceDescriptor,
   107 		EGetStringDescriptor,
   108 		ESelectAlternateInterface,
   109 		EAllocChunk,
   110 		EGetDeviceSpeed,
   111 		EGetBusId,
   112 		EHcdPageSize,
   113 		EGetSizeAndAlignment,
   114 		};
   115 	enum TUsbInterfaceCancel
   116 		{
   117 		ECancelSuspend			= 0x00000001,
   118 		ECancelWaitForResume    = 0x00000002,
   119 		ECancelEp0Transfer		= 0x00000004
   120 		};
   121 
   122 public:
   123 	inline static const TDesC& Name();
   124 	inline static TVersion VersionRequired();
   125 
   126 #ifndef __KERNEL_MODE__
   127 friend class RUsbPipe;
   128 friend class RUsbZeroCopyTransferStrategy;
   129 
   130 public:
   131 	inline RUsbInterface();
   132 
   133 	//
   134 	// Standard R-class lifetime controls
   135 	//
   136 	IMPORT_C TInt Open(TUint32 aToken, TOwnerType aType = EOwnerProcess);
   137 	IMPORT_C void Close();
   138 
   139 	//
   140 	// Transfer allocation/initialisation functions
   141 	//
   142 	IMPORT_C TInt RegisterTransferDescriptor(RUsbTransferDescriptor& aTransfer);
   143 	IMPORT_C void ResetTransferDescriptors();
   144 	IMPORT_C TInt InitialiseTransferDescriptors();
   145 
   146 	//
   147 	// Endpoint Zero transfer utilities
   148 	//
   149 	inline void Ep0Transfer(TUsbTransferRequestDetails& aDetails, const TDesC8& aSend, TDes8& aRecv, TRequestStatus& aRequest);
   150 	inline void CancelEP0Transfer();
   151 	inline TInt GetStringDescriptor(TDes8& aStringDescriptor, TUint8 aIndex, TUint16 aLangId);
   152 
   153 	//
   154 	// Suspend/Resume functionality
   155 	//
   156 	inline void PermitSuspendAndWaitForResume(TRequestStatus& aResumeSignal);
   157 	inline void CancelPermitSuspend();
   158 	inline void CancelWaitForResume();
   159 	inline TInt PermitRemoteWakeup(TBool aPermitted);
   160 	
   161 	
   162 	//
   163 	// Descriptor access functions
   164 	//
   165 	inline TInt GetInterfaceDescriptor(TUsbInterfaceDescriptor& aDescriptor);
   166 	inline TInt GetAlternateInterfaceDescriptor(TInt aAlternateInterface, TUsbInterfaceDescriptor& aDescriptor);
   167 	inline TInt GetEndpointDescriptor(TInt aAlternateInterface, TInt aEndpoint, TUsbEndpointDescriptor& aDescriptor);
   168 
   169 	// Utility functions to avoid having to parse the entire descriptor tree in simple cases.
   170 	inline TInt GetAlternateInterfaceCount();
   171 	inline TInt EnumerateEndpointsOnInterface(TInt aAlternateInterface);
   172 
   173 	//
   174 	// Interface configuration functions
   175 	//
   176 	inline TInt SelectAlternateInterface(TInt aAlternateInterface);
   177 	inline TInt OpenPipeForEndpoint(RUsbPipe& aPipe, TInt aEndpoint, TBool aUseDMA);
   178 	
   179 	//
   180 	// Some utility functions
   181 	//
   182 	inline TInt GetBusId(TUsbBusId& aBusId);
   183 	inline TInt HcdPageSize();
   184 	inline TInt GetDeviceSpeed(TDeviceSpeed& aDeviceSpeed);
   185 
   186 private:
   187 	inline TInt AllocateSharedChunk(RChunk& aChunk, TInt aSize, TInt& aOffset);
   188 	TInt RegisterTransferDescriptor(RUsbTransferDescriptor& aTransfer, TUsbBusId aBusId);
   189 	inline TInt GetEndpointDescriptor(TInt aAlternateInterface, TInt aEndpoint, TUsbEndpointDescriptor*& aDescriptor);
   190 
   191 private:
   192 	TUsbInterfaceDescriptor* iHeadInterfaceDescriptor;
   193 	HBufC8* iInterfaceDescriptorData;
   194 	
   195 	RUsbTransferStrategy* iTransferStrategy;
   196 	
   197 	TInt iAlternateSetting;
   198 #endif
   199 	};
   200 
   201 typedef TUint64 TUsbEndpointId;
   202 
   203 /**
   204 Functions which act on an individual pipe established between the local host and a remote device.
   205 */
   206 class RUsbPipe
   207 	{
   208 public:
   209 	enum TUsbPipeRequest
   210 		{
   211         EIssueTransfer		= 0x4000000,            // Start from a different value compared to interfaces
   212                                                     // to allow them to be distinguished while debugging
   213 		};
   214 	enum TUsbPipeControl
   215 		{
   216 		EClose					= 0x4000000,        // Start from a different value compared to interfaces
   217                                                     // to allow them to be distinguished while debugging
   218 		EAbort,
   219 		EClearRemoteStall,
   220 		EGetEndpointId,
   221 		};
   222 
   223 #ifndef __KERNEL_MODE__
   224 friend class RUsbInterface;
   225 friend class RUsbTransferStrategy;
   226 friend class RUsbZeroCopyTransferStrategy;
   227 public:
   228 	inline RUsbPipe();
   229 
   230 	inline void Close();
   231 	inline TUint32 Handle() const;
   232 
   233 	inline TInt GetEndpointId(TUsbEndpointId& aEndpointId);
   234 	inline TInt GetBusId(TUsbBusId& aBusId);
   235 
   236 	inline TInt GetEndpointDescriptor(TUsbEndpointDescriptor& aDescriptor);
   237 
   238 	IMPORT_C void Transfer(RUsbTransferDescriptor& aTransfer, TRequestStatus& aRequest);
   239 	inline void CancelAllTransfers();
   240 
   241 	inline TInt ClearRemoteStall();
   242 	
   243 private:
   244 	inline void IssueTransfer(TInt aTransferHandle, TRequestStatus& aRequest);
   245 
   246 private:
   247 	TUint32 iHandle;
   248 	RUsbInterface* iInterface;
   249 	TUsbEndpointDescriptor* iHeadEndpointDescriptor;
   250 #endif
   251 	};
   252 
   253 
   254 #include <d32usbdi.inl>
   255 
   256 #endif	// D32USBDI_H