kernel/eka/include/d32usbdi_hubdriver.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/d32usbdi_hubdriver.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,201 @@
+// 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