kernel/eka/drivers/sdapc/d_sdapc.cpp
author hgs
Mon, 04 Oct 2010 12:15:59 +0100
changeset 280 2bfb1feef9de
parent 148 31ea0f8e3c99
permissions -rw-r--r--
201039_08
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
148
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
     2
// All rights reserved.
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
     6
// at the URL " http://www.eclipse.org/legal/epl-v10.html ".
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
     7
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
     8
// Initial Contributors:
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    10
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    11
// Contributors:
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    12
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    13
// Description:
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    14
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    15
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    16
#include <kernel/kernel.h>
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    17
#include <drivers/mmc.h>
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    18
#include <drivers/sdcard.h>
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    19
#include <drivers/sdio/sdio.h>
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    20
#include <drivers/d_sdapc.h>
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    21
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    22
#include "OstTraceDefinitions.h"
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    23
#ifdef OST_TRACE_COMPILER_IN_USE
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    24
#include "locmedia_ost.h"
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    25
#ifdef __VC32__
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    26
#pragma warning(disable: 4127) // disabling warning "conditional expression is constant"
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    27
#endif
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    28
#include "d_sdapcTraces.h"
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    29
#endif
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    30
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    31
_LIT(KLddName,"D_SDAPC");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    32
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    33
const TInt KMajorVersionNumber=1;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    34
const TInt KMinorVersionNumber=0;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    35
const TInt KBuildVersionNumber=1;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    36
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    37
const TInt KSocketNumber = 0;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    38
const TInt KStackNumber  = 0;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    39
const TInt KCardNumber   = 0;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    40
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    41
// global Dfc Que
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    42
TDynamicDfcQue* gDfcQ;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    43
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    44
class DSDAuxiliaryPowerControlFactory : public DLogicalDevice
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    45
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    46
// LDD factory
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    47
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    48
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    49
public:
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    50
	DSDAuxiliaryPowerControlFactory();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    51
	~DSDAuxiliaryPowerControlFactory();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    52
	virtual TInt Install(); 					//overriding pure virtual
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    53
	virtual void GetCaps(TDes8& aDes) const;	//overriding pure virtual
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    54
	virtual TInt Create(DLogicalChannelBase*& aChannel); 	//overriding pure virtual
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    55
	};
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    56
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    57
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    58
class DSDAuxiliaryPowerControl : public DLogicalChannel
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    59
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    60
// Logical channel
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    61
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    62
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    63
public:
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    64
	DSDAuxiliaryPowerControl();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    65
	virtual ~DSDAuxiliaryPowerControl();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    66
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    67
protected:
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    68
	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    69
	virtual void HandleMsg(class TMessageBase *);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    70
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    71
private:
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    72
	static void BusCallBack(TAny* aPtr, TInt aReason, TAny* a1, TAny* a2);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    73
	TInt PowerUpStack();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    74
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    75
private:
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    76
	DMMCSocket* iSocketP;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    77
	DMMCStack*  iStackP;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    78
	TSDCard*  iCardP;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    79
    
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    80
	DThread* iClient;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    81
	
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    82
	TPBusCallBack iBusCallBack;		
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    83
	DSemaphore* iPowerUpSemaphore;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    84
	TBool iInitialised;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    85
	};
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    86
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    87
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    88
DECLARE_STANDARD_LDD()
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    89
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    90
	return new DSDAuxiliaryPowerControlFactory;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    91
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    92
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    93
DSDAuxiliaryPowerControlFactory::DSDAuxiliaryPowerControlFactory()
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    94
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    95
// Constructor
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    96
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    97
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    98
    OstTrace0( TRACE_FLOW, DSDAUXILIARYPOWERCONTROLFACTORY_DSDAUXILIARYPOWERCONTROLFACTORY, "DSDAuxiliaryPowerControlFactory::DSDAuxiliaryPowerControlFactory");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
    99
	__KTRACE_OPT(KPBUS1, Kern::Printf(">DSDAuxiliaryPowerControlFactory::DSDAuxiliaryPowerControlFactory"));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   100
    iParseMask=KDeviceAllowUnit;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   101
	iUnitsMask=0xffffffff;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   102
	iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   103
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   104
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   105
TInt DSDAuxiliaryPowerControlFactory::Create(DLogicalChannelBase*& aChannel)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   106
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   107
// Create a new DSDAuxiliaryPowerControl on this logical device
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   108
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   109
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   110
    OstTrace0( TRACE_FLOW, DSDAUXILIARYPOWERCONTROLFACTORY_CREATE, "DSDAuxiliaryPowerControlFactory::Create");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   111
	__KTRACE_OPT(KPBUS1, Kern::Printf(">DSDAuxiliaryPowerControlFactory::Create"));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   112
	aChannel=new DSDAuxiliaryPowerControl;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   113
	return aChannel ? KErrNone : KErrNoMemory;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   114
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   115
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   116
const TInt KDSDAuxiliaryPowerControlApiThreadPriority = 27;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   117
_LIT(KDSDAuxiliaryPowerControlApiThread,"DSDAuxiliaryPowerControlApiThread");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   118
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   119
TInt DSDAuxiliaryPowerControlFactory::Install()
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   120
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   121
// Install the LDD - overriding pure virtual
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   122
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   123
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   124
	// Allocate a kernel thread to run the DFC 
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   125
	TInt r = Kern::DynamicDfcQCreate(gDfcQ, KDSDAuxiliaryPowerControlApiThreadPriority, KDSDAuxiliaryPowerControlApiThread);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   126
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   127
	if (r != KErrNone)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   128
		return r; 	
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   129
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   130
	return SetName(&KLddName);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   131
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   132
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   133
void DSDAuxiliaryPowerControlFactory::GetCaps(TDes8& aDes) const
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   134
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   135
// Get capabilities - overriding pure virtual
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   136
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   137
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   138
	TCapsTestV01 b;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   139
	b.iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   140
    Kern::InfoCopy(aDes,(TUint8*)&b,sizeof(b));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   141
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   142
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   143
/**
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   144
  Destructor
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   145
*/
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   146
DSDAuxiliaryPowerControlFactory::~DSDAuxiliaryPowerControlFactory()
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   147
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   148
    OstTrace0( TRACE_FLOW, DSDAUXILIARYPOWERCONTROLFACTORY_DSDAUXILIARYPOWERCONTROLFACTORY_DTOR, "DSDAuxiliaryPowerControlFactory::~DSDAuxiliaryPowerControlFactory");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   149
	__KTRACE_OPT(KPBUS1, Kern::Printf(">DSDAuxiliaryPowerControlFactory::~DSDAuxiliaryPowerControlFactory"));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   150
	if (gDfcQ)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   151
		gDfcQ->Destroy();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   152
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   153
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   154
void DSDAuxiliaryPowerControl::BusCallBack(TAny* aPtr, TInt aReason, TAny* a1, TAny* a2)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   155
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   156
	DSDAuxiliaryPowerControl* pTest = (DSDAuxiliaryPowerControl*)aPtr;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   157
	TPBusState busState = (TPBusState) (TInt) a1;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   158
	switch (aReason)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   159
		{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   160
		case TPBusCallBack::EPBusStateChange:
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   161
			if (busState != EPBusPoweringUp)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   162
				Kern::SemaphoreSignal(*(pTest->iPowerUpSemaphore));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   163
			break;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   164
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   165
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   166
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   167
TInt DSDAuxiliaryPowerControl::PowerUpStack()
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   168
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   169
	iBusCallBack.iFunction = BusCallBack;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   170
	iBusCallBack.iPtr=this;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   171
	iBusCallBack.SetSocket(iSocketP->iSocketNumber);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   172
	iBusCallBack.Add();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   173
	TInt r = Kern::SemaphoreCreate(iPowerUpSemaphore, _L("SDPowerUpSem"), 0);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   174
	if (r == KErrNone)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   175
		{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   176
		r = iSocketP->PowerUp();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   177
		if (r == KErrNone)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   178
			Kern::SemaphoreWait(*iPowerUpSemaphore);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   179
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   180
	return r;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   181
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   182
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   183
TInt DSDAuxiliaryPowerControl::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& aVer)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   184
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   185
// Create channel
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   186
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   187
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   188
    OstTrace0( TRACE_FLOW, DSDAUXILIARYPOWERCONTROL_DOCREATE_1, "DSDAuxiliaryPowerControl::DoCreate()");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   189
	__KTRACE_OPT(KPBUS1, Kern::Printf(">DSDAuxiliaryPowerControl::DoCreate()"));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   190
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   191
	if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber),aVer))
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   192
		return KErrNotSupported;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   193
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   194
	//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   195
	// Obtain the appropriate card from the socket/stack
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   196
	//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   197
	iSocketP = static_cast<DMMCSocket*>(DPBusSocket::SocketFromId(KSocketNumber));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   198
	if(iSocketP == NULL)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   199
		{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   200
        OstTrace0( TRACE_FLOW, DSDAUXILIARYPOWERCONTROL_DOCREATE_2, "DSDAuxiliaryPowerControl::DoCreate() : Didn't obtain socket");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   201
		__KTRACE_OPT(KPBUS1, Kern::Printf("DSDAuxiliaryPowerControl::DoCreate() : Didn't obtain socket"));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   202
		return KErrNoMemory;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   203
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   204
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   205
	iStackP = static_cast<DSDStack*>(iSocketP->Stack(KStackNumber));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   206
	if(iStackP == NULL)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   207
		{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   208
        OstTrace0( TRACE_FLOW, DSDAUXILIARYPOWERCONTROL_DOCREATE_3, "DSDAuxiliaryPowerControl::DoCreate() : Didn't obtain stack");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   209
		__KTRACE_OPT(KPBUS1, Kern::Printf("DSDAuxiliaryPowerControl::DoCreate() : Didn't obtain stack"));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   210
		return KErrNoMemory;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   211
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   212
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   213
	iCardP = static_cast<TSDCard*>(iStackP->CardP(KCardNumber));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   214
	if(iCardP == NULL)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   215
		{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   216
        OstTrace0( TRACE_FLOW, DSDAUXILIARYPOWERCONTROL_DOCREATE_4, "DSDAuxiliaryPowerControl::DoCreate() : Didn't obtain card");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   217
		__KTRACE_OPT(KPBUS1, Kern::Printf("DSDAuxiliaryPowerControl::DoCreate() : Didn't obtain card"));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   218
		return KErrNoMemory;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   219
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   220
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   221
	SetDfcQ(gDfcQ);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   222
	iMsgQ.Receive();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   223
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   224
	// Make sure stack is powered up
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   225
	TInt r = PowerUpStack();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   226
	if (r != KErrNone && r != KErrCompletion)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   227
		{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   228
        OstTrace1( TRACE_FLOW, DSDAUXILIARYPOWERCONTROL_DOCREATE_5, "DSDAuxiliaryPowerControl::DoCreate() : Failed To Power up stack, r = %d", r);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   229
		__KTRACE_OPT(KPBUS1, Kern::Printf("DSDAuxiliaryPowerControl::DoCreate() : Failed To Power up stack, r = %d", r));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   230
		return r;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   231
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   232
		
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   233
	if(!iCardP->IsReady())
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   234
		{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   235
        OstTrace0( TRACE_FLOW, DSDAUXILIARYPOWERCONTROL_DOCREATE_6, "DSDAuxiliaryPowerControl::DoCreate() : Card not ready");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   236
		__KTRACE_OPT(KPBUS1, Kern::Printf("DSDAuxiliaryPowerControl::DoCreate() : Card not ready"));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   237
		return KErrNotReady;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   238
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   239
    	
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   240
	if(!iCardP->ClientsRegistered())
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   241
		{		
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   242
		iCardP->RegisterClient();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   243
		((DSDIOPsu*)(iSocketP->iVcc))->Lock();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   244
		TBool locked = ((DSDIOPsu*)(iSocketP->iVcc))->IsLocked();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   245
		OstTrace1( TRACE_FLOW, DSDAUXILIARYPOWERCONTROL_DOCREATE_7, "DSDAuxiliaryPowerControl::DoCreate() : PSU IsLocked(), locked = %d", locked);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   246
		__KTRACE_OPT(KPBUS1, Kern::Printf("DSDAuxiliaryPowerControl::DoCreate() : PSU IsLocked(), locked = %d", locked));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   247
		if(!locked)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   248
			return KErrNotReady;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   249
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   250
		
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   251
	return KErrNone;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   252
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   253
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   254
DSDAuxiliaryPowerControl::DSDAuxiliaryPowerControl()
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   255
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   256
// Constructor
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   257
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   258
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   259
	iClient=&Kern::CurrentThread();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   260
	((DObject*)iClient)->Open();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   261
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   262
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   263
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   264
DSDAuxiliaryPowerControl::~DSDAuxiliaryPowerControl()
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   265
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   266
// Destructor
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   267
//
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   268
	{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   269
    OstTrace0( TRACE_FLOW, DSDAUXILIARYPOWERCONTROL_DSDAUXILIARYPOWERCONTROL_DTOR, "DSDAuxiliaryPowerControl::~DSDAuxiliaryPowerControl");
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   270
	__KTRACE_OPT(KPBUS1, Kern::Printf("DSDAuxiliaryPowerControl::~DSDAuxiliaryPowerControl"));
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   271
	iBusCallBack.Remove();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   272
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   273
	if (iSocketP)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   274
		iSocketP->ControlIO(DPBusSocket::EControlMediaState, (TAny*)DPBusSocket::EPeriphBusMediaNormal, NULL);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   275
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   276
	
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   277
	if(iCardP->ClientsRegistered())
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   278
		{		
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   279
		iCardP->DeregisterClient();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   280
		((DSDIOPsu*)(iSocketP->iVcc))->Unlock();
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   281
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   282
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   283
	iPowerUpSemaphore->Close(NULL);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   284
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   285
	Kern::SafeClose((DObject*&)iClient,NULL);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   286
	}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   287
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   288
void DSDAuxiliaryPowerControl::HandleMsg(TMessageBase* aMsg)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   289
    {
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   290
    TThreadMessage& m=*(TThreadMessage*)aMsg;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   291
    TInt id=m.iValue;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   292
    
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   293
	if (id==(TInt)ECloseMsg)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   294
		{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   295
		if (iSocketP)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   296
			iSocketP->ControlIO(DPBusSocket::EControlMediaState, (TAny*)DPBusSocket::EPeriphBusMediaNormal, NULL);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   297
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   298
		m.Complete(KErrNone, EFalse);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   299
		return;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   300
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   301
    else if (id==KMaxTInt)
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   302
		{
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   303
		// DoCancel
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   304
		m.Complete(KErrNone,ETrue);
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   305
		return;
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   306
		}
31ea0f8e3c99 201021_18
hgs
parents:
diff changeset
   307
	}