kernel/eka/include/d32usbdi.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
parent 22 2f92ad2dc5db
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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 <kernel/klib.h>
#else
#include <e32base.h>
#include <d32usbdescriptors.h>
#endif
#include <e32ver.h>
#include <d32usbdi_errors.h>

/**
@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 GetHcdPageSize(TInt& aHcdPageSize);
	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 <d32usbdi.inl>

#endif	// D32USBDI_H