kernel/eka/drivers/medmmc/medmmc.h
author hgs
Mon, 11 Oct 2010 19:11:06 +0100
changeset 287 ddfd5aa0d58f
child 293 0659d0e1a03c
permissions -rw-r--r--
201041_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
287
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     2
// All rights reserved.
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     7
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    10
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    11
// Contributors:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    12
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    13
// Description:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    14
// drivers/medmmc/medmmc.h
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    15
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    16
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    17
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    18
#ifndef MEDMMC_H
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    19
#define MEDMMC_H
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    20
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    21
#include <drivers/locmedia.h>
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    22
#include <e32const.h>
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    23
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    24
#if defined(__DEMAND_PAGING__)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    25
	// If in debug mode, enable paging stats and their retrieval using DLocalDrive::EControlIO
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    26
	#if defined( _DEBUG)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    27
		#define __TEST_PAGING_MEDIA_DRIVER__
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    28
	#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    29
	#include "mmcdp.h"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    30
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    31
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    32
// Enable this macro to debug cache: 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    33
// NB The greater the number of blocks, the slower this is...
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    34
//#define _DEBUG_CACHE
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    35
#ifdef _DEBUG_CACHE
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    36
#define __ASSERT_CACHE(c,p) (void)((c)||(p,0))
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    37
#else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    38
#define __ASSERT_CACHE(c,p)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    39
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    40
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    41
const TInt KDiskSectorSize  = 512;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    42
const TInt KDiskSectorShift =   9;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    43
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    44
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    45
class DMmcMediaDriverFlash : public DMediaDriver
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    46
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    47
public:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    48
	DMmcMediaDriverFlash(TInt aMediaId);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    49
	~DMmcMediaDriverFlash();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    50
	// ...from DMediaDriver
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    51
	virtual void Close();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    52
	// replacing pure virtual
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    53
	virtual void Disconnect(DLocalDrive* aLocalDrive, TThreadMessage*);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    54
	virtual TInt Request(TLocDrvRequest& aRequest);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    55
	virtual TInt PartitionInfo(TPartitionInfo& anInfo);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    56
	virtual void NotifyPowerDown();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    57
	virtual void NotifyEmergencyPowerDown();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    58
	// For creation by DPhysicalDeviceMediaMmcFlash
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    59
	TInt DoCreate(TInt aMediaId);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    60
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    61
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    62
private:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    63
	enum TPanic
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    64
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    65
		EDRInUse		= 0x0000,	EDRStart, EDRNotPositive, EDREnd,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    66
		ELRRequest		= 0x0010,	ELRStart, ELRNotPositive, ELREnd, ELRCached,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    67
		EDWInUse		= 0x0020,	EDWStart, EDWNotPositive, EDWEnd,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    68
		EDFInUse		= 0x0030,	EDFStart, EDFNotPositive, EDFEnd, ENotMmcSocket,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    69
		ELWRequest		= 0x0040,	ELWStart, ELWFmtStAlign, ELWNotPositive, ELWEnd, ELWFmtEndAlign, 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    70
									ELWLength, ELFStart, ELFEnd, ELFNotPositive,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    71
		ERPIInUse		= 0x0050,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    72
		EPCInUse		= 0x0060,	EPCFunc,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    73
		ESECBQueued		= 0x0070,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    74
		EDSEDRequest	= 0x0080,	EDSEDNotErrComplete,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    75
		ECRReqIdle		= 0x0090,	ECRRequest,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    76
		ERRBStAlign		= 0x00a0,	ERRBStPos, ERRBNotPositive, ERRBEndAlign, ERRBEndPos,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    77
									ERRBOverflow, ERRBCchInv, ERRBExist,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    78
		ERWBStPos		= 0x00b0,	ERWBNotPositive, ERWBEndPos, ERWBOverflow, ERWBCchInv,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    79
		EMBStPos		= 0x00c0,	EMBStAlign, EMBNotPositive, EMBEndPos, EMBEndAlign,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    80
									EMBOverflow, EMBCchInvPre, EMBCchInvPost,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    81
		EBGAStPos		= 0x00d0,	EBGAStAlign, EBGANotPositive, EBGAEndPos, EBGAEndAlign,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    82
									EBGAOverflow, EBGACchInv,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    83
		EICMNegative	= 0x00e0,	EICMOverflow, ECMIOverflow,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    84
		EGCBAlign		= 0x00f0,	EGCBPos, EGCBCchInv,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    85
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    86
		ECFSessPtrNull	= 0x0100,	// Code Fault - session pointer NULL
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    87
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    88
		EDBNotEven		= 0x0110,	// Not and even number of blocks in the buffer cache
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    89
		EDBCBQueued		= 0x0111,	// The data transfer callback is already queued
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    90
		EDBLength		= 0x0112,	// The length of data to transfer in data transfer callback is not positive
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    91
		EDBLengthTooBig	= 0x0113,	// The length of data to transfer in data transfer callback is too big
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    92
		EDBOffsetTooBig = 0x0114,	// The Offset into the user data buffer is too big
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    93
		EDBCacheInvalid	= 0x0115,	// The cache is invalid at the end of data transfer
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    94
		EDBNotOptimal	= 0x0116,	// Due to Cache size DB functionality will never be utilised
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    95
		ENoDBSupport	= 0x0120,	// DMA request arrived but PSL does not support double buffering
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    96
		ENotDMAAligned  = 0x0121,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    97
		EArrayBoundsExc = 0x0122	// Array bounds exceeded (either too small or too large)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    98
		};
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    99
	static void Panic(TPanic aPnc);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   100
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   101
	enum TMediaRequest
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   102
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   103
		EMReqRead = 0,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   104
		EMReqWrite = 1,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   105
		EMReqFormat = 2,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   106
		EMReqPtnInfo,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   107
		EMReqPswdCtrl,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   108
		EMReqForceErase,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   109
		EMReqUpdatePtnInfo,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   110
		EMReqWritePasswordData,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   111
		EMReqIdle,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   112
		EMReqEMMCPtnInfo,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   113
		};
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   114
	enum TMediaReqType {EMReqTypeNormalRd,EMReqTypeNormalWr,EMReqTypeUnlockPswd,EMReqTypeChangePswd};
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   115
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   116
	enum {KWtRBMFst = 0x00000001, 	// iWtRBM - Read First Block only
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   117
		  KWtRBMLst = 0x00000002,	// iWtRBM - Read Last Block only
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   118
		  KWtMinFst = 0x00000004,	// iWtRBM - Write First Block only
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   119
		  KWtMinLst = 0x00000008,	// iWtRBM - Write Last Block only
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   120
		  KIPCSetup = 0x00000010,	// iRdROB - IPC Setup Next Iteration
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   121
		  KIPCWrite = 0x00000020};	// iRdROB - IPC Write Next Iteration
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   122
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   123
public:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   124
	inline void SetEMmcPartitionMapping(TInt aLocalPtn, TInt aEMmcPtn) 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   125
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   126
		__ASSERT_DEBUG((aLocalPtn >= 0) && (aLocalPtn < KMaxLocalDrives), Kern::Fault("Mmc: Array bounds exception", __LINE__));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   127
		iEMmcPartitionMappings[aLocalPtn] = aEMmcPtn;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   128
		};
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   129
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   130
	inline TInt GetEMmcPartitionMapping(TInt aLocalPtn) const
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   131
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   132
		__ASSERT_DEBUG((aLocalPtn >= 0) && (aLocalPtn < KMaxLocalDrives), Kern::Fault("Mmc: Array bounds exception", __LINE__));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   133
		return iEMmcPartitionMappings[aLocalPtn];
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   134
		};
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   135
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   136
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   137
private:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   138
	// MMC device specific stuff
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   139
	TInt DoRead();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   140
	TInt DoWrite();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   141
	TInt DoFormat();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   142
	TInt Caps(TLocDrv& aDrive, TLocalDriveCapsV6& aInfo);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   143
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   144
	inline DMMCStack& Stack() const;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   145
	inline TInt CardNum() const;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   146
	inline TMediaRequest CurrentRequest() const;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   147
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   148
	TInt LaunchRead(TInt64 aStart, TUint32 aLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   149
	TInt LaunchDBRead();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   150
	TInt LaunchPhysRead(TInt64 aStart, TUint32 aLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   151
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   152
	TInt LaunchWrite(TInt64 aStart, TUint32 aLength, TMediaRequest aMedReq);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   153
	TInt LaunchFormat(TInt64 aStart, TUint32 aLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   154
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   155
	TInt LaunchRPIUnlock(TLocalDrivePasswordData& aData);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   156
	TInt LaunchRPIRead();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   157
	TInt LaunchRPIErase();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   158
	TInt DecodePartitionInfo();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   159
	TInt WritePartitionInfo();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   160
	TInt GetDefaultPartitionInfo(TMBRPartitionEntry& aPartitionEntry);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   161
	TInt CreateDefaultPartition();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   162
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   163
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   164
#if defined __TEST_PAGING_MEDIA_DRIVER__
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   165
	TInt HandleControlIORequest();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   166
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   167
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   168
	static void SetPartitionEntry(TPartitionEntry* aEntry, TUint aFirstSector, TUint aNumSectors);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   169
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   170
	TInt CheckDevice(TMediaReqType aReqType);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   171
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   172
	static void SessionEndCallBack(TAny* aMediaDriver);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   173
	static void SessionEndDfc(TAny* aMediaDriver);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   174
	void DoSessionEndDfc();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   175
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   176
	static void DataTransferCallBack(TAny* aMediaDriver);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   177
	static void DataTransferCallBackDfc(TAny* aMediaDriver);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   178
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   179
	void DoReadDataTransferCallBack();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   180
	void DoWriteDataTransferCallBack();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   181
	void DoPhysReadDataTransferCallBack();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   182
	void DoPhysWriteDataTransferCallBack();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   183
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   184
	TInt AdjustPhysicalFragment(TPhysAddr &physAddr, TInt &physLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   185
	TInt PrepareFirstPhysicalFragment(TPhysAddr &aPhysAddr, TInt &aPhysLength, TUint32 aLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   186
	void PrepareNextPhysicalFragment();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   187
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   188
	TInt EngageAndSetReadRequest(TMediaRequest aRequest);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   189
	TInt EngageAndSetWriteRequest(TMediaRequest aRequest);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   190
	TInt EngageAndSetRequest(TMediaRequest aRequest, TInt aCurrent);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   191
	void CompleteRequest(TInt aReason);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   192
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   193
	TInt ReadDataUntilCacheExhausted(TBool* aAllDone);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   194
	TInt WriteDataToUser(TUint8* aBufPtr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   195
	TInt ReadDataFromUser(TDes8& aDes, TInt aOffset);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   196
	TUint8* ReserveReadBlocks(TInt64 aStart, TInt64 aEnd, TUint32* aLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   197
	TUint8* ReserveWriteBlocks(TInt64 aMedStart, TInt64 aMedEnd, TUint* aRBM);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   198
	void MarkBlocks(TInt64 aStart, TInt64 aEnd, TInt aStartIndex);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   199
	void BuildGammaArray(TInt64 aStart, TInt64 aEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   200
	void InvalidateCache();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   201
	void InvalidateCache(TInt64 aStart, TInt64 aEnd);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   202
	TUint8* IdxToCchMem(TInt aIdx) const;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   203
	TInt CchMemToIdx(TUint8* aMemP) const;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   204
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   205
	TInt DoPasswordOp();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   206
	void PasswordControl(TInt aFunc, TLocalDrivePasswordData& aData);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   207
	void Reset();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   208
	TInt AllocateSession();  
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   209
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   210
#ifdef _DEBUG_CACHE
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   211
	TBool CacheInvariant();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   212
	TUint8* GetCachedBlock(TInt64 aAddr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   213
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   214
private:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   215
	DMMCStack* iStack;			 				// controller objects
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   216
	TMMCard* iCard;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   217
	DMMCSession* iSession;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   218
	DMMCSocket* iSocket;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   219
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   220
	TInt iCardNumber;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   221
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   222
	TUint iBlkLenLog2;							// cached CSD data
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   223
	TUint32 iBlkLen;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   224
	TInt64 iBlkMsk;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   225
	TBool iReadBlPartial;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   226
	TUint32 iPrWtGpLen;							// preferred write group size in bytes,
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   227
	TInt64 iPrWtGpMsk;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   228
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   229
	TInt iReadCurrentInMilliAmps;				// power management
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   230
	TInt iWriteCurrentInMilliAmps;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   231
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   232
	TUint8* iMinorBuf;							// MBR, CMD42, partial read
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   233
	TUint8* iCacheBuf;							// cached buffer
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   234
	TUint32 iMaxBufSize;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   235
	TInt iBlocksInBuffer;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   236
	TInt64* iCachedBlocks;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   237
	TInt* iGamma;								// B lookup, ReserveReadBlocks()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   238
	TUint8* iIntBuf;							// start of current buffer region
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   239
	TInt iLstUsdCchEnt;							// index of last used cache entry
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   240
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   241
	TLocDrvRequest* iCurrentReq;				// Current Request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   242
	TMediaRequest iMedReq;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   243
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   244
	TInt64 iReqStart;							// user-requested start region
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   245
	TInt64 iReqCur;								// Currently requested start region
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   246
	TInt64 iReqEnd;							    // user-requested end region
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   247
	TInt64 iPhysStart;							// physical region for one operation
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   248
	TInt64 iPhysEnd;						    // physical end point for one operation
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   249
	TInt64 iDbEnd;								// Double buffer end point for one operation
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   250
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   251
	TUint64 iEraseUnitMsk;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   252
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   253
	TUint iWtRBM;								// Write - Read Before Modify Flags
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   254
	TUint iRdROB;								// Read  - Read Odd Blocks Flags
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   255
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   256
	TInt iFragOfset;			
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   257
	TUint32 iIPCLen;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   258
	TUint32 iNxtIPCLen;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   259
	TUint32 iBufOfset;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   260
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   261
	TUint iHiddenSectors;						// bootup / password
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   262
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   263
	TMMCCallBack iSessionEndCallBack;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   264
	TDfc iSessionEndDfc;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   265
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   266
	TPartitionInfo* iPartitionInfo;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   267
	TMMCMediaTypeEnum iMediaType;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   268
	TMMCEraseInfo iEraseInfo;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   269
	TBool iMbrMissing;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   270
	TInt iMediaId;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   271
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   272
	DMMCStack::TDemandPagingInfo iDemandPagingInfo;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   273
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   274
#if defined(__TEST_PAGING_MEDIA_DRIVER__)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   275
	SMmcStats iMmcStats;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   276
#endif // __TEST_PAGING_MEDIA_DRIVER__
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   277
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   278
	TMMCCallBack iDataTransferCallBack;	// Callback registered with the MMC stack to perform double-buffering
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   279
	TDfc iDataTransferCallBackDfc;		// ...and the associated DFC queue.
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   280
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   281
	TBool iSecondBuffer;				// Specified the currently active buffer
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   282
	TBool iDoLastRMW;					// ETrue if the last double-buffer transfer requires RMW modification
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   283
	TBool iDoDoubleBuffer;				// ETrue if double-buffering is currently active
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   284
	TBool iDoPhysicalAddress;			// ETrue if Physical Addressing is currently active
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   285
	TBool iCreateMbr;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   286
	TBool iReadToEndOfCard;				// {Read Only} ETrue if Reading to end of Card
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   287
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   288
	TBool iInternalSlot;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   289
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   290
	DEMMCPartitionInfo* iMmcPartitionInfo;  // Responsible for decoding partitions for embedded devices
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   291
	TInt iEMmcPartitionMappings[KMaxLocalDrives]; // holds the mapping of emmc partitions
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   292
	};
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   293
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   294
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   295