diff -r 000000000000 -r 96e5fb8b040d kerneltest/f32test/shostmassstorage/msman/src/cusbotg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/shostmassstorage/msman/src/cusbotg.cpp Thu Dec 17 09:24:54 2009 +0200 @@ -0,0 +1,270 @@ +// Copyright (c) 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: +// + +#include +#include +#include +#include + +#include "cusbotg.h" +#include "cusbotgwatcher.h" +#include "rusbmspublisher.h" + + +#include "tmslog.h" +#include "debug.h" + +_LIT(KOtgdiLddFileName, "otgdi"); + + +ROtgStateChangeNotifier::ROtgStateChangeNotifier() +: iRegistered(EFalse) + { + __MSFNSLOG + } + + +ROtgStateChangeNotifier::~ROtgStateChangeNotifier() + { + __MSFNSLOG + if (iRegistered) + iMessage.Complete(KErrDisconnected); + } + +/** +Initialise notifier to enable media change notfications. + +@param aMessage The message to commplete the notification +*/ +void ROtgStateChangeNotifier::Register(const RMessage2& aMessage) + { + __MSFNLOG + iRegistered = ETrue; + iMessage = aMessage; + } + + +void ROtgStateChangeNotifier::DoNotifyL() + { + __MSFNLOG + CompleteNotifierL(KErrNone); + } + + +void ROtgStateChangeNotifier::DoCancelL() + { + __MSFNLOG + CompleteNotifierL(KErrCancel); + } + + +void ROtgStateChangeNotifier::CompleteNotifierL(TInt aReason) + { + __MSFNLOG + if (iRegistered) + { + TBool changed = ETrue; + TPckgBuf p(changed); + iMessage.WriteL(0, p); + iMessage.Complete(aReason); + iRegistered = EFalse; + } + } + + +CUsbOtg* CUsbOtg::NewL() + { + __MSFNSLOG + CUsbOtg* self = new (ELeave) CUsbOtg(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +void CUsbOtg::ConstructL() + { + __MSFNLOG + + TInt r = User::LoadLogicalDevice(KOtgdiLddFileName); + + if (r != KErrNone && r != KErrAlreadyExists) + { + __USBOTGPRINT1(_L(" LoadLogicalDevice(KOtgdiLddFileName) error = %d"), r); + User::Leave(r); + } + + r = iUsbOtgDriver.Open(); + if (r != KErrNone && r != KErrAlreadyExists) + { + __USBOTGPRINT1(_L(" otg.Open fails %d"), r); + User::FreeLogicalDevice(RUsbOtgDriver::Name()); + User::Leave(r); + } + + StartL(); + + r = iUsbOtgDriver.StartStacks(); + if (r != KErrNone) + { + __USBOTGPRINT1(_L(" otg.StartStacks fails %d"), r); + User::FreeLogicalDevice(RUsbOtgDriver::Name()); + User::Leave(r); + } + + __USBOTGPRINT(_L(" otg stacks successfully started")); + } + + +CUsbOtg::CUsbOtg() +: iOtgState(KOtgStateStart) + { + __MSFNLOG + } + + +CUsbOtg::~CUsbOtg() + { + __MSFNLOG + Stop(); + + TInt r = iUsbOtgDriver.BusDrop(); + + // Unload OTGDI components if it was ever started + + if (iUsbOtgDriver.Handle()) + { + iUsbOtgDriver.StopStacks(); + iUsbOtgDriver.Close(); + + } + + TInt err = User::FreeLogicalDevice(RUsbOtgDriver::Name()); + } + + +void CUsbOtg::StartL() + { + __MSFNLOG + // Request Otg notifications + iOtgEventWatcher = CUsbOtgEventWatcher::NewL(iUsbOtgDriver, *this); + iOtgEventWatcher->Start(); + + iRequestSessionWatcher = CRequestSessionWatcher::NewL(*this); + } + + +void CUsbOtg::Stop() +/** + * Stop the USB OTG events watcher + */ + { + __MSFNLOG + + if (iOtgEventWatcher) + { + iOtgEventWatcher->Cancel(); + delete iOtgEventWatcher; + iOtgEventWatcher = NULL; + } + + if (iRequestSessionWatcher) + { + delete iRequestSessionWatcher; + iRequestSessionWatcher = NULL; + } + } + + +void CUsbOtg::BusRequestL() + { + __MSFNLOG + if (iOtgState == KOtgStateAPlugInserted) + { + TInt err = iUsbOtgDriver.BusRequest(); + if (err) + { + __USBOTGPRINT1(_L("OTG::BusRequest[%d] failed !"), err); + } + User::LeaveIfError(err); + iOtgState = KOtgStateSessionOpen; + } + + } + + +void CUsbOtg::HandleUsbOtgEvent(RUsbOtgDriver::TOtgEvent aEvent) + { + __MSFNLOG + + switch (aEvent) + { + case RUsbOtgDriver::EEventAPlugInserted: + { + __USBOTGPRINT(_L(">> UsbOtgEvent[EEventAPlugInserted]")); + /* + RUsbOtgEventPublisher eventPublisher; + eventPublisher.PublishEvent(aEvent); + */ + iNotifier.DoNotifyL(); + iOtgState = KOtgStateAPlugInserted; + } + break; + + case RUsbOtgDriver::EEventBusConnectionBusy: + { + RUsbManConnectionStatePublisher publisher; + publisher.PublishEvent(ETrue); + } + break; + case RUsbOtgDriver::EEventBusConnectionIdle: + { + RUsbManConnectionStatePublisher publisher; + publisher.PublishEvent(EFalse); + } + break; + default: + __USBOTGPRINT1(_L(">> UsbOtgEvent[%x]"), aEvent); + break; + } + } + + +TBool CUsbOtg::DeviceInserted() + { + __MSFNLOG + return iOtgState == KOtgStateAPlugInserted ? ETrue : EFalse; + } + +void CUsbOtg::NotifyChange(const RMessage2& aMessage) + { + __MSFNLOG + iNotifier.Register(aMessage); + } + + +void CUsbOtg::NotifyChangeCancel() + { + __MSFNLOG + iNotifier.DoCancelL(); + } + + +TInt CUsbOtg::BusDrop() + { + __MSFNLOG + return iUsbOtgDriver.BusDrop(); + }