sl@0: // Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include "cusbotg.h" sl@0: #include "cusbotgwatcher.h" sl@0: #include "rusbmspublisher.h" sl@0: sl@0: sl@0: #include "tmslog.h" sl@0: #include "debug.h" sl@0: sl@0: _LIT(KOtgdiLddFileName, "otgdi"); sl@0: sl@0: sl@0: ROtgStateChangeNotifier::ROtgStateChangeNotifier() sl@0: : iRegistered(EFalse) sl@0: { sl@0: __MSFNSLOG sl@0: } sl@0: sl@0: sl@0: ROtgStateChangeNotifier::~ROtgStateChangeNotifier() sl@0: { sl@0: __MSFNSLOG sl@0: if (iRegistered) sl@0: iMessage.Complete(KErrDisconnected); sl@0: } sl@0: sl@0: /** sl@0: Initialise notifier to enable media change notfications. sl@0: sl@0: @param aMessage The message to commplete the notification sl@0: */ sl@0: void ROtgStateChangeNotifier::Register(const RMessage2& aMessage) sl@0: { sl@0: __MSFNLOG sl@0: iRegistered = ETrue; sl@0: iMessage = aMessage; sl@0: } sl@0: sl@0: sl@0: void ROtgStateChangeNotifier::DoNotifyL() sl@0: { sl@0: __MSFNLOG sl@0: CompleteNotifierL(KErrNone); sl@0: } sl@0: sl@0: sl@0: void ROtgStateChangeNotifier::DoCancelL() sl@0: { sl@0: __MSFNLOG sl@0: CompleteNotifierL(KErrCancel); sl@0: } sl@0: sl@0: sl@0: void ROtgStateChangeNotifier::CompleteNotifierL(TInt aReason) sl@0: { sl@0: __MSFNLOG sl@0: if (iRegistered) sl@0: { sl@0: TBool changed = ETrue; sl@0: TPckgBuf p(changed); sl@0: iMessage.WriteL(0, p); sl@0: iMessage.Complete(aReason); sl@0: iRegistered = EFalse; sl@0: } sl@0: } sl@0: sl@0: sl@0: CUsbOtg* CUsbOtg::NewL() sl@0: { sl@0: __MSFNSLOG sl@0: CUsbOtg* self = new (ELeave) CUsbOtg(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: void CUsbOtg::ConstructL() sl@0: { sl@0: __MSFNLOG sl@0: sl@0: TInt r = User::LoadLogicalDevice(KOtgdiLddFileName); sl@0: sl@0: if (r != KErrNone && r != KErrAlreadyExists) sl@0: { sl@0: __USBOTGPRINT1(_L(" LoadLogicalDevice(KOtgdiLddFileName) error = %d"), r); sl@0: User::Leave(r); sl@0: } sl@0: sl@0: r = iUsbOtgDriver.Open(); sl@0: if (r != KErrNone && r != KErrAlreadyExists) sl@0: { sl@0: __USBOTGPRINT1(_L(" otg.Open fails %d"), r); sl@0: User::FreeLogicalDevice(RUsbOtgDriver::Name()); sl@0: User::Leave(r); sl@0: } sl@0: sl@0: StartL(); sl@0: sl@0: r = iUsbOtgDriver.StartStacks(); sl@0: if (r != KErrNone) sl@0: { sl@0: __USBOTGPRINT1(_L(" otg.StartStacks fails %d"), r); sl@0: User::FreeLogicalDevice(RUsbOtgDriver::Name()); sl@0: User::Leave(r); sl@0: } sl@0: sl@0: __USBOTGPRINT(_L(" otg stacks successfully started")); sl@0: } sl@0: sl@0: sl@0: CUsbOtg::CUsbOtg() sl@0: : iOtgState(KOtgStateStart) sl@0: { sl@0: __MSFNLOG sl@0: } sl@0: sl@0: sl@0: CUsbOtg::~CUsbOtg() sl@0: { sl@0: __MSFNLOG sl@0: Stop(); sl@0: sl@0: TInt r = iUsbOtgDriver.BusDrop(); sl@0: sl@0: // Unload OTGDI components if it was ever started sl@0: sl@0: if (iUsbOtgDriver.Handle()) sl@0: { sl@0: iUsbOtgDriver.StopStacks(); sl@0: iUsbOtgDriver.Close(); sl@0: sl@0: } sl@0: sl@0: TInt err = User::FreeLogicalDevice(RUsbOtgDriver::Name()); sl@0: } sl@0: sl@0: sl@0: void CUsbOtg::StartL() sl@0: { sl@0: __MSFNLOG sl@0: // Request Otg notifications sl@0: iOtgEventWatcher = CUsbOtgEventWatcher::NewL(iUsbOtgDriver, *this); sl@0: iOtgEventWatcher->Start(); sl@0: sl@0: iRequestSessionWatcher = CRequestSessionWatcher::NewL(*this); sl@0: } sl@0: sl@0: sl@0: void CUsbOtg::Stop() sl@0: /** sl@0: * Stop the USB OTG events watcher sl@0: */ sl@0: { sl@0: __MSFNLOG sl@0: sl@0: if (iOtgEventWatcher) sl@0: { sl@0: iOtgEventWatcher->Cancel(); sl@0: delete iOtgEventWatcher; sl@0: iOtgEventWatcher = NULL; sl@0: } sl@0: sl@0: if (iRequestSessionWatcher) sl@0: { sl@0: delete iRequestSessionWatcher; sl@0: iRequestSessionWatcher = NULL; sl@0: } sl@0: } sl@0: sl@0: sl@0: void CUsbOtg::BusRequestL() sl@0: { sl@0: __MSFNLOG sl@0: if (iOtgState == KOtgStateAPlugInserted) sl@0: { sl@0: TInt err = iUsbOtgDriver.BusRequest(); sl@0: if (err) sl@0: { sl@0: __USBOTGPRINT1(_L("OTG::BusRequest[%d] failed !"), err); sl@0: } sl@0: User::LeaveIfError(err); sl@0: iOtgState = KOtgStateSessionOpen; sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: void CUsbOtg::HandleUsbOtgEvent(RUsbOtgDriver::TOtgEvent aEvent) sl@0: { sl@0: __MSFNLOG sl@0: sl@0: switch (aEvent) sl@0: { sl@0: case RUsbOtgDriver::EEventAPlugInserted: sl@0: { sl@0: __USBOTGPRINT(_L(">> UsbOtgEvent[EEventAPlugInserted]")); sl@0: /* sl@0: RUsbOtgEventPublisher eventPublisher; sl@0: eventPublisher.PublishEvent(aEvent); sl@0: */ sl@0: iNotifier.DoNotifyL(); sl@0: iOtgState = KOtgStateAPlugInserted; sl@0: } sl@0: break; sl@0: sl@0: case RUsbOtgDriver::EEventBusConnectionBusy: sl@0: { sl@0: RUsbManConnectionStatePublisher publisher; sl@0: publisher.PublishEvent(ETrue); sl@0: } sl@0: break; sl@0: case RUsbOtgDriver::EEventBusConnectionIdle: sl@0: { sl@0: RUsbManConnectionStatePublisher publisher; sl@0: publisher.PublishEvent(EFalse); sl@0: } sl@0: break; sl@0: default: sl@0: __USBOTGPRINT1(_L(">> UsbOtgEvent[%x]"), aEvent); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: TBool CUsbOtg::DeviceInserted() sl@0: { sl@0: __MSFNLOG sl@0: return iOtgState == KOtgStateAPlugInserted ? ETrue : EFalse; sl@0: } sl@0: sl@0: void CUsbOtg::NotifyChange(const RMessage2& aMessage) sl@0: { sl@0: __MSFNLOG sl@0: iNotifier.Register(aMessage); sl@0: } sl@0: sl@0: sl@0: void CUsbOtg::NotifyChangeCancel() sl@0: { sl@0: __MSFNLOG sl@0: iNotifier.DoCancelL(); sl@0: } sl@0: sl@0: sl@0: TInt CUsbOtg::BusDrop() sl@0: { sl@0: __MSFNLOG sl@0: return iUsbOtgDriver.BusDrop(); sl@0: }