kernel/eka/include/d32otgdi.h
changeset 0 a41df078684a
child 87 2f92ad2dc5db
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     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 /**
       
    17  @file
       
    18  @internalTechnology
       
    19  @prototype
       
    20 */
       
    21 
       
    22 #ifndef D32OTGDI_H
       
    23 #define D32OTGDI_H
       
    24 
       
    25 #ifdef __KERNEL_MODE__
       
    26 #  include <kernel/klib.h>
       
    27 #  include <e32ver.h>
       
    28 #else
       
    29 #  include <e32base.h>
       
    30 #  include <e32ver.h>
       
    31 #  include <e32debug.h>
       
    32 #endif
       
    33 
       
    34 #include <d32otgdi_errors.h>
       
    35 
       
    36 /**
       
    37 The bi-directional interface which USB Manager uses to talk to OTGDI about 
       
    38 OTG related issues
       
    39 
       
    40 @note This API is only available to USBMAN, a restriction which is enforced 
       
    41 by checking the SID of the calling process.
       
    42 */
       
    43 NONSHARABLE_CLASS(RUsbOtgDriver) : public RBusLogicalChannel
       
    44 	{
       
    45 	friend class DUsbOtgDriver;
       
    46 
       
    47 public:
       
    48 
       
    49 	// Version number history:
       
    50 	//
       
    51 	// PREQ1782 = 1.0
       
    52 	// PREQ1305 = 1.1
       
    53 	
       
    54 	static const TInt KMajorVersionNumber = 1;
       
    55 	static const TInt KMinorVersionNumber = 1;
       
    56 
       
    57 private:
       
    58 	
       
    59 	/**
       
    60 	OTG Event, supplied in a form that will enable use as an array
       
    61 	index (note also how this is used below in the bit-mask form,
       
    62 	but that this is only extended to a few, other events are OTG
       
    63 	internal and used only to drive the local state machine)
       
    64 	*/
       
    65 	enum TOtgEventIndex
       
    66 		{
       
    67 		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **
       
    68 		'public' OTG events
       
    69 		** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
       
    70 
       
    71 		/**
       
    72 		OTG events related to plug insertion or removal
       
    73 		*/
       
    74 		EEventIndexAPlugInserted = 0,
       
    75 		EEventIndexAPlugRemoved,
       
    76 
       
    77 		/**
       
    78 		OTG events relating to changes visible on the bus
       
    79 		*/
       
    80 		EEventIndexVbusRaised,
       
    81 		EEventIndexVbusDropped,
       
    82 		
       
    83 		EEventIndexSrpInitiated,
       
    84 
       
    85 		EEventIndexSrpReceived,
       
    86 		EEventIndexHnpEnabled,
       
    87 		EEventIndexHnpDisabled,
       
    88 		EEventIndexHnpSupported,
       
    89 		EEventIndexHnpAltSupported,
       
    90 
       
    91 		EEventIndexBusConnectionBusy,
       
    92 		EEventIndexBusConnectionIdle,
       
    93 		
       
    94 		/**
       
    95 		OTG events related to changes in the current role the device
       
    96 		is performing (independant of the orientation of the connection)
       
    97 		*/
       
    98 		EEventIndexRoleChangedToHost,
       
    99 		EEventIndexRoleChangedToDevice,
       
   100 		EEventIndexRoleChangedToIdle,
       
   101 
       
   102 		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **
       
   103 		'private' OTG events - these are not converted to the bit-map form,
       
   104 		but are used solely to stim the OTG state machine
       
   105 		** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
       
   106 		
       
   107 		EEventIndexPrivateAfterThis,
       
   108 
       
   109 		EEventIndexVbusError,
       
   110 		EEventIndexClearVbusError,
       
   111 		
       
   112 		EEventIndexResetStateMachine,
       
   113 
       
   114 		EEventIndexNoEvent,
       
   115 
       
   116 		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **
       
   117 		Single indicator used for array sizing
       
   118 		** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
       
   119 		EEventIndexNumEvents
       
   120 		};
       
   121 
       
   122 public:
       
   123 
       
   124 	/**
       
   125 	OTG Events, supplied in a form that can be used to create a mask
       
   126 	that can specify a watcher's events of interest.
       
   127 	*/
       
   128 	enum TOtgEvent
       
   129 		{
       
   130 		/**
       
   131 		 * 'empty' dummy event
       
   132 		 */
       
   133 		EEventNotValid = 0,
       
   134 		
       
   135 		/**
       
   136 		OTG events related to plug insertion or removal
       
   137 		*/
       
   138 		EEventAPlugInserted			= ( 1 << EEventIndexAPlugInserted		),
       
   139 		EEventAPlugRemoved			= ( 1 << EEventIndexAPlugRemoved		),
       
   140 
       
   141 		EEventGroupPlugChanges		= ( EEventAPlugInserted
       
   142 									   |EEventAPlugRemoved
       
   143 									  ),
       
   144 
       
   145 		/**
       
   146 		OTG events relating to changes visible on the bus
       
   147 		*/
       
   148 		EEventVbusRaised			= ( 1 << EEventIndexVbusRaised			),
       
   149 		EEventVbusDropped			= ( 1 << EEventIndexVbusDropped			),
       
   150 
       
   151 		EEventSrpInitiated			= ( 1 << EEventIndexSrpInitiated		),
       
   152 
       
   153 		EEventSrpReceived			= ( 1 << EEventIndexSrpReceived			),
       
   154 		EEventHnpEnabled			= ( 1 << EEventIndexHnpEnabled			),
       
   155 		EEventHnpDisabled			= ( 1 << EEventIndexHnpDisabled			),
       
   156 		EEventHnpSupported			= ( 1 << EEventIndexHnpSupported		),
       
   157 		EEventHnpAltSupported		= ( 1 << EEventIndexHnpAltSupported		),
       
   158 
       
   159 		EEventBusConnectionBusy		= ( 1 << EEventIndexBusConnectionBusy	),
       
   160 		EEventBusConnectionIdle		= ( 1 << EEventIndexBusConnectionIdle	),
       
   161 
       
   162 		EEventGroupBusChanges		= ( EEventVbusRaised
       
   163 									   |EEventVbusDropped
       
   164 									   |EEventSrpInitiated
       
   165 									   |EEventSrpReceived
       
   166 									   |EEventHnpEnabled
       
   167 									   |EEventHnpDisabled
       
   168 									   |EEventHnpSupported	
       
   169 									   |EEventHnpAltSupported
       
   170 									   |EEventBusConnectionBusy
       
   171 									   |EEventBusConnectionIdle
       
   172 									  ),
       
   173 
       
   174 		/**
       
   175 		OTG events related to changes in the current role the device
       
   176 		is performing (independant of the orientation of the connection)
       
   177 		*/
       
   178 		EEventRoleChangedToHost		= ( 1 << EEventIndexRoleChangedToHost	),
       
   179 		EEventRoleChangedToDevice	= ( 1 << EEventIndexRoleChangedToDevice	),
       
   180 		EEventRoleChangedToIdle		= ( 1 << EEventIndexRoleChangedToIdle	),
       
   181 
       
   182 		EEventGroupRoleChanges		= ( EEventRoleChangedToHost
       
   183 									   |EEventRoleChangedToDevice
       
   184 									   |EEventRoleChangedToIdle
       
   185 									  ),
       
   186 
       
   187 		/**
       
   188 		Helpful macro to allow users to register for 'everything'
       
   189 		*/
       
   190 		EEventGroupAll				= ( EEventGroupPlugChanges
       
   191 									   |EEventGroupBusChanges
       
   192 									   |EEventGroupRoleChanges
       
   193 									  )
       
   194 		};
       
   195 
       
   196 private:
       
   197 
       
   198 	/**
       
   199 	OTG State, supplied in a form that will enable use as an array
       
   200 	index (note also how this is used below in the bit-mask form)
       
   201 	*/
       
   202 	enum TOtgStateIndex
       
   203 		{
       
   204 		/**
       
   205 		Single case of non-stable state, used only during
       
   206 		startup
       
   207 		*/
       
   208 		EStateIndexReset = 0,
       
   209 
       
   210 		/**
       
   211 		'A'-connection states (names are derived from OTG-Supplement
       
   212 		Figure 6-2 On-The-Go A-Device State Diagram)
       
   213 		*/
       
   214 		EStateIndexAIdle,
       
   215 		EStateIndexAHost,
       
   216 		EStateIndexAPeripheral,
       
   217 		EStateIndexAVbusError,
       
   218 
       
   219 		/**
       
   220 		'B'-connection states (names are derived from OTG-Supplement
       
   221 		Figure 6-3 On-The-Go B-Device State Diagram)
       
   222 		*/
       
   223 		EStateIndexBIdle,
       
   224 		EStateIndexBPeripheral,
       
   225 		EStateIndexBHost,
       
   226 
       
   227 		/**
       
   228 		Single indicator used for array sizing
       
   229 		*/
       
   230 		EStateIndexNumStates
       
   231 		};
       
   232 
       
   233 public:
       
   234 
       
   235 	/**
       
   236 	OTG State, supplied in a form that can be used to create a mask
       
   237 	that can specify a watcher's states of interest.
       
   238 	*/
       
   239 	enum TOtgState
       
   240 		{
       
   241 		/**
       
   242 		 * 'empty' dummy state
       
   243 		 */
       
   244 		EStateNotValid = 0,
       
   245 		
       
   246 		/**
       
   247 		Single case of non-stable state, used only during
       
   248 		startup
       
   249 		*/
       
   250 		EStateReset					= ( 1 << EStateIndexReset		),
       
   251 
       
   252 		/**
       
   253 		'A'-connection states (names are derived from OTG-Supplement
       
   254 		Figure 6-2 On-The-Go A-Device State Diagram)
       
   255 		*/
       
   256 		EStateAIdle					= ( 1 << EStateIndexAIdle		),
       
   257 		EStateAHost					= ( 1 << EStateIndexAHost		),
       
   258 		EStateAPeripheral			= ( 1 << EStateIndexAPeripheral	),
       
   259 		EStateAVbusError			= ( 1 << EStateIndexAVbusError	),
       
   260 
       
   261 		EStateAllA					= ( EStateAIdle
       
   262 									   |EStateAHost
       
   263 									   |EStateAPeripheral
       
   264 									   |EStateAVbusError
       
   265 									  ),
       
   266 
       
   267 		EStateAllAExceptBusError	= ( EStateAIdle
       
   268 									   |EStateAHost
       
   269 									   |EStateAPeripheral
       
   270 									  ),
       
   271 
       
   272 		/**
       
   273 		'B'-connection states (names are derived from OTG-Supplement
       
   274 		Figure 6-3 On-The-Go B-Device State Diagram)
       
   275 		*/
       
   276 		EStateBIdle					= ( 1 << EStateIndexBIdle		),
       
   277 		EStateBPeripheral			= ( 1 << EStateIndexBPeripheral	),
       
   278 		EStateBHost					= ( 1 << EStateIndexBHost		),
       
   279 
       
   280 		EStateAllB					= ( EStateBIdle
       
   281 									   |EStateBPeripheral
       
   282 									   |EStateBHost
       
   283 									  )
       
   284 		};
       
   285 
       
   286 public:
       
   287 
       
   288 	/**
       
   289 	OTG Messages, these can be retrieved to satisfy the OTG Supplement 
       
   290 	"No Silent Failures" requirement.
       
   291 
       
   292     The error numbers are derived for constants set up in d32otgdi_error.h
       
   293 	and are used here so that the enumerator can be used to enforce compiler
       
   294 	checks on the functions that handle the messages.
       
   295 
       
   296     Note that this minimal set of message events only contains the few
       
   297 	things that are reported by the USB OTG Stack: it is expected that 
       
   298 	these will be merged into a composite message event flow by USBMAN
       
   299 	*/
       
   300 	enum TOtgMessage
       
   301 		{
       
   302 		/**
       
   303 		Internal OTGDI errors must also be offered to USBMAN in order to
       
   304 		fully support the "No Silent Failures" policy
       
   305 		*/
       
   306 		EEventQueueOverflow					= KErrUsbOtgEventQueueOverflow,	
       
   307 		EStateQueueOverflow					= KErrUsbOtgStateQueueOverflow,
       
   308 		EMessageQueueOverflow				= KErrUsbOtgMessageQueueOverflow,
       
   309 
       
   310 		EMessageBadState					= KErrUsbOtgBadState,
       
   311 
       
   312 		/**
       
   313 		Errors relating to attempts to do wrong things to VBUS
       
   314 		*/
       
   315 		EMessageStackNotStarted				= KErrUsbOtgStackNotStarted,
       
   316 		EMessageVbusAlreadyRaised			= KErrUsbOtgVbusAlreadyRaised,
       
   317 		EMessageSrpForbidden				= KErrUsbOtgSrpForbidden,
       
   318 
       
   319 		/**
       
   320 		Generic message that there has been some form of problem in
       
   321 		the lower-level USB OTG stack's calls
       
   322 		*/
       
   323 		EMessageBusControlProblem			= KErrUsbOtgBusControlProblem,
       
   324 
       
   325 		/**
       
   326 		Generic message that there has been a reportable failure in sending
       
   327 		the B_HNP_ENABLE SetFeature command
       
   328 		*/
       
   329 		EMessageHnpEnableProblem			= KErrUsbOtgHnpEnableProblem,
       
   330 		
       
   331 		/**
       
   332 		Peripheral reported as 'not-supported'
       
   333 		*/
       
   334 		EMessagePeriphNotSupported			= KErrUsbOtgPeriphNotSupported,
       
   335 		
       
   336 		/**
       
   337 		Individual error messages 
       
   338 		*/
       
   339 		EMessageVbusError					= KErrUsbOtgVbusError,
       
   340 		EMessageSrpTimeout					= KErrUsbOtgSrpTimeout,
       
   341 		EMessageSrpActive					= KErrUsbOtgSrpActive,
       
   342 		EMessageSrpNotPermitted				= KErrUsbOtgSrpNotPermitted,
       
   343 		EMessageHnpNotPermitted				= KErrUsbOtgHnpNotPermitted,
       
   344 		EMessageHnpNotEnabled				= KErrUsbOtgHnpNotEnabled,
       
   345 		EMessageHnpNotSuspended				= KErrUsbOtgHnpNotSuspended,
       
   346 		EMessageVbusPowerUpNotPermitted		= KErrUsbOtgVbusPowerUpNotPermitted,
       
   347 		EMessageVbusPowerUpError			= KErrUsbOtgVbusPowerUpError,
       
   348 		EMessageVbusPowerDownNotPermitted	= KErrUsbOtgVbusPowerDownNotPermitted,
       
   349 		EMessageVbusClearErrorNotPermitted	= KErrUsbOtgVbusClearErrorNotPermitted,
       
   350 		EMessageHnpNotResponding			= KErrUsbOtgHnpNotResponding,
       
   351 		EMessageHnpBusDrop					= KErrUsbOtgHnpBusDrop
       
   352 		};
       
   353 
       
   354 public:
       
   355 
       
   356 	/**
       
   357 	Set of OTG operations required for use of the User-Kernel channel
       
   358 	*/
       
   359 	enum TOtgRequest
       
   360 		{
       
   361 		EQueueOtgEventRequest = 0,
       
   362 		EQueueOtgStateRequest,
       
   363 		EQueueOtgMessageRequest,
       
   364 
       
   365 		EQueueOtgIdPinNotification,
       
   366 		EQueueOtgVbusNotification,
       
   367 		EQueueOtgConnectionNotification,
       
   368 		EQueueOtgStateNotification,
       
   369 		};
       
   370 
       
   371 	enum TOtgControl
       
   372 		{
       
   373 		EActivateOptTestMode = 0,
       
   374 
       
   375 		EStartStacks,
       
   376 		EStopStacks,
       
   377 
       
   378 		ECancelOtgEventRequest,
       
   379 		ECancelOtgStateRequest,
       
   380 		ECancelOtgMessageRequest,
       
   381 
       
   382 		ECancelOtgIdPinNotification,
       
   383 		ECancelOtgVbusNotification,
       
   384 		ECancelOtgConnectionNotification,
       
   385 		ECancelOtgStateNotification,
       
   386 
       
   387 		EBusRequest,
       
   388 		EBusRespondSrp,
       
   389 		EBusDrop,
       
   390 		EBusClearError
       
   391 		};
       
   392 
       
   393 	/**
       
   394 	ID-Pin possible states (note that this is not a plain boolean, to
       
   395 	allow for future expansion to cover car-kit - if this is needed, then
       
   396 	a new enum value of 'EIdPinCarKit' should be inserted)
       
   397 	*/
       
   398 	enum TOtgIdPin
       
   399 		{
       
   400 		EIdPinAPlug = 0,
       
   401 		EIdPinBPlug,
       
   402 		
       
   403 		// deprecated EIdPinCarKit - to be removed after OTGDI reaches MCL
       
   404 		
       
   405 		EIdPinCarKit,
       
   406 
       
   407 		EIdPinUnknown
       
   408 		};
       
   409 
       
   410 	/**
       
   411 	VBUS voltage level possible states (as detected from an OTG transceiver)
       
   412 	*/
       
   413 	enum TOtgVbus
       
   414 		{
       
   415 		EVbusHigh = 0,
       
   416 		EVbusLow,
       
   417 
       
   418 		EVbusUnknown
       
   419 		};
       
   420 		
       
   421 	/**
       
   422 	Connection 'Idle' indicator (potential to drop VBUS)
       
   423 	*/
       
   424 	enum TOtgConnection
       
   425 		{
       
   426 		EConnectionBusy = 0,
       
   427 		EConnectionIdle,
       
   428 		
       
   429 		EConnectionUnknown
       
   430 		};
       
   431 
       
   432 public:
       
   433 
       
   434 	inline static const TDesC& Name();
       
   435 	inline static TVersion VersionRequired();
       
   436 
       
   437 #ifndef __KERNEL_MODE__
       
   438 
       
   439 public:
       
   440 
       
   441 	inline TInt Open();
       
   442 
       
   443 	inline TInt ActivateOptTestMode();
       
   444 
       
   445 	inline TInt StartStacks();
       
   446 	inline void StopStacks();
       
   447 
       
   448 	inline void QueueOtgEventRequest(TOtgEvent& aOldestEvent, TRequestStatus& aStatus);
       
   449 	inline void CancelOtgEventRequest();
       
   450 
       
   451 	inline void QueueOtgStateRequest(TOtgState& aState, TRequestStatus& aStatus);
       
   452 	inline void CancelOtgStateRequest();
       
   453 
       
   454 	inline void QueueOtgMessageRequest(TOtgMessage& aMessage, TRequestStatus& aStatus);
       
   455 	inline void CancelOtgMessageRequest();
       
   456 
       
   457 	inline void QueueOtgIdPinNotification(TOtgIdPin& aCurrentIdPin, TRequestStatus& aStatus);
       
   458 	inline void CancelOtgIdPinNotification();
       
   459 
       
   460 	inline void QueueOtgVbusNotification(TOtgVbus& aCurrentVbus, TRequestStatus& aStatus);
       
   461 	inline void CancelOtgVbusNotification();
       
   462 
       
   463 	inline void QueueOtgConnectionNotification(TOtgConnection& aCurrentConnection, TRequestStatus& aStatus);
       
   464 	inline void CancelOtgConnectionNotification();
       
   465 
       
   466 	inline void QueueOtgStateNotification(TOtgState& aCurrentState, TRequestStatus& aStatus);
       
   467 	inline void CancelOtgStateNotification();
       
   468 
       
   469 	inline TInt BusRequest();
       
   470 	inline TInt BusRespondSrp();
       
   471 	inline TInt BusDrop();
       
   472 	inline TInt BusClearError();
       
   473 
       
   474 #endif // !__KERNEL_MODE__
       
   475 	};
       
   476 
       
   477 #include <d32otgdi.inl>
       
   478 
       
   479 #endif // D32OTGDI_H