kerneltest/e32test/pccd/d_mmctest.cpp
author hgs
Mon, 04 Oct 2010 12:03:52 +0100
changeset 279 957c583b417b
permissions -rw-r--r--
201039_07
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
279
957c583b417b 201039_07
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
957c583b417b 201039_07
hgs
parents:
diff changeset
     2
// All rights reserved.
957c583b417b 201039_07
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
957c583b417b 201039_07
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
957c583b417b 201039_07
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
957c583b417b 201039_07
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
957c583b417b 201039_07
hgs
parents:
diff changeset
     7
//
957c583b417b 201039_07
hgs
parents:
diff changeset
     8
// Initial Contributors:
957c583b417b 201039_07
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
957c583b417b 201039_07
hgs
parents:
diff changeset
    10
//
957c583b417b 201039_07
hgs
parents:
diff changeset
    11
// Contributors:
957c583b417b 201039_07
hgs
parents:
diff changeset
    12
//
957c583b417b 201039_07
hgs
parents:
diff changeset
    13
// Description:
957c583b417b 201039_07
hgs
parents:
diff changeset
    14
// This LDD provides a set of direct interface functions with the kernel 
957c583b417b 201039_07
hgs
parents:
diff changeset
    15
// MultiMediaCard Controller
957c583b417b 201039_07
hgs
parents:
diff changeset
    16
// 
957c583b417b 201039_07
hgs
parents:
diff changeset
    17
//
957c583b417b 201039_07
hgs
parents:
diff changeset
    18
957c583b417b 201039_07
hgs
parents:
diff changeset
    19
#include <kernel/kernel.h>
957c583b417b 201039_07
hgs
parents:
diff changeset
    20
#include <drivers/mmc.h>
957c583b417b 201039_07
hgs
parents:
diff changeset
    21
#include "d_mmctest.h"
957c583b417b 201039_07
hgs
parents:
diff changeset
    22
957c583b417b 201039_07
hgs
parents:
diff changeset
    23
const TInt KMajorVersionNumber=1;
957c583b417b 201039_07
hgs
parents:
diff changeset
    24
const TInt KMinorVersionNumber=0;
957c583b417b 201039_07
hgs
parents:
diff changeset
    25
const TInt KBuildVersionNumber=0;
957c583b417b 201039_07
hgs
parents:
diff changeset
    26
957c583b417b 201039_07
hgs
parents:
diff changeset
    27
const TInt KStackNumber  = 0;
957c583b417b 201039_07
hgs
parents:
diff changeset
    28
957c583b417b 201039_07
hgs
parents:
diff changeset
    29
const TInt KMaxMMCCardsPerStack = 4;
957c583b417b 201039_07
hgs
parents:
diff changeset
    30
957c583b417b 201039_07
hgs
parents:
diff changeset
    31
// global Dfc Que
957c583b417b 201039_07
hgs
parents:
diff changeset
    32
TDynamicDfcQue* gDfcQ;
957c583b417b 201039_07
hgs
parents:
diff changeset
    33
957c583b417b 201039_07
hgs
parents:
diff changeset
    34
class DLddFactoryMmcCntrlInterface : public DLogicalDevice
957c583b417b 201039_07
hgs
parents:
diff changeset
    35
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
    36
public:
957c583b417b 201039_07
hgs
parents:
diff changeset
    37
	DLddFactoryMmcCntrlInterface();
957c583b417b 201039_07
hgs
parents:
diff changeset
    38
	virtual ~DLddFactoryMmcCntrlInterface();
957c583b417b 201039_07
hgs
parents:
diff changeset
    39
	virtual TInt Install();
957c583b417b 201039_07
hgs
parents:
diff changeset
    40
	virtual void GetCaps(TDes8 &aDes) const;
957c583b417b 201039_07
hgs
parents:
diff changeset
    41
	virtual TInt Create(DLogicalChannelBase*& aChannel); 	//overriding pure virtual
957c583b417b 201039_07
hgs
parents:
diff changeset
    42
	};
957c583b417b 201039_07
hgs
parents:
diff changeset
    43
957c583b417b 201039_07
hgs
parents:
diff changeset
    44
class DLddMmcCntrlInterface : public DLogicalChannel
957c583b417b 201039_07
hgs
parents:
diff changeset
    45
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
    46
public:
957c583b417b 201039_07
hgs
parents:
diff changeset
    47
	DLddMmcCntrlInterface();
957c583b417b 201039_07
hgs
parents:
diff changeset
    48
	~DLddMmcCntrlInterface();
957c583b417b 201039_07
hgs
parents:
diff changeset
    49
protected:
957c583b417b 201039_07
hgs
parents:
diff changeset
    50
	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
957c583b417b 201039_07
hgs
parents:
diff changeset
    51
	virtual void HandleMsg(class TMessageBase *);
957c583b417b 201039_07
hgs
parents:
diff changeset
    52
private:
957c583b417b 201039_07
hgs
parents:
diff changeset
    53
	void DoCancel(TInt aReqNo);
957c583b417b 201039_07
hgs
parents:
diff changeset
    54
	TInt DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2);
957c583b417b 201039_07
hgs
parents:
diff changeset
    55
	TInt DoControl(TInt aFunction, TAny* a1, TAny* a2);
957c583b417b 201039_07
hgs
parents:
diff changeset
    56
	TInt PrintCardInfo();	
957c583b417b 201039_07
hgs
parents:
diff changeset
    57
private:
957c583b417b 201039_07
hgs
parents:
diff changeset
    58
    void Reset();
957c583b417b 201039_07
hgs
parents:
diff changeset
    59
    static void SessionEndCallBack(TAny *aPtr);
957c583b417b 201039_07
hgs
parents:
diff changeset
    60
    static void SessionEndDfc(TAny *aPtr);
957c583b417b 201039_07
hgs
parents:
diff changeset
    61
	static void EventCallBack(TAny* aPtr, TInt aReason, TAny* a1, TAny* a2);
957c583b417b 201039_07
hgs
parents:
diff changeset
    62
957c583b417b 201039_07
hgs
parents:
diff changeset
    63
private:
957c583b417b 201039_07
hgs
parents:
diff changeset
    64
    enum TPanic {EReadDes,EWriteDes,EWriteTInt,EUnknownMmcSes};
957c583b417b 201039_07
hgs
parents:
diff changeset
    65
    enum TMmcSessionCmd {EMmcSesNone,EMmcSesReadBlk,EMmcSesWriteBlk, EMmcSesReadExtCSD};
957c583b417b 201039_07
hgs
parents:
diff changeset
    66
    TInt iStackNum;
957c583b417b 201039_07
hgs
parents:
diff changeset
    67
	DMMCSocket* iSocketP;
957c583b417b 201039_07
hgs
parents:
diff changeset
    68
    DMMCStack* iStack;
957c583b417b 201039_07
hgs
parents:
diff changeset
    69
    TMMCard* iCard;
957c583b417b 201039_07
hgs
parents:
diff changeset
    70
    DMMCSession* iSession;
957c583b417b 201039_07
hgs
parents:
diff changeset
    71
    TMmcSessionCmd iMmcSessionCmd;
957c583b417b 201039_07
hgs
parents:
diff changeset
    72
    TAny* iClientDesPtr;
957c583b417b 201039_07
hgs
parents:
diff changeset
    73
	TUint32 iBlkOffet;
957c583b417b 201039_07
hgs
parents:
diff changeset
    74
	TRequestStatus* iReadWriteStatusP;
957c583b417b 201039_07
hgs
parents:
diff changeset
    75
    TMMCCallBack iSessionEndCallBack;
957c583b417b 201039_07
hgs
parents:
diff changeset
    76
	TDfc iSessionEndDfc;
957c583b417b 201039_07
hgs
parents:
diff changeset
    77
	TPBusCallBack iBusEventCallback;
957c583b417b 201039_07
hgs
parents:
diff changeset
    78
	TRequestStatus* iPowerUpStatusP;
957c583b417b 201039_07
hgs
parents:
diff changeset
    79
//	TUint8 iBuf[KDrvBufSizeInBytes];	// iBuf now uses the MMC DMA buffer, until DT issue with H4 is resolved
957c583b417b 201039_07
hgs
parents:
diff changeset
    80
	TUint8* iBuf;
957c583b417b 201039_07
hgs
parents:
diff changeset
    81
	DThread* iClient;
957c583b417b 201039_07
hgs
parents:
diff changeset
    82
	TExtendedCSD iExtendedCSD;
957c583b417b 201039_07
hgs
parents:
diff changeset
    83
    };
957c583b417b 201039_07
hgs
parents:
diff changeset
    84
957c583b417b 201039_07
hgs
parents:
diff changeset
    85
DECLARE_STANDARD_LDD()
957c583b417b 201039_07
hgs
parents:
diff changeset
    86
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
    87
	return new DLddFactoryMmcCntrlInterface;
957c583b417b 201039_07
hgs
parents:
diff changeset
    88
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
    89
957c583b417b 201039_07
hgs
parents:
diff changeset
    90
DLddFactoryMmcCntrlInterface::DLddFactoryMmcCntrlInterface()
957c583b417b 201039_07
hgs
parents:
diff changeset
    91
//
957c583b417b 201039_07
hgs
parents:
diff changeset
    92
// Constructor
957c583b417b 201039_07
hgs
parents:
diff changeset
    93
//
957c583b417b 201039_07
hgs
parents:
diff changeset
    94
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
    95
957c583b417b 201039_07
hgs
parents:
diff changeset
    96
    iParseMask=KDeviceAllowUnit;  // Pass stack number as unit
957c583b417b 201039_07
hgs
parents:
diff changeset
    97
	iUnitsMask=0xffffffff;
957c583b417b 201039_07
hgs
parents:
diff changeset
    98
	iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
957c583b417b 201039_07
hgs
parents:
diff changeset
    99
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   100
957c583b417b 201039_07
hgs
parents:
diff changeset
   101
TInt DLddFactoryMmcCntrlInterface::Create(DLogicalChannelBase*& aChannel)
957c583b417b 201039_07
hgs
parents:
diff changeset
   102
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   103
// Create a new DLddFactoryMmcCntrlInterface on this logical device
957c583b417b 201039_07
hgs
parents:
diff changeset
   104
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   105
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   106
	aChannel=new DLddMmcCntrlInterface;
957c583b417b 201039_07
hgs
parents:
diff changeset
   107
	return aChannel ? KErrNone : KErrNoMemory;
957c583b417b 201039_07
hgs
parents:
diff changeset
   108
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   109
957c583b417b 201039_07
hgs
parents:
diff changeset
   110
const TInt KDMmcThreadPriority = 27;
957c583b417b 201039_07
hgs
parents:
diff changeset
   111
_LIT(KDMmcThread,"DMmcTestThread");
957c583b417b 201039_07
hgs
parents:
diff changeset
   112
957c583b417b 201039_07
hgs
parents:
diff changeset
   113
TInt DLddFactoryMmcCntrlInterface::Install()
957c583b417b 201039_07
hgs
parents:
diff changeset
   114
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   115
// Install the device driver.
957c583b417b 201039_07
hgs
parents:
diff changeset
   116
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   117
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   118
	// Allocate a kernel thread to run the DFC 
957c583b417b 201039_07
hgs
parents:
diff changeset
   119
	TInt r = Kern::DynamicDfcQCreate(gDfcQ, KDMmcThreadPriority, KDMmcThread);
957c583b417b 201039_07
hgs
parents:
diff changeset
   120
957c583b417b 201039_07
hgs
parents:
diff changeset
   121
	if (r != KErrNone)
957c583b417b 201039_07
hgs
parents:
diff changeset
   122
		return r; 	
957c583b417b 201039_07
hgs
parents:
diff changeset
   123
957c583b417b 201039_07
hgs
parents:
diff changeset
   124
    TPtrC name=_L("MmcTest");
957c583b417b 201039_07
hgs
parents:
diff changeset
   125
	return(SetName(&name));
957c583b417b 201039_07
hgs
parents:
diff changeset
   126
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   127
957c583b417b 201039_07
hgs
parents:
diff changeset
   128
void DLddFactoryMmcCntrlInterface::GetCaps(TDes8 &aDes) const
957c583b417b 201039_07
hgs
parents:
diff changeset
   129
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   130
// Return the Pc Card Contoller Interface ldd's capabilities.
957c583b417b 201039_07
hgs
parents:
diff changeset
   131
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   132
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   133
957c583b417b 201039_07
hgs
parents:
diff changeset
   134
    TCapsMmcIfV01 b;
957c583b417b 201039_07
hgs
parents:
diff changeset
   135
	b.version=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber);
957c583b417b 201039_07
hgs
parents:
diff changeset
   136
    Kern::InfoCopy(aDes,(TUint8*)&b,sizeof(b));
957c583b417b 201039_07
hgs
parents:
diff changeset
   137
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   138
957c583b417b 201039_07
hgs
parents:
diff changeset
   139
/**
957c583b417b 201039_07
hgs
parents:
diff changeset
   140
  Destructor
957c583b417b 201039_07
hgs
parents:
diff changeset
   141
*/
957c583b417b 201039_07
hgs
parents:
diff changeset
   142
DLddFactoryMmcCntrlInterface::~DLddFactoryMmcCntrlInterface()
957c583b417b 201039_07
hgs
parents:
diff changeset
   143
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   144
	if (gDfcQ)
957c583b417b 201039_07
hgs
parents:
diff changeset
   145
		gDfcQ->Destroy();
957c583b417b 201039_07
hgs
parents:
diff changeset
   146
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   147
957c583b417b 201039_07
hgs
parents:
diff changeset
   148
#pragma warning( disable : 4355 )	// this used in initializer list
957c583b417b 201039_07
hgs
parents:
diff changeset
   149
DLddMmcCntrlInterface::DLddMmcCntrlInterface()
957c583b417b 201039_07
hgs
parents:
diff changeset
   150
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   151
// Constructor
957c583b417b 201039_07
hgs
parents:
diff changeset
   152
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   153
	: iSessionEndCallBack(DLddMmcCntrlInterface::SessionEndCallBack,this),
957c583b417b 201039_07
hgs
parents:
diff changeset
   154
	  iSessionEndDfc(DLddMmcCntrlInterface::SessionEndDfc, this, 1),
957c583b417b 201039_07
hgs
parents:
diff changeset
   155
	  iBusEventCallback(DLddMmcCntrlInterface::EventCallBack, this)
957c583b417b 201039_07
hgs
parents:
diff changeset
   156
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   157
957c583b417b 201039_07
hgs
parents:
diff changeset
   158
//	iMmcController=NULL;
957c583b417b 201039_07
hgs
parents:
diff changeset
   159
//  iStackNum=0;
957c583b417b 201039_07
hgs
parents:
diff changeset
   160
//  iStack=NULL;
957c583b417b 201039_07
hgs
parents:
diff changeset
   161
//  iCard=NULL;
957c583b417b 201039_07
hgs
parents:
diff changeset
   162
//  iSession=NULL;
957c583b417b 201039_07
hgs
parents:
diff changeset
   163
//  iMmcSessionCmd=EMmcSesNone;
957c583b417b 201039_07
hgs
parents:
diff changeset
   164
//  iClientDesPtr=NULL;
957c583b417b 201039_07
hgs
parents:
diff changeset
   165
//	iBlkOffet=0;
957c583b417b 201039_07
hgs
parents:
diff changeset
   166
957c583b417b 201039_07
hgs
parents:
diff changeset
   167
	iClient=&Kern::CurrentThread();
957c583b417b 201039_07
hgs
parents:
diff changeset
   168
	((DObject*)iClient)->Open();	// can't fail since thread is running
957c583b417b 201039_07
hgs
parents:
diff changeset
   169
    }
957c583b417b 201039_07
hgs
parents:
diff changeset
   170
#pragma warning( default : 4355 )
957c583b417b 201039_07
hgs
parents:
diff changeset
   171
957c583b417b 201039_07
hgs
parents:
diff changeset
   172
DLddMmcCntrlInterface::~DLddMmcCntrlInterface()
957c583b417b 201039_07
hgs
parents:
diff changeset
   173
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   174
// Destructor
957c583b417b 201039_07
hgs
parents:
diff changeset
   175
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   176
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   177
957c583b417b 201039_07
hgs
parents:
diff changeset
   178
    Reset();
957c583b417b 201039_07
hgs
parents:
diff changeset
   179
	iBusEventCallback.Remove();
957c583b417b 201039_07
hgs
parents:
diff changeset
   180
	delete iSession;
957c583b417b 201039_07
hgs
parents:
diff changeset
   181
	Kern::SafeClose((DObject*&)iClient,NULL);
957c583b417b 201039_07
hgs
parents:
diff changeset
   182
    }
957c583b417b 201039_07
hgs
parents:
diff changeset
   183
957c583b417b 201039_07
hgs
parents:
diff changeset
   184
TInt DLddMmcCntrlInterface::DoCreate(TInt aUnit, const TDesC8* /*aInfo*/, const TVersion& aVer)
957c583b417b 201039_07
hgs
parents:
diff changeset
   185
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   186
// Create channel.
957c583b417b 201039_07
hgs
parents:
diff changeset
   187
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   188
	{    
957c583b417b 201039_07
hgs
parents:
diff changeset
   189
	if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber),aVer))
957c583b417b 201039_07
hgs
parents:
diff changeset
   190
		return(KErrNotSupported);
957c583b417b 201039_07
hgs
parents:
diff changeset
   191
957c583b417b 201039_07
hgs
parents:
diff changeset
   192
	//
957c583b417b 201039_07
hgs
parents:
diff changeset
   193
	// Obtain the appropriate card from the socket/stack
957c583b417b 201039_07
hgs
parents:
diff changeset
   194
	//
957c583b417b 201039_07
hgs
parents:
diff changeset
   195
	iSocketP = static_cast<DMMCSocket*>(DPBusSocket::SocketFromId(aUnit));
957c583b417b 201039_07
hgs
parents:
diff changeset
   196
	if(iSocketP == NULL)
957c583b417b 201039_07
hgs
parents:
diff changeset
   197
		return(KErrNoMemory);
957c583b417b 201039_07
hgs
parents:
diff changeset
   198
957c583b417b 201039_07
hgs
parents:
diff changeset
   199
	iStack = static_cast<DMMCStack*>(iSocketP->Stack(KStackNumber));
957c583b417b 201039_07
hgs
parents:
diff changeset
   200
	if(iStack == NULL)
957c583b417b 201039_07
hgs
parents:
diff changeset
   201
		return(KErrNoMemory);
957c583b417b 201039_07
hgs
parents:
diff changeset
   202
957c583b417b 201039_07
hgs
parents:
diff changeset
   203
    // Create an MMC session object
957c583b417b 201039_07
hgs
parents:
diff changeset
   204
	iSession = iStack->AllocSession(iSessionEndCallBack);
957c583b417b 201039_07
hgs
parents:
diff changeset
   205
    if (iSession==NULL)
957c583b417b 201039_07
hgs
parents:
diff changeset
   206
		return(KErrNoMemory);
957c583b417b 201039_07
hgs
parents:
diff changeset
   207
		
957c583b417b 201039_07
hgs
parents:
diff changeset
   208
    iSession->SetStack(iStack);
957c583b417b 201039_07
hgs
parents:
diff changeset
   209
   
957c583b417b 201039_07
hgs
parents:
diff changeset
   210
	TUint8* buf;
957c583b417b 201039_07
hgs
parents:
diff changeset
   211
	TInt bufLen;
957c583b417b 201039_07
hgs
parents:
diff changeset
   212
	TInt minorBufLen;
957c583b417b 201039_07
hgs
parents:
diff changeset
   213
	iStack->BufferInfo(buf, bufLen, minorBufLen);
957c583b417b 201039_07
hgs
parents:
diff changeset
   214
	iBuf = buf;
957c583b417b 201039_07
hgs
parents:
diff changeset
   215
957c583b417b 201039_07
hgs
parents:
diff changeset
   216
	SetDfcQ(gDfcQ);
957c583b417b 201039_07
hgs
parents:
diff changeset
   217
	iMsgQ.Receive();
957c583b417b 201039_07
hgs
parents:
diff changeset
   218
	
957c583b417b 201039_07
hgs
parents:
diff changeset
   219
	iSessionEndDfc.SetDfcQ(gDfcQ);
957c583b417b 201039_07
hgs
parents:
diff changeset
   220
957c583b417b 201039_07
hgs
parents:
diff changeset
   221
	iBusEventCallback.SetSocket(aUnit);
957c583b417b 201039_07
hgs
parents:
diff changeset
   222
	iBusEventCallback.Add();
957c583b417b 201039_07
hgs
parents:
diff changeset
   223
957c583b417b 201039_07
hgs
parents:
diff changeset
   224
    return(KErrNone);
957c583b417b 201039_07
hgs
parents:
diff changeset
   225
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   226
957c583b417b 201039_07
hgs
parents:
diff changeset
   227
void DLddMmcCntrlInterface::DoCancel(TInt /*aReqNo*/)
957c583b417b 201039_07
hgs
parents:
diff changeset
   228
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   229
// Cancel an outstanding request.
957c583b417b 201039_07
hgs
parents:
diff changeset
   230
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   231
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   232
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   233
957c583b417b 201039_07
hgs
parents:
diff changeset
   234
void DLddMmcCntrlInterface::HandleMsg(TMessageBase* aMsg)
957c583b417b 201039_07
hgs
parents:
diff changeset
   235
    {
957c583b417b 201039_07
hgs
parents:
diff changeset
   236
    TThreadMessage& m=*(TThreadMessage*)aMsg;
957c583b417b 201039_07
hgs
parents:
diff changeset
   237
    TInt id=m.iValue;
957c583b417b 201039_07
hgs
parents:
diff changeset
   238
    
957c583b417b 201039_07
hgs
parents:
diff changeset
   239
	if (id==(TInt)ECloseMsg)
957c583b417b 201039_07
hgs
parents:
diff changeset
   240
		{
957c583b417b 201039_07
hgs
parents:
diff changeset
   241
		m.Complete(KErrNone, EFalse);
957c583b417b 201039_07
hgs
parents:
diff changeset
   242
		return;
957c583b417b 201039_07
hgs
parents:
diff changeset
   243
		}
957c583b417b 201039_07
hgs
parents:
diff changeset
   244
    else if (id==KMaxTInt)
957c583b417b 201039_07
hgs
parents:
diff changeset
   245
		{
957c583b417b 201039_07
hgs
parents:
diff changeset
   246
		// DoCancel
957c583b417b 201039_07
hgs
parents:
diff changeset
   247
		m.Complete(KErrNone,ETrue);
957c583b417b 201039_07
hgs
parents:
diff changeset
   248
		return;
957c583b417b 201039_07
hgs
parents:
diff changeset
   249
		}
957c583b417b 201039_07
hgs
parents:
diff changeset
   250
957c583b417b 201039_07
hgs
parents:
diff changeset
   251
    if (id<0)
957c583b417b 201039_07
hgs
parents:
diff changeset
   252
		{
957c583b417b 201039_07
hgs
parents:
diff changeset
   253
		// DoRequest
957c583b417b 201039_07
hgs
parents:
diff changeset
   254
		TRequestStatus* pS=(TRequestStatus*)m.Ptr0();
957c583b417b 201039_07
hgs
parents:
diff changeset
   255
		TInt r=DoRequest(~id, pS, m.Ptr1(), m.Ptr2());
957c583b417b 201039_07
hgs
parents:
diff changeset
   256
		if (r!=KErrNone)
957c583b417b 201039_07
hgs
parents:
diff changeset
   257
	    	Kern::RequestComplete(iClient, pS, r);
957c583b417b 201039_07
hgs
parents:
diff changeset
   258
		m.Complete(KErrNone,ETrue);
957c583b417b 201039_07
hgs
parents:
diff changeset
   259
		}
957c583b417b 201039_07
hgs
parents:
diff changeset
   260
    else
957c583b417b 201039_07
hgs
parents:
diff changeset
   261
		{
957c583b417b 201039_07
hgs
parents:
diff changeset
   262
		// DoControl
957c583b417b 201039_07
hgs
parents:
diff changeset
   263
		TInt r=DoControl(id,m.Ptr0(),m.Ptr1());
957c583b417b 201039_07
hgs
parents:
diff changeset
   264
		if(r != KErrCompletion)
957c583b417b 201039_07
hgs
parents:
diff changeset
   265
			{
957c583b417b 201039_07
hgs
parents:
diff changeset
   266
			m.Complete(r,ETrue);
957c583b417b 201039_07
hgs
parents:
diff changeset
   267
			}
957c583b417b 201039_07
hgs
parents:
diff changeset
   268
		}
957c583b417b 201039_07
hgs
parents:
diff changeset
   269
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   270
957c583b417b 201039_07
hgs
parents:
diff changeset
   271
TInt DLddMmcCntrlInterface::PrintCardInfo()
957c583b417b 201039_07
hgs
parents:
diff changeset
   272
    {
957c583b417b 201039_07
hgs
parents:
diff changeset
   273
    if(iCard == NULL)
957c583b417b 201039_07
hgs
parents:
diff changeset
   274
        {
957c583b417b 201039_07
hgs
parents:
diff changeset
   275
        return(KErrNotReady);
957c583b417b 201039_07
hgs
parents:
diff changeset
   276
        }
957c583b417b 201039_07
hgs
parents:
diff changeset
   277
    const TCSD& csd = iCard->CSD();
957c583b417b 201039_07
hgs
parents:
diff changeset
   278
    Kern::Printf("CSD");    
957c583b417b 201039_07
hgs
parents:
diff changeset
   279
    Kern::Printf("CSDStructure():                 %u",csd.CSDStructure());
957c583b417b 201039_07
hgs
parents:
diff changeset
   280
    Kern::Printf("SpecVers():                     %u",csd.SpecVers());
957c583b417b 201039_07
hgs
parents:
diff changeset
   281
    switch (csd.MediaType())
957c583b417b 201039_07
hgs
parents:
diff changeset
   282
        {
957c583b417b 201039_07
hgs
parents:
diff changeset
   283
        case EMultiMediaROM   : Kern::Printf("Read Only Media"); break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   284
        case EMultiMediaFlash : Kern::Printf("Writable Media"); break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   285
        case EMultiMediaIO    : Kern::Printf("IO Media Device"); break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   286
        case EMultiMediaOther : Kern::Printf("UNKNOWN Media type"); break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   287
        default : Kern::Printf("Media NOT SUPPORTED");
957c583b417b 201039_07
hgs
parents:
diff changeset
   288
        }    
957c583b417b 201039_07
hgs
parents:
diff changeset
   289
    Kern::Printf("----------------------------------");
957c583b417b 201039_07
hgs
parents:
diff changeset
   290
    Kern::Printf("Reserved120():                  %u",csd.Reserved120());
957c583b417b 201039_07
hgs
parents:
diff changeset
   291
    Kern::Printf("TAAC():                         %u", csd.TAAC());
957c583b417b 201039_07
hgs
parents:
diff changeset
   292
    Kern::Printf("NSAC():                         %u", csd.NSAC());
957c583b417b 201039_07
hgs
parents:
diff changeset
   293
    Kern::Printf("TranSpeed():                    %u", csd.TranSpeed());
957c583b417b 201039_07
hgs
parents:
diff changeset
   294
    Kern::Printf("CCC():                          %u",csd.CCC());
957c583b417b 201039_07
hgs
parents:
diff changeset
   295
    Kern::Printf("ReadBlLen():                    %u", csd.ReadBlLen());
957c583b417b 201039_07
hgs
parents:
diff changeset
   296
    Kern::Printf("ReadBlPartial():                %u", (TUint)csd.ReadBlPartial());
957c583b417b 201039_07
hgs
parents:
diff changeset
   297
    Kern::Printf("WriteBlkMisalign():             %u", (TUint) csd.WriteBlkMisalign());
957c583b417b 201039_07
hgs
parents:
diff changeset
   298
    Kern::Printf("ReadBlkMisalign():              %u", (TUint) csd.ReadBlkMisalign());
957c583b417b 201039_07
hgs
parents:
diff changeset
   299
    Kern::Printf("DSRImp():                       %u", (TUint) csd.DSRImp());
957c583b417b 201039_07
hgs
parents:
diff changeset
   300
    Kern::Printf("Reserved74():                   %u", csd.Reserved74());
957c583b417b 201039_07
hgs
parents:
diff changeset
   301
    Kern::Printf("CSize():                        %u", csd.CSize());
957c583b417b 201039_07
hgs
parents:
diff changeset
   302
    Kern::Printf("VDDRCurrMin():                  %u", csd.VDDRCurrMin());
957c583b417b 201039_07
hgs
parents:
diff changeset
   303
    Kern::Printf("VDDRCurrMax():                  %u", csd.VDDRCurrMax());
957c583b417b 201039_07
hgs
parents:
diff changeset
   304
    Kern::Printf("VDDWCurrMin():                  %u", csd.VDDWCurrMin());
957c583b417b 201039_07
hgs
parents:
diff changeset
   305
    Kern::Printf("VDDWCurrMax():                  %u", csd.VDDWCurrMax());
957c583b417b 201039_07
hgs
parents:
diff changeset
   306
    Kern::Printf("CSizeMult():                    %u", csd.CSizeMult());
957c583b417b 201039_07
hgs
parents:
diff changeset
   307
    Kern::Printf("EraseGrpSize():                 %u", csd.EraseGrpSize());
957c583b417b 201039_07
hgs
parents:
diff changeset
   308
    Kern::Printf("EraseGrpMult():                 %u", csd.EraseGrpMult());
957c583b417b 201039_07
hgs
parents:
diff changeset
   309
    Kern::Printf("WPGrpSize():                    %u", csd.WPGrpSize());
957c583b417b 201039_07
hgs
parents:
diff changeset
   310
    Kern::Printf("WPGrpEnable():                  %u", csd.WPGrpEnable());            
957c583b417b 201039_07
hgs
parents:
diff changeset
   311
    Kern::Printf("DefaultECC():                   %u", csd.DefaultECC());
957c583b417b 201039_07
hgs
parents:
diff changeset
   312
    Kern::Printf("R2WFactor():                    %u", csd.R2WFactor());
957c583b417b 201039_07
hgs
parents:
diff changeset
   313
    Kern::Printf("WriteBlLen():                   %u", csd.WriteBlLen());
957c583b417b 201039_07
hgs
parents:
diff changeset
   314
    Kern::Printf("WriteBlPartial():               %u", (TUint) csd.WriteBlPartial());
957c583b417b 201039_07
hgs
parents:
diff changeset
   315
    Kern::Printf("Reserved16():                   %u", csd.Reserved16());
957c583b417b 201039_07
hgs
parents:
diff changeset
   316
    Kern::Printf("FileFormatGrp():                %u", (TUint) csd.FileFormatGrp());
957c583b417b 201039_07
hgs
parents:
diff changeset
   317
    Kern::Printf("Copy():                         %u", (TUint) csd.Copy());
957c583b417b 201039_07
hgs
parents:
diff changeset
   318
    Kern::Printf("PermWriteProtect():             %u", (TUint) csd.PermWriteProtect());
957c583b417b 201039_07
hgs
parents:
diff changeset
   319
    Kern::Printf("TmpWriteProtect():              %u", (TUint) csd.TmpWriteProtect());
957c583b417b 201039_07
hgs
parents:
diff changeset
   320
    Kern::Printf("FileFormat():                   %u", csd.FileFormat());
957c583b417b 201039_07
hgs
parents:
diff changeset
   321
    Kern::Printf("ECC():                          %u", csd.ECC());
957c583b417b 201039_07
hgs
parents:
diff changeset
   322
    Kern::Printf("CRC():                          %u", csd.CRC());
957c583b417b 201039_07
hgs
parents:
diff changeset
   323
    Kern::Printf("DeviceSize():                   %u", csd.DeviceSize());   
957c583b417b 201039_07
hgs
parents:
diff changeset
   324
    Kern::Printf("ReadBlockLength():              %u", csd.ReadBlockLength());
957c583b417b 201039_07
hgs
parents:
diff changeset
   325
    Kern::Printf("WriteBlockLength():             %u", csd.WriteBlockLength());
957c583b417b 201039_07
hgs
parents:
diff changeset
   326
    Kern::Printf("EraseSectorSize():              %u", csd.EraseSectorSize());
957c583b417b 201039_07
hgs
parents:
diff changeset
   327
    Kern::Printf("EraseGroupSize():               %u", csd.EraseGroupSize());
957c583b417b 201039_07
hgs
parents:
diff changeset
   328
    Kern::Printf("MinReadCurrentInMilliamps():    %u", csd.MinReadCurrentInMilliamps());
957c583b417b 201039_07
hgs
parents:
diff changeset
   329
    Kern::Printf("MinWriteCurrentInMilliamps():   %u", csd.MinWriteCurrentInMilliamps());
957c583b417b 201039_07
hgs
parents:
diff changeset
   330
    Kern::Printf("MaxReadCurrentInMilliamps():    %u", csd.MaxReadCurrentInMilliamps());
957c583b417b 201039_07
hgs
parents:
diff changeset
   331
    Kern::Printf("MaxWriteCurrentInMilliamps():   %u", csd.MaxWriteCurrentInMilliamps());
957c583b417b 201039_07
hgs
parents:
diff changeset
   332
    Kern::Printf("MaxTranSpeedInKilohertz():      %u", csd.MaxTranSpeedInKilohertz());
957c583b417b 201039_07
hgs
parents:
diff changeset
   333
    
957c583b417b 201039_07
hgs
parents:
diff changeset
   334
    const TExtendedCSD& extcsd = iCard->iExtendedCSD;
957c583b417b 201039_07
hgs
parents:
diff changeset
   335
    Kern::Printf("\nExtended CSD");
957c583b417b 201039_07
hgs
parents:
diff changeset
   336
    Kern::Printf("CSDStructureVer:                %u", extcsd.CSDStructureVer());
957c583b417b 201039_07
hgs
parents:
diff changeset
   337
    Kern::Printf("ExtendedCSDRev:                 %u", extcsd.ExtendedCSDRev());
957c583b417b 201039_07
hgs
parents:
diff changeset
   338
    Kern::Printf("----------------------------------");
957c583b417b 201039_07
hgs
parents:
diff changeset
   339
    Kern::Printf("SupportedCmdSet:                %u", extcsd.SupportedCmdSet());
957c583b417b 201039_07
hgs
parents:
diff changeset
   340
    Kern::Printf("SectorCount:                    %u", extcsd.SectorCount());
957c583b417b 201039_07
hgs
parents:
diff changeset
   341
    Kern::Printf("MinPerfWrite8Bit52Mhz:          %u", extcsd.MinPerfWrite8Bit52Mhz());
957c583b417b 201039_07
hgs
parents:
diff changeset
   342
    Kern::Printf("MinPerfRead8Bit52Mhz:           %u", extcsd.MinPerfRead8Bit52Mhz());
957c583b417b 201039_07
hgs
parents:
diff changeset
   343
    Kern::Printf("MinPerfRead8Bit26Mhz_4Bit52Mhz: %u", extcsd.MinPerfRead8Bit26Mhz_4Bit52Mhz());
957c583b417b 201039_07
hgs
parents:
diff changeset
   344
    Kern::Printf("MinPerfWrite4Bit26Mhz:          %u", extcsd.MinPerfWrite4Bit26Mhz());
957c583b417b 201039_07
hgs
parents:
diff changeset
   345
    Kern::Printf("MinPerfRead4Bit26Mhz:           %u", extcsd.MinPerfRead4Bit26Mhz());
957c583b417b 201039_07
hgs
parents:
diff changeset
   346
    Kern::Printf("PowerClass26Mhz360V:            0x%02X", extcsd.PowerClass26Mhz360V());
957c583b417b 201039_07
hgs
parents:
diff changeset
   347
    Kern::Printf("PowerClass52Mhz360V:            0x%02X", extcsd.PowerClass52Mhz360V());
957c583b417b 201039_07
hgs
parents:
diff changeset
   348
    Kern::Printf("PowerClass26Mhz195V:            0x%02X", extcsd.PowerClass26Mhz195V());
957c583b417b 201039_07
hgs
parents:
diff changeset
   349
    Kern::Printf("PowerClass52Mhz195V:            0x%02X", extcsd.PowerClass52Mhz195V());
957c583b417b 201039_07
hgs
parents:
diff changeset
   350
    Kern::Printf("CardType:                       %u", extcsd.CardType());
957c583b417b 201039_07
hgs
parents:
diff changeset
   351
    Kern::Printf("CmdSet:                         %u", extcsd.CmdSet());
957c583b417b 201039_07
hgs
parents:
diff changeset
   352
    Kern::Printf("CmdSetRev:                      %u", extcsd.CmdSetRev());
957c583b417b 201039_07
hgs
parents:
diff changeset
   353
    Kern::Printf("PowerClass:                     %u", extcsd.PowerClass());
957c583b417b 201039_07
hgs
parents:
diff changeset
   354
    Kern::Printf("HighSpeedTiming:                %u", extcsd.HighSpeedTiming());
957c583b417b 201039_07
hgs
parents:
diff changeset
   355
    Kern::Printf("BusWidthMode:                   %u", extcsd.BusWidthMode());
957c583b417b 201039_07
hgs
parents:
diff changeset
   356
    Kern::Printf("HighCapacityEraseGroupSize:     %u", extcsd.HighCapacityEraseGroupSize());
957c583b417b 201039_07
hgs
parents:
diff changeset
   357
    Kern::Printf("AccessSize:                     %u", extcsd.AccessSize());
957c583b417b 201039_07
hgs
parents:
diff changeset
   358
    Kern::Printf("BootInfo:                       %u", extcsd.BootInfo() );
957c583b417b 201039_07
hgs
parents:
diff changeset
   359
    Kern::Printf("BootSizeMultiple:               %u", extcsd.BootSizeMultiple() );
957c583b417b 201039_07
hgs
parents:
diff changeset
   360
    Kern::Printf("EraseTimeoutMultiple:           %u", extcsd.EraseTimeoutMultiple() );
957c583b417b 201039_07
hgs
parents:
diff changeset
   361
    Kern::Printf("ReliableWriteSector:            %u", extcsd.ReliableWriteSector() );
957c583b417b 201039_07
hgs
parents:
diff changeset
   362
    Kern::Printf("HighCapWriteProtGroupSize:      %u", extcsd.HighCapacityWriteProtectGroupSize() );
957c583b417b 201039_07
hgs
parents:
diff changeset
   363
    Kern::Printf("SleepCurrentVcc:                %u", extcsd.SleepCurrentVcc() );
957c583b417b 201039_07
hgs
parents:
diff changeset
   364
    Kern::Printf("SleepCurrentVccQ:               %u", extcsd.SleepCurrentVccQ());
957c583b417b 201039_07
hgs
parents:
diff changeset
   365
    Kern::Printf("SleepAwakeTimeout:              %u", extcsd.SleepAwakeTimeout());
957c583b417b 201039_07
hgs
parents:
diff changeset
   366
    Kern::Printf("BootConfig:                     %u", extcsd.BootConfig());
957c583b417b 201039_07
hgs
parents:
diff changeset
   367
    Kern::Printf("BootBusWidth:                   %u", extcsd.BootBusWidth());
957c583b417b 201039_07
hgs
parents:
diff changeset
   368
    Kern::Printf("EraseGroupDef:                  %u", extcsd.EraseGroupDef());
957c583b417b 201039_07
hgs
parents:
diff changeset
   369
    
957c583b417b 201039_07
hgs
parents:
diff changeset
   370
    return KErrNone;
957c583b417b 201039_07
hgs
parents:
diff changeset
   371
    }
957c583b417b 201039_07
hgs
parents:
diff changeset
   372
957c583b417b 201039_07
hgs
parents:
diff changeset
   373
TInt DLddMmcCntrlInterface::DoRequest(TInt aFunction, TRequestStatus* aStatus, TAny* a1, TAny* a2)
957c583b417b 201039_07
hgs
parents:
diff changeset
   374
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   375
// Most Async requests
957c583b417b 201039_07
hgs
parents:
diff changeset
   376
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   377
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   378
957c583b417b 201039_07
hgs
parents:
diff changeset
   379
    if (iMmcSessionCmd!=EMmcSesNone)
957c583b417b 201039_07
hgs
parents:
diff changeset
   380
		{
957c583b417b 201039_07
hgs
parents:
diff changeset
   381
		return(KErrInUse);
957c583b417b 201039_07
hgs
parents:
diff changeset
   382
		}
957c583b417b 201039_07
hgs
parents:
diff changeset
   383
957c583b417b 201039_07
hgs
parents:
diff changeset
   384
    switch (aFunction)
957c583b417b 201039_07
hgs
parents:
diff changeset
   385
		{
957c583b417b 201039_07
hgs
parents:
diff changeset
   386
        case RMmcCntrlIf::EReqPwrUp:
957c583b417b 201039_07
hgs
parents:
diff changeset
   387
			{
957c583b417b 201039_07
hgs
parents:
diff changeset
   388
			if(!iSocketP->CardIsPresent())
957c583b417b 201039_07
hgs
parents:
diff changeset
   389
				{
957c583b417b 201039_07
hgs
parents:
diff changeset
   390
				Kern::RequestComplete(iClient, aStatus, KErrNotReady);
957c583b417b 201039_07
hgs
parents:
diff changeset
   391
				}
957c583b417b 201039_07
hgs
parents:
diff changeset
   392
			else if(iSocketP->State() == EPBusOn)
957c583b417b 201039_07
hgs
parents:
diff changeset
   393
				{
957c583b417b 201039_07
hgs
parents:
diff changeset
   394
				Kern::RequestComplete(iClient, aStatus, KErrNone);
957c583b417b 201039_07
hgs
parents:
diff changeset
   395
				}
957c583b417b 201039_07
hgs
parents:
diff changeset
   396
			else
957c583b417b 201039_07
hgs
parents:
diff changeset
   397
				{
957c583b417b 201039_07
hgs
parents:
diff changeset
   398
				iPowerUpStatusP = aStatus;
957c583b417b 201039_07
hgs
parents:
diff changeset
   399
				iSocketP->PowerUp();
957c583b417b 201039_07
hgs
parents:
diff changeset
   400
				}
957c583b417b 201039_07
hgs
parents:
diff changeset
   401
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   402
			}
957c583b417b 201039_07
hgs
parents:
diff changeset
   403
        case RMmcCntrlIf::EReqReadSect:
957c583b417b 201039_07
hgs
parents:
diff changeset
   404
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   405
			if(iCard == NULL)
957c583b417b 201039_07
hgs
parents:
diff changeset
   406
				{
957c583b417b 201039_07
hgs
parents:
diff changeset
   407
				return(KErrNotReady);
957c583b417b 201039_07
hgs
parents:
diff changeset
   408
				}
957c583b417b 201039_07
hgs
parents:
diff changeset
   409
957c583b417b 201039_07
hgs
parents:
diff changeset
   410
			//TCSD csd=iCard->CSD();
957c583b417b 201039_07
hgs
parents:
diff changeset
   411
			iReadWriteStatusP = aStatus;
957c583b417b 201039_07
hgs
parents:
diff changeset
   412
			TUint32 srcAddr=((TUint32)a1)<<KSectorSizeShift;
957c583b417b 201039_07
hgs
parents:
diff changeset
   413
			TUint readBlLen = 1 << iCard->MaxReadBlLen();
957c583b417b 201039_07
hgs
parents:
diff changeset
   414
			TUint readBlMask=(readBlLen-1);
957c583b417b 201039_07
hgs
parents:
diff changeset
   415
			iBlkOffet=srcAddr-(srcAddr&(~readBlMask));
957c583b417b 201039_07
hgs
parents:
diff changeset
   416
			iClientDesPtr=a2;
957c583b417b 201039_07
hgs
parents:
diff changeset
   417
			iMmcSessionCmd=EMmcSesReadBlk;
957c583b417b 201039_07
hgs
parents:
diff changeset
   418
			srcAddr&=(~readBlMask);
957c583b417b 201039_07
hgs
parents:
diff changeset
   419
			TMMCArgument da(srcAddr);
957c583b417b 201039_07
hgs
parents:
diff changeset
   420
			iSession->SetupCIMReadBlock(da,readBlLen,&iBuf[0]);
957c583b417b 201039_07
hgs
parents:
diff changeset
   421
			iSession->Engage();
957c583b417b 201039_07
hgs
parents:
diff changeset
   422
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   423
            }
957c583b417b 201039_07
hgs
parents:
diff changeset
   424
        case RMmcCntrlIf::EReqWriteSect:
957c583b417b 201039_07
hgs
parents:
diff changeset
   425
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   426
			if(iCard == NULL)
957c583b417b 201039_07
hgs
parents:
diff changeset
   427
				{
957c583b417b 201039_07
hgs
parents:
diff changeset
   428
				return(KErrNotReady);
957c583b417b 201039_07
hgs
parents:
diff changeset
   429
				}
957c583b417b 201039_07
hgs
parents:
diff changeset
   430
957c583b417b 201039_07
hgs
parents:
diff changeset
   431
			iReadWriteStatusP = aStatus;
957c583b417b 201039_07
hgs
parents:
diff changeset
   432
			TUint32 destAddr=((TUint32)a1)<<KSectorSizeShift;
957c583b417b 201039_07
hgs
parents:
diff changeset
   433
			TUint writeBlLen=1 << iCard->MaxWriteBlLen();
957c583b417b 201039_07
hgs
parents:
diff changeset
   434
			TUint writeBlMask=(writeBlLen-1);
957c583b417b 201039_07
hgs
parents:
diff changeset
   435
			iBlkOffet=destAddr-(destAddr&(~writeBlMask));
957c583b417b 201039_07
hgs
parents:
diff changeset
   436
			TPtr8* srcDes = (TPtr8*)a2;		
957c583b417b 201039_07
hgs
parents:
diff changeset
   437
			TPtr8 ptr(&iBuf[iBlkOffet],KSectorSizeInBytes,KSectorSizeInBytes);
957c583b417b 201039_07
hgs
parents:
diff changeset
   438
			TInt r = Kern::ThreadDesRead(iClient, srcDes, ptr, 0, KChunkShiftBy0);
957c583b417b 201039_07
hgs
parents:
diff changeset
   439
			if(r != KErrNone)
957c583b417b 201039_07
hgs
parents:
diff changeset
   440
				{
957c583b417b 201039_07
hgs
parents:
diff changeset
   441
				return(r);
957c583b417b 201039_07
hgs
parents:
diff changeset
   442
				}
957c583b417b 201039_07
hgs
parents:
diff changeset
   443
				
957c583b417b 201039_07
hgs
parents:
diff changeset
   444
			iMmcSessionCmd=EMmcSesWriteBlk;
957c583b417b 201039_07
hgs
parents:
diff changeset
   445
			destAddr&=(~writeBlMask);
957c583b417b 201039_07
hgs
parents:
diff changeset
   446
			iSession->SetupCIMWriteBlock(TMMCArgument(destAddr),writeBlLen,&iBuf[0]);
957c583b417b 201039_07
hgs
parents:
diff changeset
   447
			iSession->Engage();
957c583b417b 201039_07
hgs
parents:
diff changeset
   448
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   449
			}
957c583b417b 201039_07
hgs
parents:
diff changeset
   450
957c583b417b 201039_07
hgs
parents:
diff changeset
   451
        case RMmcCntrlIf::EReqReadExtCSD:
957c583b417b 201039_07
hgs
parents:
diff changeset
   452
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   453
			if(iCard == NULL)
957c583b417b 201039_07
hgs
parents:
diff changeset
   454
				{
957c583b417b 201039_07
hgs
parents:
diff changeset
   455
				return(KErrNotReady);
957c583b417b 201039_07
hgs
parents:
diff changeset
   456
				}
957c583b417b 201039_07
hgs
parents:
diff changeset
   457
957c583b417b 201039_07
hgs
parents:
diff changeset
   458
			iClientDesPtr = a1;
957c583b417b 201039_07
hgs
parents:
diff changeset
   459
			iReadWriteStatusP = aStatus;
957c583b417b 201039_07
hgs
parents:
diff changeset
   460
			iMmcSessionCmd = EMmcSesReadExtCSD;
957c583b417b 201039_07
hgs
parents:
diff changeset
   461
957c583b417b 201039_07
hgs
parents:
diff changeset
   462
			iSession->SetupDTCommand(
957c583b417b 201039_07
hgs
parents:
diff changeset
   463
				ECmdSendExtendedCSD, 
957c583b417b 201039_07
hgs
parents:
diff changeset
   464
				TMMCArgument(0),
957c583b417b 201039_07
hgs
parents:
diff changeset
   465
				KMMCExtendedCSDLength,
957c583b417b 201039_07
hgs
parents:
diff changeset
   466
				(TUint8*) &iExtendedCSD);
957c583b417b 201039_07
hgs
parents:
diff changeset
   467
957c583b417b 201039_07
hgs
parents:
diff changeset
   468
			iSession->Engage();
957c583b417b 201039_07
hgs
parents:
diff changeset
   469
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   470
            }
957c583b417b 201039_07
hgs
parents:
diff changeset
   471
            
957c583b417b 201039_07
hgs
parents:
diff changeset
   472
        case RMmcCntrlIf::EReqMMCInfoPrint:
957c583b417b 201039_07
hgs
parents:
diff changeset
   473
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   474
            // Print CSD & Extended CSD values
957c583b417b 201039_07
hgs
parents:
diff changeset
   475
            TInt r = PrintCardInfo();            
957c583b417b 201039_07
hgs
parents:
diff changeset
   476
            Kern::RequestComplete(iClient, aStatus, r);
957c583b417b 201039_07
hgs
parents:
diff changeset
   477
            break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   478
            }
957c583b417b 201039_07
hgs
parents:
diff changeset
   479
957c583b417b 201039_07
hgs
parents:
diff changeset
   480
        }
957c583b417b 201039_07
hgs
parents:
diff changeset
   481
	return(KErrNone);
957c583b417b 201039_07
hgs
parents:
diff changeset
   482
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   483
957c583b417b 201039_07
hgs
parents:
diff changeset
   484
TInt DLddMmcCntrlInterface::DoControl(TInt aFunction,TAny* a1,TAny* /*a2*/)
957c583b417b 201039_07
hgs
parents:
diff changeset
   485
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   486
// Mostly requests (but some kernel server async ones)
957c583b417b 201039_07
hgs
parents:
diff changeset
   487
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   488
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   489
957c583b417b 201039_07
hgs
parents:
diff changeset
   490
	TInt r=KErrNotSupported;
957c583b417b 201039_07
hgs
parents:
diff changeset
   491
	switch (aFunction)
957c583b417b 201039_07
hgs
parents:
diff changeset
   492
		{
957c583b417b 201039_07
hgs
parents:
diff changeset
   493
        case RMmcCntrlIf::ESvReset:
957c583b417b 201039_07
hgs
parents:
diff changeset
   494
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   495
            Reset();
957c583b417b 201039_07
hgs
parents:
diff changeset
   496
			r=KErrNone;
957c583b417b 201039_07
hgs
parents:
diff changeset
   497
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   498
            }
957c583b417b 201039_07
hgs
parents:
diff changeset
   499
        case RMmcCntrlIf::ESvPwrDown:
957c583b417b 201039_07
hgs
parents:
diff changeset
   500
			{
957c583b417b 201039_07
hgs
parents:
diff changeset
   501
//		    iStack->PowerDown(); ???
957c583b417b 201039_07
hgs
parents:
diff changeset
   502
//          iMmcController->SetPowerEvent(0,EPEventPwrDownNormal,0);
957c583b417b 201039_07
hgs
parents:
diff changeset
   503
			r=KErrNone;
957c583b417b 201039_07
hgs
parents:
diff changeset
   504
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   505
			}
957c583b417b 201039_07
hgs
parents:
diff changeset
   506
        case RMmcCntrlIf::EExecStackInfo:
957c583b417b 201039_07
hgs
parents:
diff changeset
   507
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   508
            // Determine the number of cards present
957c583b417b 201039_07
hgs
parents:
diff changeset
   509
            TUint cardsPresentMask=0x00000000;
957c583b417b 201039_07
hgs
parents:
diff changeset
   510
	        TMMCard* card;
957c583b417b 201039_07
hgs
parents:
diff changeset
   511
            for (TInt i=0;i<KMaxMMCCardsPerStack;i++)
957c583b417b 201039_07
hgs
parents:
diff changeset
   512
                {
957c583b417b 201039_07
hgs
parents:
diff changeset
   513
                card=iStack->CardP(i);
957c583b417b 201039_07
hgs
parents:
diff changeset
   514
                if (card!=NULL && card->IsPresent())
957c583b417b 201039_07
hgs
parents:
diff changeset
   515
                    cardsPresentMask|=(0x1<<i);
957c583b417b 201039_07
hgs
parents:
diff changeset
   516
                }
957c583b417b 201039_07
hgs
parents:
diff changeset
   517
			r = Kern::ThreadRawWrite(iClient,a1,&cardsPresentMask,sizeof(TUint));
957c583b417b 201039_07
hgs
parents:
diff changeset
   518
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   519
            }
957c583b417b 201039_07
hgs
parents:
diff changeset
   520
        case RMmcCntrlIf::ESvRegisterEvent:
957c583b417b 201039_07
hgs
parents:
diff changeset
   521
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   522
			return(KErrNotSupported);
957c583b417b 201039_07
hgs
parents:
diff changeset
   523
            }
957c583b417b 201039_07
hgs
parents:
diff changeset
   524
        case RMmcCntrlIf::EExecSelectCard:
957c583b417b 201039_07
hgs
parents:
diff changeset
   525
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   526
            iCard=iStack->CardP((TUint)a1);
957c583b417b 201039_07
hgs
parents:
diff changeset
   527
            iSession->SetCard(iCard);
957c583b417b 201039_07
hgs
parents:
diff changeset
   528
			r=KErrNone;
957c583b417b 201039_07
hgs
parents:
diff changeset
   529
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   530
            }
957c583b417b 201039_07
hgs
parents:
diff changeset
   531
        case RMmcCntrlIf::EExecCardInfo:
957c583b417b 201039_07
hgs
parents:
diff changeset
   532
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   533
            if (iCard)
957c583b417b 201039_07
hgs
parents:
diff changeset
   534
                {
957c583b417b 201039_07
hgs
parents:
diff changeset
   535
				TMmcCardInfo ci;
957c583b417b 201039_07
hgs
parents:
diff changeset
   536
	            ci.iIsReady=iCard->IsPresent();
957c583b417b 201039_07
hgs
parents:
diff changeset
   537
	            ci.iIsLocked=iCard->IsLocked();
957c583b417b 201039_07
hgs
parents:
diff changeset
   538
				TCID* cid=(TCID*)&(iCard->CID());
957c583b417b 201039_07
hgs
parents:
diff changeset
   539
				TInt i;
957c583b417b 201039_07
hgs
parents:
diff changeset
   540
				for (i=0;i<16;i++)
957c583b417b 201039_07
hgs
parents:
diff changeset
   541
					ci.iCID[i]=cid->At(i);
957c583b417b 201039_07
hgs
parents:
diff changeset
   542
				const TCSD& csd = iCard->CSD();
957c583b417b 201039_07
hgs
parents:
diff changeset
   543
				for (i=0;i<16;i++)
957c583b417b 201039_07
hgs
parents:
diff changeset
   544
					ci.iCSD[i]=csd.At(i);
957c583b417b 201039_07
hgs
parents:
diff changeset
   545
	            ci.iRCA=TUint16(iCard->RCA());
957c583b417b 201039_07
hgs
parents:
diff changeset
   546
	            ci.iMediaType=(TMmcMediaType)iCard->MediaType();
957c583b417b 201039_07
hgs
parents:
diff changeset
   547
                ci.iCardSizeInBytes=iCard->DeviceSize64();
957c583b417b 201039_07
hgs
parents:
diff changeset
   548
	            ci.iReadBlLen=csd.ReadBlockLength();
957c583b417b 201039_07
hgs
parents:
diff changeset
   549
	            ci.iWriteBlLen=csd.WriteBlockLength();
957c583b417b 201039_07
hgs
parents:
diff changeset
   550
	            ci.iReadBlPartial=csd.ReadBlPartial();
957c583b417b 201039_07
hgs
parents:
diff changeset
   551
	            ci.iWriteBlPartial=csd.WriteBlPartial();
957c583b417b 201039_07
hgs
parents:
diff changeset
   552
	            ci.iReadBlkMisalign=csd.ReadBlkMisalign();
957c583b417b 201039_07
hgs
parents:
diff changeset
   553
	            ci.iWriteBlkMisalign=csd.WriteBlkMisalign();
957c583b417b 201039_07
hgs
parents:
diff changeset
   554
                ci.iReadCurrentInMilliAmps=csd.MaxReadCurrentInMilliamps();
957c583b417b 201039_07
hgs
parents:
diff changeset
   555
                ci.iWriteCurrentInMilliAmps=csd.MaxWriteCurrentInMilliamps();
957c583b417b 201039_07
hgs
parents:
diff changeset
   556
	            ci.iSpecVers=csd.SpecVers();
957c583b417b 201039_07
hgs
parents:
diff changeset
   557
	            ci.iTAAC=csd.TAAC();
957c583b417b 201039_07
hgs
parents:
diff changeset
   558
	            ci.iNSAC=csd.NSAC();
957c583b417b 201039_07
hgs
parents:
diff changeset
   559
	            ci.iTransferSpeed=csd.TranSpeed();
957c583b417b 201039_07
hgs
parents:
diff changeset
   560
	            ci.iCommandRegister=csd.CCC();
957c583b417b 201039_07
hgs
parents:
diff changeset
   561
	            ci.iHighCapacity = iCard->IsHighCapacity();
957c583b417b 201039_07
hgs
parents:
diff changeset
   562
				r = Kern::ThreadRawWrite(iClient, a1/*TAny *aDest*/, &ci/*const TAny *aSrc*/, sizeof(TMmcCardInfo));
957c583b417b 201039_07
hgs
parents:
diff changeset
   563
                }
957c583b417b 201039_07
hgs
parents:
diff changeset
   564
            else
957c583b417b 201039_07
hgs
parents:
diff changeset
   565
                r=KErrGeneral;
957c583b417b 201039_07
hgs
parents:
diff changeset
   566
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   567
            }
957c583b417b 201039_07
hgs
parents:
diff changeset
   568
		}
957c583b417b 201039_07
hgs
parents:
diff changeset
   569
	return(r);
957c583b417b 201039_07
hgs
parents:
diff changeset
   570
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   571
957c583b417b 201039_07
hgs
parents:
diff changeset
   572
void DLddMmcCntrlInterface::Reset()
957c583b417b 201039_07
hgs
parents:
diff changeset
   573
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   574
// Release any resources 
957c583b417b 201039_07
hgs
parents:
diff changeset
   575
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   576
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   577
	iSessionEndDfc.Cancel();
957c583b417b 201039_07
hgs
parents:
diff changeset
   578
    }
957c583b417b 201039_07
hgs
parents:
diff changeset
   579
957c583b417b 201039_07
hgs
parents:
diff changeset
   580
void DLddMmcCntrlInterface::SessionEndCallBack(TAny *aPtr)
957c583b417b 201039_07
hgs
parents:
diff changeset
   581
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   582
// Session end callback
957c583b417b 201039_07
hgs
parents:
diff changeset
   583
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   584
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   585
	DLddMmcCntrlInterface &mci=*(DLddMmcCntrlInterface*)aPtr;
957c583b417b 201039_07
hgs
parents:
diff changeset
   586
957c583b417b 201039_07
hgs
parents:
diff changeset
   587
	// Signal request complete using DFC 
957c583b417b 201039_07
hgs
parents:
diff changeset
   588
	if (!mci.iSessionEndDfc.Queued())
957c583b417b 201039_07
hgs
parents:
diff changeset
   589
		mci.iSessionEndDfc.Enque();
957c583b417b 201039_07
hgs
parents:
diff changeset
   590
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   591
957c583b417b 201039_07
hgs
parents:
diff changeset
   592
void DLddMmcCntrlInterface::SessionEndDfc(TAny *aPtr)
957c583b417b 201039_07
hgs
parents:
diff changeset
   593
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   594
// Session end dfc
957c583b417b 201039_07
hgs
parents:
diff changeset
   595
//
957c583b417b 201039_07
hgs
parents:
diff changeset
   596
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   597
	DLddMmcCntrlInterface &mci=*(DLddMmcCntrlInterface*)aPtr;
957c583b417b 201039_07
hgs
parents:
diff changeset
   598
    TInt err=mci.iSession->EpocErrorCode();
957c583b417b 201039_07
hgs
parents:
diff changeset
   599
    switch (mci.iMmcSessionCmd)
957c583b417b 201039_07
hgs
parents:
diff changeset
   600
		{
957c583b417b 201039_07
hgs
parents:
diff changeset
   601
        case EMmcSesReadBlk:
957c583b417b 201039_07
hgs
parents:
diff changeset
   602
            {
957c583b417b 201039_07
hgs
parents:
diff changeset
   603
			TPtr8 ptr(&mci.iBuf[mci.iBlkOffet],KSectorSizeInBytes,KSectorSizeInBytes);
957c583b417b 201039_07
hgs
parents:
diff changeset
   604
			TPtrC8* srcDes = (TPtrC8*)mci.iClientDesPtr;
957c583b417b 201039_07
hgs
parents:
diff changeset
   605
			TInt r = Kern::ThreadDesWrite(mci.iClient,srcDes,ptr,0,mci.iClient);
957c583b417b 201039_07
hgs
parents:
diff changeset
   606
957c583b417b 201039_07
hgs
parents:
diff changeset
   607
	    	Kern::RequestComplete(mci.iClient, mci.iReadWriteStatusP, (r == KErrNone) ? err : r);
957c583b417b 201039_07
hgs
parents:
diff changeset
   608
            break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   609
            }
957c583b417b 201039_07
hgs
parents:
diff changeset
   610
        case EMmcSesWriteBlk:
957c583b417b 201039_07
hgs
parents:
diff changeset
   611
			{
957c583b417b 201039_07
hgs
parents:
diff changeset
   612
			Kern::Printf("EMmcSesWriteBlk Complete");
957c583b417b 201039_07
hgs
parents:
diff changeset
   613
	    	Kern::RequestComplete(mci.iClient, mci.iReadWriteStatusP, err);
957c583b417b 201039_07
hgs
parents:
diff changeset
   614
            break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   615
			}
957c583b417b 201039_07
hgs
parents:
diff changeset
   616
		case EMmcSesReadExtCSD:
957c583b417b 201039_07
hgs
parents:
diff changeset
   617
			{
957c583b417b 201039_07
hgs
parents:
diff changeset
   618
			TPtr8 ptr((TUint8*) &mci.iExtendedCSD, KMMCExtendedCSDLength, KMMCExtendedCSDLength);
957c583b417b 201039_07
hgs
parents:
diff changeset
   619
			TPtrC8* dstDes = (TPtrC8*)mci.iClientDesPtr;
957c583b417b 201039_07
hgs
parents:
diff changeset
   620
			TInt r = Kern::ThreadDesWrite(mci.iClient, dstDes, ptr, 0,mci.iClient);
957c583b417b 201039_07
hgs
parents:
diff changeset
   621
957c583b417b 201039_07
hgs
parents:
diff changeset
   622
	    	Kern::RequestComplete(mci.iClient, mci.iReadWriteStatusP, (r == KErrNone) ? err : r);
957c583b417b 201039_07
hgs
parents:
diff changeset
   623
			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   624
			}
957c583b417b 201039_07
hgs
parents:
diff changeset
   625
        default:
957c583b417b 201039_07
hgs
parents:
diff changeset
   626
        	break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   627
		}
957c583b417b 201039_07
hgs
parents:
diff changeset
   628
	mci.iMmcSessionCmd=EMmcSesNone;
957c583b417b 201039_07
hgs
parents:
diff changeset
   629
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   630
957c583b417b 201039_07
hgs
parents:
diff changeset
   631
void DLddMmcCntrlInterface::EventCallBack(TAny* aPtr, TInt aReason, TAny* a1, TAny* a2)
957c583b417b 201039_07
hgs
parents:
diff changeset
   632
	{
957c583b417b 201039_07
hgs
parents:
diff changeset
   633
	DLddMmcCntrlInterface &mci=*(DLddMmcCntrlInterface*)aPtr;
957c583b417b 201039_07
hgs
parents:
diff changeset
   634
957c583b417b 201039_07
hgs
parents:
diff changeset
   635
	if(mci.iPowerUpStatusP)
957c583b417b 201039_07
hgs
parents:
diff changeset
   636
		{
957c583b417b 201039_07
hgs
parents:
diff changeset
   637
		TInt retCode = KErrCompletion;
957c583b417b 201039_07
hgs
parents:
diff changeset
   638
957c583b417b 201039_07
hgs
parents:
diff changeset
   639
		switch(aReason)
957c583b417b 201039_07
hgs
parents:
diff changeset
   640
			{
957c583b417b 201039_07
hgs
parents:
diff changeset
   641
			case TPBusCallBack::EPBusStateChange:
957c583b417b 201039_07
hgs
parents:
diff changeset
   642
				{
957c583b417b 201039_07
hgs
parents:
diff changeset
   643
				TPBusState newState = (TPBusState)(TInt)a1;
957c583b417b 201039_07
hgs
parents:
diff changeset
   644
				TInt errorCode = (TInt)a2;
957c583b417b 201039_07
hgs
parents:
diff changeset
   645
957c583b417b 201039_07
hgs
parents:
diff changeset
   646
				switch(newState)
957c583b417b 201039_07
hgs
parents:
diff changeset
   647
					{
957c583b417b 201039_07
hgs
parents:
diff changeset
   648
					case EPBusCardAbsent:	retCode = KErrNotFound;		break;			
957c583b417b 201039_07
hgs
parents:
diff changeset
   649
					case EPBusOff:			retCode = errorCode;		break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   650
					case EPBusPsuFault:		retCode = KErrBadPower;		break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   651
					case EPBusOn:			retCode = KErrNone;			break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   652
					case EPBusPowerUpPending:
957c583b417b 201039_07
hgs
parents:
diff changeset
   653
					case EPBusPoweringUp:
957c583b417b 201039_07
hgs
parents:
diff changeset
   654
					default:	
957c583b417b 201039_07
hgs
parents:
diff changeset
   655
						break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   656
					}
957c583b417b 201039_07
hgs
parents:
diff changeset
   657
957c583b417b 201039_07
hgs
parents:
diff changeset
   658
				break;
957c583b417b 201039_07
hgs
parents:
diff changeset
   659
				}
957c583b417b 201039_07
hgs
parents:
diff changeset
   660
			}
957c583b417b 201039_07
hgs
parents:
diff changeset
   661
957c583b417b 201039_07
hgs
parents:
diff changeset
   662
		if(retCode != KErrCompletion)
957c583b417b 201039_07
hgs
parents:
diff changeset
   663
			{
957c583b417b 201039_07
hgs
parents:
diff changeset
   664
   			Kern::RequestComplete(mci.iClient, mci.iPowerUpStatusP, retCode);
957c583b417b 201039_07
hgs
parents:
diff changeset
   665
			mci.iPowerUpStatusP = NULL;
957c583b417b 201039_07
hgs
parents:
diff changeset
   666
			}
957c583b417b 201039_07
hgs
parents:
diff changeset
   667
		}
957c583b417b 201039_07
hgs
parents:
diff changeset
   668
	}
957c583b417b 201039_07
hgs
parents:
diff changeset
   669
957c583b417b 201039_07
hgs
parents:
diff changeset
   670