kernel/eka/include/d32usbdi_hubdriver.h
author Slion
Tue, 08 Dec 2009 08:11:42 +0100
branchanywhere
changeset 19 f6d3d9676ee4
parent 0 a41df078684a
permissions -rw-r--r--
Trying to figure out how to implement my WINC like compatibility layer. Going the emulation way is probably not so smart. We should not use the kernel but rather hook native functions in the Exec calls.

// 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_HUBDRIVER_H
#define D32USBDI_HUBDRIVER_H

#ifdef __KERNEL_MODE__
#include <kernel/klib.h>
#else
#include <e32base.h>
#include <d32usbdescriptors.h>
#include <e32debug.h>
#endif

#include <e32ver.h>
#include <d32usbdi_errors.h>

/**
@file
@internalComponent
@prototype
*/

/*****************************************************************************/
/*                                                                           */
/* Interface classes                                                         */
/*                                                                           */
/*****************************************************************************/

class RUsbDevice;

/**
Functions which act on the local hub driver.  Higher level components cannot determine which host controller is in
 use, although the presence of Other Speed descriptors may give some hints.

@note This API is only available to the function driver framework, a restriction which is enforced by checking the
SID of the calling process.
*/
class RUsbHubDriver : public RBusLogicalChannel
	{
public:
	enum TUsbHubDriverRequest
		{
		EWaitForBusEvent,
		};
	enum TUsbHubDriverControl
		{
		EStartHost,
		EStopHost,
		};
 	enum TUsbHubDriverCancel
		{
		ECancelWaitForBusEvent	= 0x00000001,
		};

	class TBusEvent
		{
	public:
		enum TEvent
			{
			ENoEvent,
			EDeviceAttached,
			EDeviceRemoved,
			EDevMonEvent
			};

	public:
		TEvent	iEventType;
		TUint	iDeviceHandle;
		TInt	iError;
		TInt	iReason;		// When iEventType == EDevMonEvent, this may hold additional details of the reason for the notification
		};

#ifndef __KERNEL_MODE__
friend class RUsbDevice;
public:
	inline TInt Open();
	inline TInt StartHost();
	inline void StopHost();

	inline void WaitForBusEvent(TBusEvent& aEvent, TRequestStatus& aRequest);
	inline void CancelWaitForBusEvent();

#endif

	inline static const TDesC& Name();
	inline static TVersion VersionRequired();
	};


/**
Use restricted to the Function Driver Framework, enforced by SID.
Provides a means to examine the configuration descriptor, and so load appropriate Function Drivers.
*/
class RUsbDevice
	{
public:
	enum TUsbDeviceRequest
		{
		EDeviceRequest		= 0x4000000,   // start at 0x4000000 to differentiate from other requests
		EDeviceStateChange,
		};
	enum TUsbDeviceControl
		{
		EDeviceControl		= 0x4000000,   // start at 0x4000000 to differentiate from other controls
		EOpen,
		EClose,
		EGetDeviceDescriptor,
		EGetConfigurationDescriptorSize,
		EGetConfigurationDescriptor,
		EGetStringDescriptor,
		EGetInterfaceToken,
		ESuspend,
		EResume,
		ECancelDeviceStateChange,
		};

	enum TDeviceState
		{
		EDeviceActive,
		EDeviceSuspended,
		EDeviceTriState,
		};
	
	class TInterfaceTokenParameters
		{
	public:
		TInt		iInterfaceNumber;
		TUint32*	iToken;
		};
	
	class TStringDescParams
		{
	public:
		TDes8*		iTarget;
		TInt		iIndex;
		TInt		iLangId;
		};

#ifndef __KERNEL_MODE__
public:
	inline RUsbDevice();

	inline TInt Open(RUsbHubDriver& aHub, TUint aHandle);
	inline void Close();
	
	inline void QueueDeviceStateChangeNotification(TDeviceState& aCurrentState, TRequestStatus& aRequest);
	inline void CancelDeviceStateChangeNotification();
	inline TUint Handle() const;
	inline TInt GetTokenForInterface(TInt aInterfaceNumber, TUint32& aToken);

	inline TInt Suspend();
	inline TInt Resume();

	inline TInt GetDeviceDescriptor(TUsbDeviceDescriptor& aDescriptor);
	inline TInt GetConfigurationDescriptor(TUsbConfigurationDescriptor& aDescriptor);
	inline TInt GetStringDescriptor(TUsbStringDescriptor*& aDescriptor, TDes8& aTarget, TInt aIndex);
	inline TInt GetStringDescriptor(TUsbStringDescriptor*& aDescriptor, TDes8& aTarget, TInt aIndex, TInt aLangId);
	
private:		// Internal function overloads
	inline TInt GetDeviceDescriptor(TDes8& aDeviceDesc);
	inline TInt GetConfigurationDescriptorSize(TInt& aConfigDescSize);
	inline TInt GetConfigurationDescriptor(TDes8& aConfigDesc);
	inline TInt GetStringDescriptor(TDes8& aStringDescriptor, TInt aIndex, TInt aLangId =0);
	
private:
	inline void GetLocalDescriptorsL();
	inline TInt ParseStringDescriptor(TUsbStringDescriptor*& aDescriptor, const TDesC8& aData);

private:
	TUsbDeviceDescriptor* iHeadDeviceDescriptor;
	TUsbConfigurationDescriptor* iHeadConfDescriptor;

	static const TUint KDeviceDescriptorSize = 18;
	TBuf8<KDeviceDescriptorSize> iDeviceDescriptorData;
	HBufC8* iConfigurationDescriptorData;

private:
	RUsbHubDriver* iHub;
	TUint iHandle;

#endif
	};


#include <d32usbdi_hubdriver.inl>


#endif	// D32USBDI_HUBDRIVER_H