diff -r 000000000000 -r 96e5fb8b040d kernel/eka/include/d32otgdi.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/include/d32otgdi.h Thu Dec 17 09:24:54 2009 +0200 @@ -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 +# include +#else +# include +# include +# include +#endif + +#include + +/** +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 + +#endif // D32OTGDI_H