--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/shostmassstorage/msman/src/cusbotg.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -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 <e32cmn.h>
+#include <e32base.h>
+#include <d32otgdi.h>
+#include <e32property.h>
+
+#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<TBool> 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();
+ }