diff -r 7e15987c4500 -r 7068aba64af5 usbengines/usbotgwatcher/src/cusbstatehosthandle.cpp --- a/usbengines/usbotgwatcher/src/cusbstatehosthandle.cpp Tue Feb 02 00:52:37 2010 +0200 +++ b/usbengines/usbotgwatcher/src/cusbstatehosthandle.cpp Fri Feb 19 23:50:33 2010 +0200 @@ -44,7 +44,7 @@ // CUsbStateHostHandle* CUsbStateHostHandle::NewL(CUsbOtgWatcher* aWatcher) { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostAHost::NewL" ) ); + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::NewL" ) ); CUsbStateHostHandle* self = new (ELeave) CUsbStateHostHandle(aWatcher); CleanupStack::PushL(self); @@ -60,10 +60,6 @@ void CUsbStateHostHandle::ConstructL() { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::ConstructL" ) ); - - iTooMuchPowerTimer = CUsbTimer::NewL(this, ETooMuchPowerRequiredTimer); - iDriversNotFoundTimer = CUsbTimer::NewL(this, EDriversNotFoundTimer); - } // --------------------------------------------------------------------------- @@ -74,8 +70,6 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::~CUsbStateHostHandle" ) ); - delete iTooMuchPowerTimer; - delete iDriversNotFoundTimer; } // --------------------------------------------------------------------------- @@ -107,9 +101,6 @@ // void CUsbStateHostHandle::JustBeforeLeavingThisStateL() { - iTooMuchPowerTimer->Cancel(); - iDriversNotFoundTimer->Cancel(); - iWatcher->NotifManager()->CloseAllNotifiers(); } // --------------------------------------------------------------------------- @@ -220,41 +211,24 @@ void CUsbStateHostHandle::DoHandleL() { FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL iWhat = %d" ), iWhat)); - - if (iTooMuchPowerTimer) - iTooMuchPowerTimer->Cancel(); - + + // Drop VBus first + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + switch (iWhat) { - case EUsbWatcherErrDriversNotFound: - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL DriversNotFound" ) ); - iDriversNotFoundTimer->After(KTimeDriversNotFound); - break; - - } case EUsbWatcherHubsNotSupported: { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherHubsNotSupported" ) ); - // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped - iWatcher->Usb().BusDrop(); iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, EUsbOtgHubUnsupported, this); break; } - case EUsbWatcherErrDeviceRequiresTooMuchPowerOnEnumeration: - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrDeviceRequiresTooMuchPowerOnEnumeration" ) ); - - iTooMuchPowerTimer->After(KTimeTooMuchPowerRequired); - break; - } case EUsbWatcherErrDeviceRequiresTooMuchPower: { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrDeviceRequiresTooMuchPower" ) ); - // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped - iWatcher->Usb().BusDrop(); iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, EUsbOtgTooMuchPower, this); break; @@ -262,8 +236,6 @@ case EUsbWatcherErrUnsupportedDevice: { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrUnsupportedDevice" ) ); - // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped - iWatcher->Usb().BusDrop(); iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, EUsbOtgUnsupportedDevice, this); break; @@ -271,18 +243,14 @@ case EUsbWatcherConnectedToOTG: { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherConnectedToOTG" ) ); - - // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped - iWatcher->Usb().BusDrop(); iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, EUsbOtgUnsupportedDevice, this); + break; } case EUsbWatcherErrDandlingCable: { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrDandlingCable" ) ); - // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped - iWatcher->Usb().BusDrop(); iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, EUsbOtgErrorAttachTimedOut, this); break; @@ -290,8 +258,6 @@ case EUsbWatcherNoActivity: { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherNoActivity" ) ); - // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped - iWatcher->Usb().BusDrop(); iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, EUsbOtgUnsupportedDevice, this); @@ -300,8 +266,6 @@ case EUsbWatcherErrorInConnection: { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrorInConnection" ) ); - // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped - iWatcher->Usb().BusDrop(); iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, EUsbOtgErrorInConnection, this); break; @@ -321,15 +285,13 @@ case EUsbWatcherMessageNotificationError: { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL Error from observer" ) ); - // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped - iWatcher->Usb().BusDrop(); iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, EUsbOtgErrorInConnection, this); break; } default: { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL Unexpected situation to be handled" ) ); + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL Unexpected situation to be handled" ) ); Panic(EUnexpectedSituationToHandle); break; } @@ -337,16 +299,44 @@ } ///////////////////////////////////////////////////////////////////////////////////// -// just ignore all the events // From VBus observer +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::VBusUpL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::VBusUpL" ) ); + // as result of BusRespondSrp() VBus might rise up. + // role swap is not supported => drop vbus + // when role swap is supported, leave this function empty + + iWatcher->Usb().BusDrop(); + } + +// --------------------------------------------------------------------------- +// this is expected in the state, for example after calling BusDrop +// --------------------------------------------------------------------------- +// void CUsbStateHostHandle::VBusDownL() { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::VBusDownL" ) ); } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::VBusErrorL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::VBusErrorL" ) ); + + iWatcher->Usb().BusClearError(); + } + // From OTG state observer // --------------------------------------------------------------------------- -// +// this AIdle means that VBus gets down. From usbwatcher POV no need to change state here // --------------------------------------------------------------------------- // void CUsbStateHostHandle::AIdleL() @@ -356,7 +346,8 @@ } // --------------------------------------------------------------------------- -// +// this means VBus gets up (for example as result RespondSrp()). Do not change state to Host, due to for usbwatcher it would mean +// that device attached and driverls found. // --------------------------------------------------------------------------- // void CUsbStateHostHandle::AHostL() @@ -371,47 +362,20 @@ void CUsbStateHostHandle::APeripheralL() { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::APeripheralL" ) ); + + ChangeHostStateL(EUsbStateHostAPeripheral); } // --------------------------------------------------------------------------- +// ignore any problems on VBus, just clear it // // --------------------------------------------------------------------------- // void CUsbStateHostHandle::AVBusErrorL() { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::AVBusErrorL" ) ); - - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CUsbStateHostHandle::BIdleL() - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BIdleL" ) ); - - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CUsbStateHostHandle::BPeripheralL() - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BPeripheralL" ) ); - - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CUsbStateHostHandle::BHostL() - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BHostL" ) ); - + iWatcher->Usb().BusClearError(); } // From bus activity observer @@ -422,7 +386,6 @@ void CUsbStateHostHandle::BusIdleL() { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BusIdleL" ) ); - } // --------------------------------------------------------------------------- @@ -432,7 +395,6 @@ void CUsbStateHostHandle::BusActiveL() { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BusActiveL" ) ); - } // From Host Event notification observer @@ -445,14 +407,7 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DeviceAttachedL" ) ); - if (iTooMuchPowerTimer->IsActive() || iDriversNotFoundTimer->IsActive()) - { - ChangeHostStateL(EUsbStateHostAInitiate); - iWatcher->DeviceAttachedL(aDevEventInfo); - return; - } - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DeviceAttachedL Unexpected situation" ) ); - } + } // --------------------------------------------------------------------------- // @@ -462,7 +417,7 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DeviceDetachedL" ) ); - } + } // --------------------------------------------------------------------------- // @@ -473,7 +428,7 @@ FLOG( _L( "[USBOTGWATCHER]\tCUsbState::DriverLoadSuccessL" ) ); } - + // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- @@ -498,37 +453,6 @@ // // --------------------------------------------------------------------------- // -void CUsbStateHostHandle::BadHubPositionL() - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BadHubPositionL" ) ); - - if (iTooMuchPowerTimer->IsActive()) - { - ChangeHostStateL(EUsbStateHostAInitiate); - iWatcher->BadHubPositionL(); - } - else - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DeviceAttachedL Unexpected situation" ) ); - } - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CUsbStateHostHandle::VBusErrorL() - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::VBusErrorL" ) ); - - iWatcher->Usb().BusClearError(); - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::VBusErrorL Unexpected situation" ) ); - } - -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// void CUsbStateHostHandle::MessageNotificationReceivedL(TInt) { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::MessageNotificationReceivedL" ) ); @@ -543,20 +467,16 @@ { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::SrpReceivedL" ) ); - if (CUsbVBusObserver::EVBusUp != iWatcher->VBusObserver()->VBus()) - { - TInt err = iWatcher->Usb().BusRespondSrp(); - if (KErrNone != err) + TInt err = iWatcher->Usb().BusRespondSrp(); + FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbStateHostHandle::SrpReceivedL BusRespondSrp()=%d" ), err)); + + if (KErrNone != err) { FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::SrpReceivedL BusRespondSrp error" ) ); - iWatcher->HandleHostProblemL(EUsbWatcherErrorInConnection); + iWhat = EUsbWatcherErrorInConnection; + DoHandleL(); + return; } - else - { - ChangeHostStateL(EUsbStateHostAInitiate); - } - } - } // --------------------------------------------------------------------------- @@ -568,38 +488,3 @@ FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::SessionRequestedL" ) ); } - -// From TimerObserver -// --------------------------------------------------------------------------- -// -// --------------------------------------------------------------------------- -// -void CUsbStateHostHandle::TimerElapsedL(TUsbTimerId aTimerId) - { - switch (aTimerId) - { - case ETooMuchPowerRequiredTimer: - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::TimerElapsedL - ETooMuchPowerRequiredTimer" ) ); - iWatcher->Usb().BusDrop(); - iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, - EUsbOtgTooMuchPowerRequired, this); - break; - } - case EDriversNotFoundTimer: - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::TimerElapsedL - EDriversNotFoundTimer" ) ); - // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped - iWatcher->Usb().BusDrop(); - iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, - EUsbOtgUnsupportedDevice, this); - - break; - } - default: - { - FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::TimerElapsedL - Unknown timer" ) ); - Panic(EWrongTimerId); - } - } - }