kernel/eka/include/d32otgdi.h
changeset 0 a41df078684a
child 87 2f92ad2dc5db
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/d32otgdi.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,479 @@
+// 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:
+//
+
+/**
+ @file
+ @internalTechnology
+ @prototype
+*/
+
+#ifndef D32OTGDI_H
+#define D32OTGDI_H
+
+#ifdef __KERNEL_MODE__
+#  include <kernel/klib.h>
+#  include <e32ver.h>
+#else
+#  include <e32base.h>
+#  include <e32ver.h>
+#  include <e32debug.h>
+#endif
+
+#include <d32otgdi_errors.h>
+
+/**
+The bi-directional interface which USB Manager uses to talk to OTGDI about 
+OTG related issues
+
+@note This API is only available to USBMAN, a restriction which is enforced 
+by checking the SID of the calling process.
+*/
+NONSHARABLE_CLASS(RUsbOtgDriver) : public RBusLogicalChannel
+	{
+	friend class DUsbOtgDriver;
+
+public:
+
+	// Version number history:
+	//
+	// PREQ1782 = 1.0
+	// PREQ1305 = 1.1
+	
+	static const TInt KMajorVersionNumber = 1;
+	static const TInt KMinorVersionNumber = 1;
+
+private:
+	
+	/**
+	OTG Event, supplied in a form that will enable use as an array
+	index (note also how this is used below in the bit-mask form,
+	but that this is only extended to a few, other events are OTG
+	internal and used only to drive the local state machine)
+	*/
+	enum TOtgEventIndex
+		{
+		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **
+		'public' OTG events
+		** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+		/**
+		OTG events related to plug insertion or removal
+		*/
+		EEventIndexAPlugInserted = 0,
+		EEventIndexAPlugRemoved,
+
+		/**
+		OTG events relating to changes visible on the bus
+		*/
+		EEventIndexVbusRaised,
+		EEventIndexVbusDropped,
+		
+		EEventIndexSrpInitiated,
+
+		EEventIndexSrpReceived,
+		EEventIndexHnpEnabled,
+		EEventIndexHnpDisabled,
+		EEventIndexHnpSupported,
+		EEventIndexHnpAltSupported,
+
+		EEventIndexBusConnectionBusy,
+		EEventIndexBusConnectionIdle,
+		
+		/**
+		OTG events related to changes in the current role the device
+		is performing (independant of the orientation of the connection)
+		*/
+		EEventIndexRoleChangedToHost,
+		EEventIndexRoleChangedToDevice,
+		EEventIndexRoleChangedToIdle,
+
+		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **
+		'private' OTG events - these are not converted to the bit-map form,
+		but are used solely to stim the OTG state machine
+		** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+		
+		EEventIndexPrivateAfterThis,
+
+		EEventIndexVbusError,
+		EEventIndexClearVbusError,
+		
+		EEventIndexResetStateMachine,
+
+		EEventIndexNoEvent,
+
+		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **
+		Single indicator used for array sizing
+		** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+		EEventIndexNumEvents
+		};
+
+public:
+
+	/**
+	OTG Events, supplied in a form that can be used to create a mask
+	that can specify a watcher's events of interest.
+	*/
+	enum TOtgEvent
+		{
+		/**
+		 * 'empty' dummy event
+		 */
+		EEventNotValid = 0,
+		
+		/**
+		OTG events related to plug insertion or removal
+		*/
+		EEventAPlugInserted			= ( 1 << EEventIndexAPlugInserted		),
+		EEventAPlugRemoved			= ( 1 << EEventIndexAPlugRemoved		),
+
+		EEventGroupPlugChanges		= ( EEventAPlugInserted
+									   |EEventAPlugRemoved
+									  ),
+
+		/**
+		OTG events relating to changes visible on the bus
+		*/
+		EEventVbusRaised			= ( 1 << EEventIndexVbusRaised			),
+		EEventVbusDropped			= ( 1 << EEventIndexVbusDropped			),
+
+		EEventSrpInitiated			= ( 1 << EEventIndexSrpInitiated		),
+
+		EEventSrpReceived			= ( 1 << EEventIndexSrpReceived			),
+		EEventHnpEnabled			= ( 1 << EEventIndexHnpEnabled			),
+		EEventHnpDisabled			= ( 1 << EEventIndexHnpDisabled			),
+		EEventHnpSupported			= ( 1 << EEventIndexHnpSupported		),
+		EEventHnpAltSupported		= ( 1 << EEventIndexHnpAltSupported		),
+
+		EEventBusConnectionBusy		= ( 1 << EEventIndexBusConnectionBusy	),
+		EEventBusConnectionIdle		= ( 1 << EEventIndexBusConnectionIdle	),
+
+		EEventGroupBusChanges		= ( EEventVbusRaised
+									   |EEventVbusDropped
+									   |EEventSrpInitiated
+									   |EEventSrpReceived
+									   |EEventHnpEnabled
+									   |EEventHnpDisabled
+									   |EEventHnpSupported	
+									   |EEventHnpAltSupported
+									   |EEventBusConnectionBusy
+									   |EEventBusConnectionIdle
+									  ),
+
+		/**
+		OTG events related to changes in the current role the device
+		is performing (independant of the orientation of the connection)
+		*/
+		EEventRoleChangedToHost		= ( 1 << EEventIndexRoleChangedToHost	),
+		EEventRoleChangedToDevice	= ( 1 << EEventIndexRoleChangedToDevice	),
+		EEventRoleChangedToIdle		= ( 1 << EEventIndexRoleChangedToIdle	),
+
+		EEventGroupRoleChanges		= ( EEventRoleChangedToHost
+									   |EEventRoleChangedToDevice
+									   |EEventRoleChangedToIdle
+									  ),
+
+		/**
+		Helpful macro to allow users to register for 'everything'
+		*/
+		EEventGroupAll				= ( EEventGroupPlugChanges
+									   |EEventGroupBusChanges
+									   |EEventGroupRoleChanges
+									  )
+		};
+
+private:
+
+	/**
+	OTG State, supplied in a form that will enable use as an array
+	index (note also how this is used below in the bit-mask form)
+	*/
+	enum TOtgStateIndex
+		{
+		/**
+		Single case of non-stable state, used only during
+		startup
+		*/
+		EStateIndexReset = 0,
+
+		/**
+		'A'-connection states (names are derived from OTG-Supplement
+		Figure 6-2 On-The-Go A-Device State Diagram)
+		*/
+		EStateIndexAIdle,
+		EStateIndexAHost,
+		EStateIndexAPeripheral,
+		EStateIndexAVbusError,
+
+		/**
+		'B'-connection states (names are derived from OTG-Supplement
+		Figure 6-3 On-The-Go B-Device State Diagram)
+		*/
+		EStateIndexBIdle,
+		EStateIndexBPeripheral,
+		EStateIndexBHost,
+
+		/**
+		Single indicator used for array sizing
+		*/
+		EStateIndexNumStates
+		};
+
+public:
+
+	/**
+	OTG State, supplied in a form that can be used to create a mask
+	that can specify a watcher's states of interest.
+	*/
+	enum TOtgState
+		{
+		/**
+		 * 'empty' dummy state
+		 */
+		EStateNotValid = 0,
+		
+		/**
+		Single case of non-stable state, used only during
+		startup
+		*/
+		EStateReset					= ( 1 << EStateIndexReset		),
+
+		/**
+		'A'-connection states (names are derived from OTG-Supplement
+		Figure 6-2 On-The-Go A-Device State Diagram)
+		*/
+		EStateAIdle					= ( 1 << EStateIndexAIdle		),
+		EStateAHost					= ( 1 << EStateIndexAHost		),
+		EStateAPeripheral			= ( 1 << EStateIndexAPeripheral	),
+		EStateAVbusError			= ( 1 << EStateIndexAVbusError	),
+
+		EStateAllA					= ( EStateAIdle
+									   |EStateAHost
+									   |EStateAPeripheral
+									   |EStateAVbusError
+									  ),
+
+		EStateAllAExceptBusError	= ( EStateAIdle
+									   |EStateAHost
+									   |EStateAPeripheral
+									  ),
+
+		/**
+		'B'-connection states (names are derived from OTG-Supplement
+		Figure 6-3 On-The-Go B-Device State Diagram)
+		*/
+		EStateBIdle					= ( 1 << EStateIndexBIdle		),
+		EStateBPeripheral			= ( 1 << EStateIndexBPeripheral	),
+		EStateBHost					= ( 1 << EStateIndexBHost		),
+
+		EStateAllB					= ( EStateBIdle
+									   |EStateBPeripheral
+									   |EStateBHost
+									  )
+		};
+
+public:
+
+	/**
+	OTG Messages, these can be retrieved to satisfy the OTG Supplement 
+	"No Silent Failures" requirement.
+
+    The error numbers are derived for constants set up in d32otgdi_error.h
+	and are used here so that the enumerator can be used to enforce compiler
+	checks on the functions that handle the messages.
+
+    Note that this minimal set of message events only contains the few
+	things that are reported by the USB OTG Stack: it is expected that 
+	these will be merged into a composite message event flow by USBMAN
+	*/
+	enum TOtgMessage
+		{
+		/**
+		Internal OTGDI errors must also be offered to USBMAN in order to
+		fully support the "No Silent Failures" policy
+		*/
+		EEventQueueOverflow					= KErrUsbOtgEventQueueOverflow,	
+		EStateQueueOverflow					= KErrUsbOtgStateQueueOverflow,
+		EMessageQueueOverflow				= KErrUsbOtgMessageQueueOverflow,
+
+		EMessageBadState					= KErrUsbOtgBadState,
+
+		/**
+		Errors relating to attempts to do wrong things to VBUS
+		*/
+		EMessageStackNotStarted				= KErrUsbOtgStackNotStarted,
+		EMessageVbusAlreadyRaised			= KErrUsbOtgVbusAlreadyRaised,
+		EMessageSrpForbidden				= KErrUsbOtgSrpForbidden,
+
+		/**
+		Generic message that there has been some form of problem in
+		the lower-level USB OTG stack's calls
+		*/
+		EMessageBusControlProblem			= KErrUsbOtgBusControlProblem,
+
+		/**
+		Generic message that there has been a reportable failure in sending
+		the B_HNP_ENABLE SetFeature command
+		*/
+		EMessageHnpEnableProblem			= KErrUsbOtgHnpEnableProblem,
+		
+		/**
+		Peripheral reported as 'not-supported'
+		*/
+		EMessagePeriphNotSupported			= KErrUsbOtgPeriphNotSupported,
+		
+		/**
+		Individual error messages 
+		*/
+		EMessageVbusError					= KErrUsbOtgVbusError,
+		EMessageSrpTimeout					= KErrUsbOtgSrpTimeout,
+		EMessageSrpActive					= KErrUsbOtgSrpActive,
+		EMessageSrpNotPermitted				= KErrUsbOtgSrpNotPermitted,
+		EMessageHnpNotPermitted				= KErrUsbOtgHnpNotPermitted,
+		EMessageHnpNotEnabled				= KErrUsbOtgHnpNotEnabled,
+		EMessageHnpNotSuspended				= KErrUsbOtgHnpNotSuspended,
+		EMessageVbusPowerUpNotPermitted		= KErrUsbOtgVbusPowerUpNotPermitted,
+		EMessageVbusPowerUpError			= KErrUsbOtgVbusPowerUpError,
+		EMessageVbusPowerDownNotPermitted	= KErrUsbOtgVbusPowerDownNotPermitted,
+		EMessageVbusClearErrorNotPermitted	= KErrUsbOtgVbusClearErrorNotPermitted,
+		EMessageHnpNotResponding			= KErrUsbOtgHnpNotResponding,
+		EMessageHnpBusDrop					= KErrUsbOtgHnpBusDrop
+		};
+
+public:
+
+	/**
+	Set of OTG operations required for use of the User-Kernel channel
+	*/
+	enum TOtgRequest
+		{
+		EQueueOtgEventRequest = 0,
+		EQueueOtgStateRequest,
+		EQueueOtgMessageRequest,
+
+		EQueueOtgIdPinNotification,
+		EQueueOtgVbusNotification,
+		EQueueOtgConnectionNotification,
+		EQueueOtgStateNotification,
+		};
+
+	enum TOtgControl
+		{
+		EActivateOptTestMode = 0,
+
+		EStartStacks,
+		EStopStacks,
+
+		ECancelOtgEventRequest,
+		ECancelOtgStateRequest,
+		ECancelOtgMessageRequest,
+
+		ECancelOtgIdPinNotification,
+		ECancelOtgVbusNotification,
+		ECancelOtgConnectionNotification,
+		ECancelOtgStateNotification,
+
+		EBusRequest,
+		EBusRespondSrp,
+		EBusDrop,
+		EBusClearError
+		};
+
+	/**
+	ID-Pin possible states (note that this is not a plain boolean, to
+	allow for future expansion to cover car-kit - if this is needed, then
+	a new enum value of 'EIdPinCarKit' should be inserted)
+	*/
+	enum TOtgIdPin
+		{
+		EIdPinAPlug = 0,
+		EIdPinBPlug,
+		
+		// deprecated EIdPinCarKit - to be removed after OTGDI reaches MCL
+		
+		EIdPinCarKit,
+
+		EIdPinUnknown
+		};
+
+	/**
+	VBUS voltage level possible states (as detected from an OTG transceiver)
+	*/
+	enum TOtgVbus
+		{
+		EVbusHigh = 0,
+		EVbusLow,
+
+		EVbusUnknown
+		};
+		
+	/**
+	Connection 'Idle' indicator (potential to drop VBUS)
+	*/
+	enum TOtgConnection
+		{
+		EConnectionBusy = 0,
+		EConnectionIdle,
+		
+		EConnectionUnknown
+		};
+
+public:
+
+	inline static const TDesC& Name();
+	inline static TVersion VersionRequired();
+
+#ifndef __KERNEL_MODE__
+
+public:
+
+	inline TInt Open();
+
+	inline TInt ActivateOptTestMode();
+
+	inline TInt StartStacks();
+	inline void StopStacks();
+
+	inline void QueueOtgEventRequest(TOtgEvent& aOldestEvent, TRequestStatus& aStatus);
+	inline void CancelOtgEventRequest();
+
+	inline void QueueOtgStateRequest(TOtgState& aState, TRequestStatus& aStatus);
+	inline void CancelOtgStateRequest();
+
+	inline void QueueOtgMessageRequest(TOtgMessage& aMessage, TRequestStatus& aStatus);
+	inline void CancelOtgMessageRequest();
+
+	inline void QueueOtgIdPinNotification(TOtgIdPin& aCurrentIdPin, TRequestStatus& aStatus);
+	inline void CancelOtgIdPinNotification();
+
+	inline void QueueOtgVbusNotification(TOtgVbus& aCurrentVbus, TRequestStatus& aStatus);
+	inline void CancelOtgVbusNotification();
+
+	inline void QueueOtgConnectionNotification(TOtgConnection& aCurrentConnection, TRequestStatus& aStatus);
+	inline void CancelOtgConnectionNotification();
+
+	inline void QueueOtgStateNotification(TOtgState& aCurrentState, TRequestStatus& aStatus);
+	inline void CancelOtgStateNotification();
+
+	inline TInt BusRequest();
+	inline TInt BusRespondSrp();
+	inline TInt BusDrop();
+	inline TInt BusClearError();
+
+#endif // !__KERNEL_MODE__
+	};
+
+#include <d32otgdi.inl>
+
+#endif // D32OTGDI_H