os/kernelhwsrv/kerneltest/f32test/shostmassstorage/msman/src/cusbotg.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <e32cmn.h>
sl@0
    17
#include <e32base.h>
sl@0
    18
#include <d32otgdi.h>
sl@0
    19
#include <e32property.h>
sl@0
    20
sl@0
    21
#include "cusbotg.h"
sl@0
    22
#include "cusbotgwatcher.h"
sl@0
    23
#include "rusbmspublisher.h"
sl@0
    24
sl@0
    25
sl@0
    26
#include "tmslog.h"
sl@0
    27
#include "debug.h"
sl@0
    28
sl@0
    29
_LIT(KOtgdiLddFileName, "otgdi");
sl@0
    30
sl@0
    31
sl@0
    32
ROtgStateChangeNotifier::ROtgStateChangeNotifier()
sl@0
    33
:   iRegistered(EFalse)
sl@0
    34
    {
sl@0
    35
    __MSFNSLOG
sl@0
    36
    }
sl@0
    37
sl@0
    38
sl@0
    39
ROtgStateChangeNotifier::~ROtgStateChangeNotifier()
sl@0
    40
    {
sl@0
    41
    __MSFNSLOG
sl@0
    42
    if (iRegistered)
sl@0
    43
        iMessage.Complete(KErrDisconnected);
sl@0
    44
    }
sl@0
    45
sl@0
    46
/**
sl@0
    47
Initialise notifier to enable media change notfications.
sl@0
    48
sl@0
    49
@param aMessage The message to commplete the notification
sl@0
    50
*/
sl@0
    51
void ROtgStateChangeNotifier::Register(const RMessage2& aMessage)
sl@0
    52
    {
sl@0
    53
    __MSFNLOG
sl@0
    54
	iRegistered = ETrue;
sl@0
    55
	iMessage = aMessage;
sl@0
    56
    }
sl@0
    57
sl@0
    58
sl@0
    59
void ROtgStateChangeNotifier::DoNotifyL()
sl@0
    60
    {
sl@0
    61
	__MSFNLOG
sl@0
    62
	CompleteNotifierL(KErrNone);
sl@0
    63
    }
sl@0
    64
sl@0
    65
sl@0
    66
void ROtgStateChangeNotifier::DoCancelL()
sl@0
    67
    {
sl@0
    68
	__MSFNLOG
sl@0
    69
	CompleteNotifierL(KErrCancel);
sl@0
    70
    }
sl@0
    71
sl@0
    72
sl@0
    73
void ROtgStateChangeNotifier::CompleteNotifierL(TInt aReason)
sl@0
    74
	{
sl@0
    75
    __MSFNLOG
sl@0
    76
	if (iRegistered)
sl@0
    77
        {
sl@0
    78
		TBool changed = ETrue;
sl@0
    79
        TPckgBuf<TBool> p(changed);
sl@0
    80
		iMessage.WriteL(0, p);
sl@0
    81
		iMessage.Complete(aReason);
sl@0
    82
		iRegistered = EFalse;
sl@0
    83
        }
sl@0
    84
	}
sl@0
    85
sl@0
    86
sl@0
    87
CUsbOtg* CUsbOtg::NewL()
sl@0
    88
	{
sl@0
    89
    __MSFNSLOG
sl@0
    90
	CUsbOtg* self = new (ELeave) CUsbOtg();
sl@0
    91
	CleanupStack::PushL(self);
sl@0
    92
	self->ConstructL();
sl@0
    93
	CleanupStack::Pop(self);
sl@0
    94
	return self;
sl@0
    95
	}
sl@0
    96
sl@0
    97
sl@0
    98
void CUsbOtg::ConstructL()
sl@0
    99
	{
sl@0
   100
    __MSFNLOG
sl@0
   101
sl@0
   102
    TInt r = User::LoadLogicalDevice(KOtgdiLddFileName);
sl@0
   103
sl@0
   104
    if (r != KErrNone && r != KErrAlreadyExists)
sl@0
   105
        {
sl@0
   106
        __USBOTGPRINT1(_L("   LoadLogicalDevice(KOtgdiLddFileName) error = %d"), r);
sl@0
   107
        User::Leave(r);
sl@0
   108
        }
sl@0
   109
sl@0
   110
    r = iUsbOtgDriver.Open();
sl@0
   111
    if (r != KErrNone && r != KErrAlreadyExists)
sl@0
   112
        {
sl@0
   113
        __USBOTGPRINT1(_L("   otg.Open fails %d"), r);
sl@0
   114
        User::FreeLogicalDevice(RUsbOtgDriver::Name());
sl@0
   115
        User::Leave(r);
sl@0
   116
        }
sl@0
   117
sl@0
   118
    StartL();
sl@0
   119
sl@0
   120
    r = iUsbOtgDriver.StartStacks();
sl@0
   121
    if (r != KErrNone)
sl@0
   122
        {
sl@0
   123
        __USBOTGPRINT1(_L("   otg.StartStacks fails %d"), r);
sl@0
   124
        User::FreeLogicalDevice(RUsbOtgDriver::Name());
sl@0
   125
        User::Leave(r);
sl@0
   126
        }
sl@0
   127
sl@0
   128
    __USBOTGPRINT(_L("   otg stacks successfully started"));
sl@0
   129
	}
sl@0
   130
sl@0
   131
sl@0
   132
CUsbOtg::CUsbOtg()
sl@0
   133
:   iOtgState(KOtgStateStart)
sl@0
   134
    {
sl@0
   135
    __MSFNLOG
sl@0
   136
    }
sl@0
   137
sl@0
   138
sl@0
   139
CUsbOtg::~CUsbOtg()
sl@0
   140
	{
sl@0
   141
    __MSFNLOG
sl@0
   142
    Stop();
sl@0
   143
sl@0
   144
    TInt r = iUsbOtgDriver.BusDrop();
sl@0
   145
sl@0
   146
    // Unload OTGDI components if it was ever started
sl@0
   147
sl@0
   148
    if (iUsbOtgDriver.Handle())
sl@0
   149
        {
sl@0
   150
        iUsbOtgDriver.StopStacks();
sl@0
   151
        iUsbOtgDriver.Close();
sl@0
   152
sl@0
   153
        }
sl@0
   154
sl@0
   155
    TInt err = User::FreeLogicalDevice(RUsbOtgDriver::Name());
sl@0
   156
	}
sl@0
   157
sl@0
   158
sl@0
   159
void CUsbOtg::StartL()
sl@0
   160
    {
sl@0
   161
    __MSFNLOG
sl@0
   162
	// Request Otg notifications
sl@0
   163
    iOtgEventWatcher = CUsbOtgEventWatcher::NewL(iUsbOtgDriver, *this);
sl@0
   164
	iOtgEventWatcher->Start();
sl@0
   165
sl@0
   166
    iRequestSessionWatcher = CRequestSessionWatcher::NewL(*this);
sl@0
   167
    }
sl@0
   168
sl@0
   169
sl@0
   170
void CUsbOtg::Stop()
sl@0
   171
/**
sl@0
   172
 * Stop the USB OTG events watcher
sl@0
   173
 */
sl@0
   174
    {
sl@0
   175
    __MSFNLOG
sl@0
   176
sl@0
   177
    if (iOtgEventWatcher)
sl@0
   178
        {
sl@0
   179
        iOtgEventWatcher->Cancel();
sl@0
   180
        delete iOtgEventWatcher;
sl@0
   181
        iOtgEventWatcher = NULL;
sl@0
   182
        }
sl@0
   183
sl@0
   184
    if (iRequestSessionWatcher)
sl@0
   185
        {
sl@0
   186
        delete iRequestSessionWatcher;
sl@0
   187
        iRequestSessionWatcher = NULL;
sl@0
   188
        }
sl@0
   189
    }
sl@0
   190
sl@0
   191
sl@0
   192
void CUsbOtg::BusRequestL()
sl@0
   193
    {
sl@0
   194
    __MSFNLOG
sl@0
   195
    if (iOtgState == KOtgStateAPlugInserted)
sl@0
   196
        {
sl@0
   197
        TInt err = iUsbOtgDriver.BusRequest();
sl@0
   198
        if (err)
sl@0
   199
            {
sl@0
   200
            __USBOTGPRINT1(_L("OTG::BusRequest[%d] failed !"), err);
sl@0
   201
            }
sl@0
   202
        User::LeaveIfError(err);
sl@0
   203
        iOtgState = KOtgStateSessionOpen;
sl@0
   204
        }
sl@0
   205
sl@0
   206
    }
sl@0
   207
sl@0
   208
sl@0
   209
void CUsbOtg::HandleUsbOtgEvent(RUsbOtgDriver::TOtgEvent aEvent)
sl@0
   210
    {
sl@0
   211
    __MSFNLOG
sl@0
   212
sl@0
   213
    switch (aEvent)
sl@0
   214
        {
sl@0
   215
        case RUsbOtgDriver::EEventAPlugInserted:
sl@0
   216
            {
sl@0
   217
            __USBOTGPRINT(_L(">> UsbOtgEvent[EEventAPlugInserted]"));
sl@0
   218
            /*
sl@0
   219
            RUsbOtgEventPublisher eventPublisher;
sl@0
   220
            eventPublisher.PublishEvent(aEvent);
sl@0
   221
            */
sl@0
   222
            iNotifier.DoNotifyL();
sl@0
   223
            iOtgState = KOtgStateAPlugInserted;
sl@0
   224
            }
sl@0
   225
            break;
sl@0
   226
sl@0
   227
        case RUsbOtgDriver::EEventBusConnectionBusy:
sl@0
   228
            {
sl@0
   229
            RUsbManConnectionStatePublisher publisher;
sl@0
   230
            publisher.PublishEvent(ETrue);
sl@0
   231
            }
sl@0
   232
            break;
sl@0
   233
        case RUsbOtgDriver::EEventBusConnectionIdle:
sl@0
   234
            {
sl@0
   235
            RUsbManConnectionStatePublisher publisher;
sl@0
   236
            publisher.PublishEvent(EFalse);
sl@0
   237
            }
sl@0
   238
            break;
sl@0
   239
        default:
sl@0
   240
            __USBOTGPRINT1(_L(">> UsbOtgEvent[%x]"), aEvent);
sl@0
   241
            break;
sl@0
   242
        }
sl@0
   243
    }
sl@0
   244
sl@0
   245
sl@0
   246
TBool CUsbOtg::DeviceInserted()
sl@0
   247
    {
sl@0
   248
    __MSFNLOG
sl@0
   249
    return iOtgState == KOtgStateAPlugInserted ? ETrue : EFalse;
sl@0
   250
    }
sl@0
   251
sl@0
   252
void CUsbOtg::NotifyChange(const RMessage2& aMessage)
sl@0
   253
    {
sl@0
   254
    __MSFNLOG
sl@0
   255
    iNotifier.Register(aMessage);
sl@0
   256
    }
sl@0
   257
sl@0
   258
sl@0
   259
void CUsbOtg::NotifyChangeCancel()
sl@0
   260
    {
sl@0
   261
    __MSFNLOG
sl@0
   262
    iNotifier.DoCancelL();
sl@0
   263
    }
sl@0
   264
sl@0
   265
sl@0
   266
TInt CUsbOtg::BusDrop()
sl@0
   267
    {
sl@0
   268
    __MSFNLOG
sl@0
   269
    return iUsbOtgDriver.BusDrop();
sl@0
   270
    }