kernel/eka/drivers/medmmc/bgahsmmcptn.cpp
author hgs
Tue, 02 Nov 2010 15:42:21 +0000
changeset 301 172f33f13d7d
parent 300 1d28c8722707
permissions -rw-r--r--
201043_12
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     2
// All rights reserved.
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     3
// This component and the accompanying materials are made available
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     5
// which accompanies this distribution, and is available
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     7
//
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     8
// Initial Contributors:
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    10
//
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    11
// Contributors:
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    12
//
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    13
// Description:
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    14
// Partition Management for Embedded MMC devices
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    15
//
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    16
//
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    17
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    18
#include <emmcptn.h>
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
    19
#include "mmc.h"
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    20
#include "bgahsmmcptn.h"
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
    21
#include "medmmc.h"
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
    22
#include "toc.h"
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
    23
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
    24
//#define __DEBUG_PARTITIONS_
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
    25
//#define __DEBUG_CHECK_PARTITION_
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    26
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    27
class DBB5PartitionInfo : public DEMMCPartitionInfo
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    28
	{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    29
public:
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    30
	 DBB5PartitionInfo();
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    31
	~DBB5PartitionInfo();
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    32
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    33
public:
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    34
	virtual TInt Initialise(DMediaDriver* aDriver);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    35
	virtual TInt PartitionInfo(TPartitionInfo& anInfo, const TMMCCallBack& aCallBack);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    36
	virtual TInt PartitionCaps(TLocDrv& aDrive, TDes8& aInfo);
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    37
	TInt HalFunction(TInt aFunction, TAny* a1, TAny* a2);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    38
	
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    39
protected:
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    40
	void SetPartitionEntry(TPartitionEntry* aEntry, TUint aFirstSector, TUint aNumSectors);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    41
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    42
private:
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
    43
	virtual TInt ReadPartition(TUint32 aPtOffset);
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    44
	virtual TInt ReadPartition(TUint32 aPtOffset, TUint aNumBlocks);
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    45
	static void SessionEndCallBack(TAny* aSelf);
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
    46
	void DoSessionEndCallBack();
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    47
	TInt DecodeTOCPartitionInfo();
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    48
	TInt DecodeBB5PartitionInfo();
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    49
	TInt CheckPartitionBoundaries(TInt aStart, TInt aEnd);
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
    50
	TInt GetPartitionSizeInSectors(TUint aPartition, TUint32& aSize);
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
    51
	TInt GetPartitionOffset(TUint32& aPtOffset);
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
    52
	TInt SelectNextPartition();
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    53
	TInt ReadTOCVersionInfo(TUint32& aOffset);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    54
	void DecodeVersionInfo();
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    55
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    56
private:	
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    57
	enum TMediaRequest
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    58
	    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    59
        EIdle                    = 0x00,
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    60
        EDecodeBB5PartitionInfo  = 0x01,
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    61
        EDecodeTOCPartitionInfo  = 0x02,        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    62
        EReadImageVersionInfo    = 0x03,	    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    63
	    };
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    64
	
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    65
protected:
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    66
		
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    67
	DMediaDriver*	iDriver;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    68
	TPartitionInfo* iPartitionInfo;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    69
	TMMCCallBack	iSessionEndCallBack;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    70
	TMMCCallBack	iCallBack;		   // Where to report the PartitionInfo completion
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    71
	DMMCSession*	iSession;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    72
	TMMCard*		iCard;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    73
	TUint8* 		iIntBuf;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    74
	TUint32 		iPartitionAttributes[KMaxLocalDrives];
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
    75
	TBool           iCheckTOC;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
    76
	Toc*            iTocPtr;
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
    77
	TUint32			iSelectedPartition;	
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    78
	TMediaRequest   iMedReq;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    79
	
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    80
// Version Info Stuff	
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    81
	TBool            iVersionInfoRead;    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    82
    TUint32          iVersionInfoItems; /** Amount of version info items */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    83
    TVersionInfoItem iVersionInfo[KMaxSectionItems]; /** Array for keep whole Version Info structures */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    84
    TUint32          iTocCount;
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    85
	};
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    86
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    87
/*****************************************************************************/
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    88
/*                                                                           */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    89
/* NAME                                                                      */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    90
/*      halFunction                                                          */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    91
/* DESCRIPTION                                                               */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    92
/*      This function gets HAL queries via EHalGroupMedia device 1           */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    93
/*      This function is registered in the end of DoCreate                   */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    94
/* PARAMETERS                                                                */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    95
/*      TAny* aPtr      pointer to DMediaDriverNand object                   */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    96
/*      TInt  aFunction requested function:                                  */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    97
/*            1 - NAND block size                                            */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    98
/*            2 - Is separate erase command supported  ETrue/EFalse          */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
    99
/*      TAny* a1        address to user side variable, block size is saved   */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   100
/*                      to this address                                      */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   101
/*      TAny* a2        not used                                             */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   102
/* RETURN VALUES                                                             */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   103
/*      KErrNone                                                             */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   104
/* NOTES                                                                     */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   105
/*                                                                           */
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   106
/*****************************************************************************/
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   107
LOCAL_C TInt halFunction(TAny* aPtr, TInt aFunction, TAny* a1, TAny* a2)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   108
    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   109
    DBB5PartitionInfo* pI = (DBB5PartitionInfo*)aPtr;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   110
    return pI->HalFunction(aFunction,a1,a2);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   111
    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   112
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   113
DBB5PartitionInfo::DBB5PartitionInfo()
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   114
  : iSessionEndCallBack(DBB5PartitionInfo::SessionEndCallBack, this),
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   115
    iCheckTOC(EFalse),iMedReq(EIdle),iVersionInfoItems(0)
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   116
	{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   117
	}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   118
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   119
DBB5PartitionInfo::~DBB5PartitionInfo()
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   120
	{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   121
	delete iSession;
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   122
	if (iVersionInfoRead)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   123
	    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   124
	    TInt r = Kern::RemoveHalEntry(EHalGroupNandMedia,ENandMediaDevice1);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   125
	    __KTRACE_OPT(KPBUSDRV, Kern::Printf("~DBB5PartitionInfo: Removed HAL Entry %d",r));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   126
	    r = r; //get rid of warning, nothing we can do with the warning
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   127
	    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   128
	
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   129
	if (iTocPtr)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   130
	    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   131
	    delete iTocPtr;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   132
	    }
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   133
	}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   134
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   135
TInt DBB5PartitionInfo::Initialise(DMediaDriver* aDriver)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   136
	{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   137
	iDriver = aDriver;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   138
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   139
	DMMCSocket* socket = ((DMMCSocket*)((DPBusPrimaryMedia*)(iDriver->iPrimaryMedia))->iSocket);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   140
	if(socket == NULL)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   141
		return(KErrNoMemory);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   142
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   143
	DMMCStack* stack = socket->Stack(0);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   144
	iCard = stack->CardP(((DPBusPrimaryMedia*)(iDriver->iPrimaryMedia))->iSlotNumber);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   145
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   146
	iSession = stack->AllocSession(iSessionEndCallBack);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   147
	if (iSession == NULL)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   148
		return(KErrNoMemory);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   149
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   150
	iSession->SetStack(stack);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   151
	iSession->SetCard(iCard);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   152
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   153
	// this gets used before any access
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   154
	TInt bufLen, minorBufLen;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   155
	stack->BufferInfo(iIntBuf, bufLen, minorBufLen);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   156
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   157
	iSelectedPartition = TExtendedCSD::ESelectUserArea;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   158
	
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   159
	iTocPtr = new Toc();
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   160
	
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   161
	return(KErrNone);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   162
	}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   163
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   164
TInt DBB5PartitionInfo::PartitionInfo(TPartitionInfo& aInfo, const TMMCCallBack& aCallBack)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   165
	{
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   166
    __KTRACE_OPT(KPBUSDRV,Kern::Printf(">DBB5PartitionInfo:PartitionInfo"));
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   167
	iPartitionInfo = &aInfo;
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   168
	iPartitionInfo->iPartitionCount = 0;
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   169
	iCallBack = aCallBack;
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   170
	iVersionInfoRead = EFalse;
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   171
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   172
	// Always check the user partition first
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   173
	iSelectedPartition = TExtendedCSD::ESelectUserArea;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   174
	iSession->SetPartition(iSelectedPartition);
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   175
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   176
	// Preferred partition scheme is BB5, which is located in the last block of the media.
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   177
    TUint32 ptiOffset = 0;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   178
    TInt r = KErrNone;
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   179
    do
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   180
    	{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   181
	    r = GetPartitionOffset(ptiOffset);
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   182
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   183
	    if(r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   184
	    	{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   185
		    r = ReadPartition(ptiOffset);
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   186
		    iMedReq = (KErrNone==r) ? EDecodeBB5PartitionInfo : EIdle;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   187
		    break;
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   188
	    	}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   189
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   190
	    r = SelectNextPartition();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   191
    	}
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   192
    while(r != KErrNotFound);    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   193
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   194
    __KTRACE_OPT(KPBUSDRV,Kern::Printf("<DBB5PartitionInfo::PartitionInfo(%d)",r));
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   195
	return r;
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   196
	}
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   197
	
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   198
// retrieves size in terms of sectors
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   199
TInt DBB5PartitionInfo::GetPartitionSizeInSectors(TUint aPartition, TUint32& aSize)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   200
	{
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   201
    __KTRACE_OPT(KPBUSDRV,Kern::Printf(">DBB5PartitionInfo: GetPartitionSizeInSectors(%d)",aPartition));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   202
    
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   203
	TInt r = KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   204
	TUint32 size = 0;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   205
	const TExtendedCSD& extCsd = iCard->ExtendedCSD();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   206
	
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   207
	switch(aPartition)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   208
		{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   209
		case TExtendedCSD::ESelectUserArea:
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   210
			{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   211
			size = (TUint32)(iCard->DeviceSize64() / KSectorSize);
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   212
			
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   213
			if(extCsd.ExtendedCSDRev() >= TExtendedCSD::EExtendedCSDRev1_5)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   214
				{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   215
				TUint32 otherPartitionsSize = 
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   216
					extCsd.GeneralPurposePartition1SizeInSectors()
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   217
					+ extCsd.GeneralPurposePartition2SizeInSectors()
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   218
					+ extCsd.GeneralPurposePartition3SizeInSectors()
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   219
					+ extCsd.GeneralPurposePartition4SizeInSectors();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   220
					
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   221
					__ASSERT_DEBUG(size >= otherPartitionsSize, Kern::Fault("DBB5PartitionInfo size mismatch", __LINE__));
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   222
					size -= otherPartitionsSize;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   223
				}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   224
			}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   225
			break;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   226
		case TExtendedCSD::ESelectBootPartition1:
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   227
		case TExtendedCSD::ESelectBootPartition2:
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   228
			size = (extCsd.ExtendedCSDRev() < TExtendedCSD::EExtendedCSDRev1_3) ? 
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   229
				0 : extCsd.BootSizeInSectors();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   230
			break;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   231
		case TExtendedCSD::ESelectRPMB:
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   232
			size = (extCsd.ExtendedCSDRev() < TExtendedCSD::EExtendedCSDRev1_5) ? 
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   233
				0 : extCsd.RpmbSizeInSectors();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   234
			break;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   235
		case TExtendedCSD::ESelectGPAPartition1:
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   236
			size = (extCsd.ExtendedCSDRev() < TExtendedCSD::EExtendedCSDRev1_5) ? 
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   237
				0 : extCsd.GeneralPurposePartition1SizeInSectors();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   238
			break;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   239
		case TExtendedCSD::ESelectGPAPartition2:
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   240
			size = (extCsd.ExtendedCSDRev() < TExtendedCSD::EExtendedCSDRev1_5) ? 
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   241
				0 : extCsd.GeneralPurposePartition2SizeInSectors();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   242
			break;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   243
		case TExtendedCSD::ESelectGPAPartition3:
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   244
			size = (extCsd.ExtendedCSDRev() < TExtendedCSD::EExtendedCSDRev1_5) ? 
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   245
				0 : extCsd.GeneralPurposePartition3SizeInSectors();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   246
			break;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   247
		case TExtendedCSD::ESelectGPAPartition4:
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   248
			size = (extCsd.ExtendedCSDRev() < TExtendedCSD::EExtendedCSDRev1_5) ? 
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   249
				0 : extCsd.GeneralPurposePartition4SizeInSectors();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   250
			break;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   251
		default:
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   252
			// unknown partition
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   253
			size = 0;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   254
			r = KErrNotSupported;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   255
			break;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   256
		}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   257
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   258
	__KTRACE_OPT(KPBUSDRV,Kern::Printf("<DBB5PartitionInfo: GetPartitionSizeInSectors(size %d, r %d)",size,r));
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   259
	aSize = size;	
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   260
	return r;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   261
	}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   262
	
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   263
TInt DBB5PartitionInfo::GetPartitionOffset(TUint32& aPtiOffset)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   264
	{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   265
	TInt r = GetPartitionSizeInSectors(iSelectedPartition, aPtiOffset);
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   266
		
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   267
	if((r != KErrNone) || (aPtiOffset == 0))
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   268
		{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   269
		// error reading or partition not supported, skip
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   270
		r = KErrNotSupported;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   271
		}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   272
	else
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   273
		{			
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   274
		// need to determine correct end of the partition
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   275
		aPtiOffset -= KPIOffsetFromMediaEnd;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   276
		}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   277
		
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   278
	return r;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   279
	}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   280
	
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   281
TInt DBB5PartitionInfo::SelectNextPartition()
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   282
	{
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   283
    __KTRACE_OPT(KPBUSDRV,Kern::Printf(">DBB5PartitionInfo: SelectNextPartition (%d)",iSelectedPartition));
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   284
	TExtendedCSD extCsd = iCard->ExtendedCSD();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   285
	TUint maxPartition = TExtendedCSD::ESelectUserArea;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   286
	
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   287
	if(extCsd.ExtendedCSDRev() >= TExtendedCSD::EExtendedCSDRev1_5)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   288
		{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   289
		// v4.4 supports UDA, 2x BOOT, RPMB and 4x GPAP partitions
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   290
		maxPartition = TExtendedCSD::ESelectGPAPartition4;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   291
		}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   292
#ifdef EMMC_BOOT_PARTITION_ACCESS_ENABLED
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   293
	else if(extCsd.ExtendedCSDRev() >= TExtendedCSD::EExtendedCSDRev1_3)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   294
		{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   295
		// v4.3 supports up to two BOOT partitions
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   296
		maxPartition = TExtendedCSD::ESelectBootPartition2;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   297
		}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   298
#endif // EMMC_BOOT_PARTITION_ACCESS_ENABLED
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   299
	
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   300
	++iSelectedPartition;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   301
	
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   302
	// skip through to GPAP1 if either the currently selected partition is RPMB or
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   303
	// if it is one of the BOOT partitions and boot partition access is not enabled
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   304
	if((iSelectedPartition == TExtendedCSD::ESelectRPMB)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   305
#ifndef EMMC_BOOT_PARTITION_ACCESS_ENABLED 
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   306
		|| (iSelectedPartition == TExtendedCSD::ESelectBootPartition1)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   307
		|| (iSelectedPartition == TExtendedCSD::ESelectBootPartition2)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   308
#endif	   
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   309
		)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   310
		{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   311
		iSelectedPartition = TExtendedCSD::ESelectGPAPartition1;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   312
		}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   313
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   314
	TInt r = KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   315
	if(iSelectedPartition > maxPartition)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   316
		{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   317
		r = KErrNotFound; // no more partitions to be checked
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   318
		}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   319
	else
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   320
		{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   321
		iSession->SetPartition(iSelectedPartition);
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   322
		}
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   323
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   324
	__KTRACE_OPT(KPBUSDRV,Kern::Printf("<DBB5PartitionInfo: SelectNextPartition (%d) err (%d)",iSelectedPartition, r));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   325
	        
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   326
	return r;	
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   327
	}	
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   328
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   329
TInt DBB5PartitionInfo::ReadPartition(TUint32 aPtOffset)
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   330
    {
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   331
    return ReadPartition(aPtOffset,1);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   332
    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   333
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   334
// returns KErrCompletion on success after having checked all partitions
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   335
TInt DBB5PartitionInfo::ReadPartition(TUint32 aPtOffset, TUint aNumBlocks)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   336
    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   337
    __ASSERT_ALWAYS(aNumBlocks > 0,Kern::Fault("DBB5PartitionInfo:RP aNumBlocks = 0", __LINE__));
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   338
	// If media driver is persistent (see EMediaDriverPersistent)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   339
	// the card may have changed since last power down, so reset CID
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   340
	iSession->SetCard(iCard);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   341
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   342
	if (aNumBlocks == 1)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   343
	    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   344
	    iSession->SetupCIMReadBlock(aPtOffset, iIntBuf);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   345
	    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   346
	else
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   347
	    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   348
	    iSession->SetupCIMReadBlock(aPtOffset, iIntBuf,aNumBlocks);	    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   349
	    }
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   350
	
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   351
	TInt r = iDriver->InCritical();
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   352
	if (r == KErrNone)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   353
		r = iSession->Engage();
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   354
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   355
	if(r != KErrNone)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   356
		iDriver->EndInCritical();
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   357
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   358
	return(r);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   359
	}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   360
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   361
TInt DBB5PartitionInfo::PartitionCaps(TLocDrv& aDrive, TDes8& aInfo)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   362
	{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   363
	TLocalDriveCapsV6Buf& Info = static_cast< TLocalDriveCapsV6Buf&> (aInfo);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   364
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   365
	if (aDrive.iPartitionType == KPartitionTypePagedData)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   366
		{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   367
		Info().iFileSystemId = KDriveFileNone;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   368
		Info().iDriveAtt |= KDriveAttHidden;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   369
		}
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   370
	else if (aDrive.iPartitionType == KPartitionTypeRofs)
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   371
		{
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   372
		Info().iFileSystemId = KDriveFileSysROFS;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   373
		Info().iMediaAtt &= ~KMediaAttFormattable;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   374
		Info().iMediaAtt |= KMediaAttWriteProtected;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   375
		}
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   376
	else if ((aDrive.iPartitionType == KPartitionTypeROM) ||
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   377
			 (aDrive.iPartitionType == KPartitionTypeEmpty))
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   378
		{
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   379
		Info().iFileSystemId = KDriveFileNone;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   380
		Info().iMediaAtt &= ~KMediaAttFormattable;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   381
		Info().iMediaAtt |= KMediaAttWriteProtected;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   382
		}
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   383
    else if ((aDrive.iPartitionType == KPartitionTypePartitionMagic) || //CPS/PMM
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   384
             (aDrive.iPartitionType == KPartitionTypeSymbianCrashLog))
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   385
        {
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   386
        Info().iFileSystemId = KDriveFileNone;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   387
        Info().iMediaAtt |= KMediaAttFormattable;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   388
        }
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   389
	else if ( PartitionIsFAT(aDrive.iPartitionType) || PartitionIsFAT32(aDrive.iPartitionType)	)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   390
		{		
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 52
diff changeset
   391
		Info().iDriveAtt |= iPartitionAttributes[aDrive.iPartitionNumber];
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   392
		}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   393
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   394
	return KErrNone;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   395
	}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   396
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   397
void DBB5PartitionInfo::SessionEndCallBack(TAny* aSelf)
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   398
	{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   399
	DBB5PartitionInfo& self = *static_cast<DBB5PartitionInfo*>(aSelf);
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   400
	self.DoSessionEndCallBack();
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   401
	}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   402
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   403
void DBB5PartitionInfo::DoSessionEndCallBack()
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   404
	{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   405
	iDriver->EndInCritical();
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   406
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   407
	__KTRACE_OPT(KPBUSDRV,Kern::Printf(">DBB5PartitionInfo:DoSessionEndCallBack (%d)",iMedReq));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   408
	
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   409
	TInt r = iSession->EpocErrorCode();
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   410
	
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   411
	if (KErrNone == r)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   412
	    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   413
	    switch (iMedReq)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   414
	        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   415
	        case EDecodeBB5PartitionInfo   : 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   416
	            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   417
                r = DecodeBB5PartitionInfo();
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   418
                if (r == KErrNotFound)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   419
                    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   420
                    // Check for TOC in this partition instead
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   421
                    TUint32 size = 0;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   422
                    r = GetPartitionSizeInSectors(iSelectedPartition,size);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   423
                    if ((KErrNone == r) && (size >= KTocStartSector+1))
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   424
                        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   425
                        //Check partition size to see if TOC could be read (i.e. might be too small)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   426
                        r = ReadPartition(KTocStartSector);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   427
                        iMedReq = (KErrNone==r) ? EDecodeTOCPartitionInfo : EIdle;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   428
                        return;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   429
                        }                    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   430
                    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   431
                // else - found BB5 check if next phys partition has anything to read...
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   432
                break;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   433
	            }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   434
	        case EDecodeTOCPartitionInfo   :
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   435
	            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   436
	            r = DecodeTOCPartitionInfo();
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   437
	            if (r == KErrNone)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   438
	                {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   439
	                //Found a TOC, read version info if available
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   440
	                TUint32 versOffset = 0;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   441
	                iTocCount = 0; //Reset Toc entry counter
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   442
	                r = ReadTOCVersionInfo(versOffset);	                
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   443
	                if (r == KErrNotFound)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   444
	                    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   445
	                    // No valid partitions present
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   446
	                    iMedReq = EIdle;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   447
                        r = KErrNone;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   448
	                    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   449
	                else
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   450
	                    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   451
	                    // Found something to read...
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   452
	                    r = ReadPartition(versOffset, 2);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   453
	                    iMedReq = (KErrNone==r) ? EReadImageVersionInfo : EIdle;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   454
	                    return;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   455
	                    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   456
	                }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   457
	            else
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   458
	                {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   459
	                // TOC not found move on to next phys partition
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   460
	                iMedReq = EIdle;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   461
	                r = KErrNone;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   462
	                }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   463
	            break;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   464
	            }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   465
	        case EReadImageVersionInfo     :
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   466
	            {	            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   467
                DecodeVersionInfo();
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   468
                TUint32 versOffset = 0;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   469
                iTocCount++;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   470
                r = ReadTOCVersionInfo(versOffset);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   471
                if (r == KErrNotFound)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   472
                    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   473
                    //Finished parsing the current TOC                                 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   474
                    //Mark version info as being read in order to report when finished later
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   475
                    iVersionInfoRead = ETrue;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   476
                    iMedReq = EIdle;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   477
                    r=KErrNone;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   478
                    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   479
                else if (r==KErrNone)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   480
                    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   481
                    // more partitions to read
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   482
                    r = ReadPartition(versOffset, 2);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   483
                    iMedReq = (KErrNone==r) ? EReadImageVersionInfo : EIdle;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   484
                    return;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   485
                    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   486
                break;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   487
	            }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   488
	            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   489
	        default : Kern::Fault("DBB5PartitionInfo unknown request type", __LINE__);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   490
	        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   491
	    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   492
	
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   493
	// Next physical partition will be search for if
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   494
	// BB5 entry was found, no TOC entry was found or no Version Information was found
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   495
	if(r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   496
		{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   497
		// check next partition(s) for BB5
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   498
		TUint32 ptiOffset = 0;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   499
	
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   500
		r = SelectNextPartition();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   501
		while(r != KErrNotFound)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   502
			{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   503
			if(r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   504
				r = GetPartitionOffset(ptiOffset);
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   505
				
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   506
			if(r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   507
				{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   508
				r = ReadPartition(ptiOffset);
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   509
				iMedReq = (KErrNone==r) ? EDecodeBB5PartitionInfo : EIdle;
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   510
				if(r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   511
					break;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   512
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   513
				return;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   514
				}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   515
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   516
			r = SelectNextPartition();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   517
			}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   518
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   519
		
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   520
		// end of partitions - reinterpret error code
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   521
		if(r != KErrNotFound)
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   522
			{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   523
			__KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc:dsc: ReadPartition() failed r=%d!", r));
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   524
			r = KErrCorrupt;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   525
			}
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   526
		else if(iPartitionInfo->iPartitionCount == 0)
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   527
			{
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   528
			__KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc:dsc: No supported partitions found!"));
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   529
			r = KErrCorrupt;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   530
			}
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   531
		else
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   532
			r = KErrCompletion;
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   533
		}
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   534
	
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   535
	
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   536
	if (iVersionInfoRead)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   537
	    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   538
	    __KTRACE_OPT(KPBUSDRV, Kern::Printf("%d Version Headers - Register HAL entry", iVersionInfoItems ));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   539
	    //finished parsing the TOC register HAL function            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   540
	    r = Kern::AddHalEntry(EHalGroupNandMedia, halFunction, this, ENandMediaDevice1);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   541
	    if (r==KErrNone)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   542
	        {	        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   543
	        __KTRACE_OPT(KPBUSDRV,Kern::Printf("DBB5PartitionInfo:Added HAL Entry %d",r));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   544
	        r = KErrCompletion; //re-mark as completed
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   545
	        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   546
	    }
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   547
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   548
	// Notify medmmc that partitioninfo is complete
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   549
	iCallBack.CallBack();
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   550
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   551
	// All potential partitions checked - KErrCompletion
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   552
	// indicates that there are no more partitions to check
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   553
	r = (r == KErrCompletion) ? KErrNone : KErrNotReady;
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   554
	__KTRACE_OPT(KPBUSDRV,Kern::Printf("<DBB5PartitionInfo:PartitionInfo Complete %d",r));
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   555
	iDriver->PartitionInfoComplete(r);
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   556
	}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   557
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   558
TInt DBB5PartitionInfo::CheckPartitionBoundaries(TInt aStart, TInt aEnd)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   559
    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   560
    __ASSERT_ALWAYS(aStart >= 0,Kern::Fault("DBB5PartitionInfo:CPB aStart <0", __LINE__));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   561
    __ASSERT_ALWAYS(aEnd > 0,Kern::Fault("DBB5PartitionInfo:CPB aEnd <=0", __LINE__));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   562
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   563
    // Validate partition address boundaries
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   564
    TUint32 eMmcPartitionSizeInSectors = 0;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   565
    TInt r = KErrNone;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   566
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   567
    if (aStart != aEnd)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   568
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   569
        // At least one entry for a supported partition found
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   570
        r = GetPartitionSizeInSectors(iSelectedPartition, eMmcPartitionSizeInSectors);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   571
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   572
        if(r != KErrNone)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   573
            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   574
            __KTRACE_OPT(KPBUSDRV, Kern::Printf("DBB5PartitionInfo:CPB: Could not retrieve size for eMMC partition 0x%02X", iSelectedPartition));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   575
            r = KErrCorrupt;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   576
            }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   577
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   578
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   579
        // Check that the eMmcPartition address space boundary is not exceeded by the last partition
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   580
        if(r == KErrNone)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   581
            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   582
            TUint64 eMmcPartitionSize = eMmcPartitionSizeInSectors * KSectorSize;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   583
            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   584
            TPartitionEntry& part = iPartitionInfo->iEntry[aEnd - 1];
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   585
                
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   586
            if(((TUint64)(part.iPartitionBaseAddr + part.iPartitionLen)) > eMmcPartitionSize)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   587
                {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   588
                __KTRACE_OPT(KPBUSDRV, Kern::Printf("DBB5PartitionInfo:CPB: Partition #%d exceeds eMmc address space", aEnd));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   589
                r = KErrCorrupt;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   590
                }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   591
            }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   592
            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   593
        if(r == KErrNone)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   594
            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   595
            // Go through all BB5 partition entries on this eMMC partition and check boundaries
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   596
            for(TInt i = aEnd - 1; i > aStart; i--)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   597
                {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   598
                const TPartitionEntry& curr = iPartitionInfo->iEntry[i];
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   599
                TPartitionEntry& prev = iPartitionInfo->iEntry[i-1];
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   600
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   601
                // Check if partitions overlap
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   602
                if(curr.iPartitionBaseAddr < (prev.iPartitionBaseAddr + prev.iPartitionLen))
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   603
                    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   604
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("DBB5PartitionInfo:CPB: Overlapping partitions - check #%d", i));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   605
                    r = KErrCorrupt;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   606
                    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   607
                }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   608
            }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   609
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   610
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   611
    return r;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   612
    }
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   613
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   614
TInt DBB5PartitionInfo::DecodeBB5PartitionInfo()
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   615
//
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   616
// Decode partition info that was read into internal buffer
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   617
//
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   618
    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   619
    __KTRACE_OPT(KPBUSDRV, Kern::Printf(">DBB5PartitionInfo: DecodeBB5PartitionInfo(%d)",iPartitionInfo->iPartitionCount));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   620
    TInt partitionCount = iPartitionInfo->iPartitionCount;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   621
    TInt r = KErrNotFound;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   622
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   623
#ifdef __PRINT_RAW_ENTRIES
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   624
    Kern::Printf("BB5 Entry");
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   625
    for (TUint i = 0; i < 512; i+=8)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   626
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   627
        Kern::Printf("%02x %02x %02x %02x   %02x %02x %02x %02x", iIntBuf[i],iIntBuf[i+1],iIntBuf[i+2],iIntBuf[i+3],iIntBuf[i+4],iIntBuf[i+5],iIntBuf[i+6],iIntBuf[i+7]);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   628
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   629
#endif    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   630
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   631
    // Try utilising the BB5 partitioning scheme    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   632
    BGAHSMMCPTN_PI_STR *partitionTable = (BGAHSMMCPTN_PI_STR*)(&iIntBuf[0]);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   633
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   634
    // Verify that this is the BB5 partition table
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   635
    if( memcompare( (TUint8*)&(partitionTable->iId[0]), sizeof(BGAHSMMCPTN_PI_ID), (TUint8*)BGAHSMMCPTN_PI_ID, sizeof(BGAHSMMCPTN_PI_ID)) == 0 )
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   636
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   637
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("Nokia partition structure found"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   638
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("partitionTable->id..............: %s", partitionTable->iId ));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   639
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("partitionTable->sector_size.....: %d = 0x%x", partitionTable->iSector_size, partitionTable->iSector_size));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   640
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("partitionTable->major_ver.......: %d", partitionTable->iMajor_ver));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   641
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("partitionTable->minor_ver.......: %d", partitionTable->iMinor_ver));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   642
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("partitionTable->partition_amount: %d", partitionTable->iPartition_amount));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   643
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   644
        TUint8 partitionType = 0;       
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   645
        // Check Supported Version is present
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   646
        if (partitionTable->iMajor_ver <= BGAHSMMCPTN_PI_VER_MAJOR)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   647
            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   648
            for( TUint8 index = 0; (index < partitionTable->iPartition_amount) && (index < BGAHSMMCPTN_LAST_DRIVE); index++ )
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   649
                {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   650
                if (partitionTable->iMinor_ver >= BGAHSMMCPTN_PART_TYPE_SUPP_VER_MINOR)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   651
                    partitionType = partitionTable->iPartitions[index].iPartition_type;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   652
                else                    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   653
                    partitionType = partitionTable->iPartitions[index].iPartition_id;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   654
            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   655
                // FAT/PMM/CPS/SWAP/CORE/ROFS/CRASH
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   656
                if( (partitionTable->iPartitions[index].iSize > 0) &&
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   657
                    ( PartitionIsFAT(partitionType) ||
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   658
                      PartitionIsFAT32(partitionType) ||
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   659
                     (KPartitionTypeSymbianCrashLog == partitionType) ||
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   660
                     (KPartitionTypePartitionMagic == partitionType) || //CPS/PMM
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   661
                     (KPartitionTypeRofs == partitionType) || 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   662
                     (KPartitionTypeEmpty == partitionType) ||
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   663
                     (KPartitionTypeROM == partitionType) ||
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   664
                     (KPartitionTypePagedData == partitionType) ) )
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   665
                    {                   
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   666
                    iPartitionInfo->iEntry[partitionCount].iPartitionType     = partitionType;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   667
                    iPartitionAttributes[partitionCount]                      = partitionTable->iPartitions[index].iPartition_attributes;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   668
                    static_cast<DMmcMediaDriverFlash *>(iDriver)->SetEMmcPartitionMapping(partitionCount, iSelectedPartition);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   669
                    // ROM/ROFS partitions have a BB5 checksum header that must be offset for the Symbian OS.
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   670
                    const TUint32 KStartOffset = ((KPartitionTypeROM == partitionType) || (KPartitionTypeRofs == partitionType) || (KPartitionTypeEmpty == partitionType)) ? KBB5HeaderSizeInSectors : 0;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   671
                    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   672
                    iPartitionInfo->iEntry[partitionCount].iPartitionBaseAddr = ((Int64) partitionTable->iPartitions[index].iStart_sector + KStartOffset) << KDiskSectorShift;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   673
                    iPartitionInfo->iEntry[partitionCount].iPartitionLen      = ((Int64) partitionTable->iPartitions[index].iSize - KStartOffset) << KDiskSectorShift;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   674
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   675
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("Registering partition #%d:", partitionCount));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   676
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("partitionCount....: %d", partitionCount));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   677
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("startSector.......: 0x%x", partitionTable->iPartitions[index].iStart_sector ));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   678
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("iPartitionBaseAddr: 0x%lx (sectors: %d)", iPartitionInfo->iEntry[partitionCount].iPartitionBaseAddr, (TUint32)(iPartitionInfo->iEntry[partitionCount].iPartitionBaseAddr >> KDiskSectorShift)));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   679
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("size..............: 0x%lx", partitionTable->iPartitions[index].iSize ));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   680
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("iPartitionLen.....: 0x%lx (sectors: %d)", iPartitionInfo->iEntry[partitionCount].iPartitionLen, iPartitionInfo->iEntry[partitionCount].iPartitionLen >> KDiskSectorShift));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   681
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("iPartitionType....: %d", iPartitionInfo->iEntry[partitionCount].iPartitionType));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   682
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("iPartitionAttribs.: 0x%x", iPartitionAttributes[partitionCount]));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   683
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf("iPartitionMapping.: 0x%x", static_cast<DMmcMediaDriverFlash *>(iDriver)->GetEMmcPartitionMapping(partitionCount)));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   684
                    __KTRACE_OPT(KPBUSDRV, Kern::Printf(" "));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   685
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   686
                    partitionCount++;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   687
                    r = KErrNone;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   688
                    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   689
                }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   690
            }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   691
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   692
        if(partitionCount > iPartitionInfo->iPartitionCount)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   693
            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   694
            __KTRACE_OPT(KPBUSDRV, Kern::Printf("DBB5PartitionInfo: New BB5 partitions found"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   695
#ifdef __DEBUG_CHECK_PARTITION_         
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   696
            r = CheckPartitionBoundaries(iPartitionInfo->iPartitionCount,partitionCount);        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   697
            if (r == KErrNone)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   698
#endif // __DEBUG_CHECK_PARTITION_             
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   699
                {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   700
                //Update master partition count
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   701
                iPartitionInfo->iPartitionCount = partitionCount;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   702
                iPartitionInfo->iMediaSizeInBytes = iCard->DeviceSize64();
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   703
                }                
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   704
            }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   705
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   706
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   707
    __KTRACE_OPT(KPBUSDRV, Kern::Printf("< DBB5PartitionInfo: DecodeBB5PartitionInfo(%d)",r));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   708
    return r;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   709
    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   710
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   711
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   712
TInt DBB5PartitionInfo::DecodeTOCPartitionInfo()
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   713
//
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   714
// Decode partition info that was read into internal buffer
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   715
//
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   716
    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   717
    __KTRACE_OPT(KPBUSDRV, Kern::Printf(">DBB5PartitionInfo: DecodeTOCPartitionInfo(%d)",iPartitionInfo->iPartitionCount));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   718
    TInt partitionCount = iPartitionInfo->iPartitionCount;
287
ddfd5aa0d58f 201041_01
hgs
parents: 254
diff changeset
   719
    TInt r = KErrNone;
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   720
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   721
    // Try utilising the TOC (Table Of Contents) partitioning scheme 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   722
    const TText8* KRofsNames[KNoOfROFSPartitions] = { KTocRofs1Generic,
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   723
                                                      KTocRofs2Generic,
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   724
                                                      KTocRofs3Generic,
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   725
                                                      KTocRofs4Generic,
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   726
                                                      KTocRofs5Generic,                                                            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   727
                                                      KTocRofs6Generic,                                                            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   728
                                                      };
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   729
                                    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   730
    STocItem item;    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   731
    memcpy( iTocPtr, &iIntBuf[0], sizeof(Toc));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   732
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   733
#ifdef __PRINT_RAW_ENTRIES
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   734
    Kern::Printf("TOC Entry");
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   735
    for (TUint i = 0; i < 512; i+=8)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   736
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   737
        Kern::Printf("%02x %02x %02x %02x   %02x %02x %02x %02x", iIntBuf[i],iIntBuf[i+1],iIntBuf[i+2],iIntBuf[i+3],iIntBuf[i+4],iIntBuf[i+5],iIntBuf[i+6],iIntBuf[i+7]);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   738
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   739
#endif   
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   740
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   741
    iTocPtr->iTocStartSector = KTocStartSector;
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   742
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   743
// USER Drive - Only 1        
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   744
    r = iTocPtr->GetItemByName(KTocUserName, item); 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   745
    if (KErrNone == r)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   746
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   747
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("[MD  :   ] (%11s) in TOC found : Start addr = 0x%X  Size = 0x%X", item.iFileName, item.iStart, item.iSize));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   748
        iPartitionInfo->iEntry[partitionCount].iPartitionType     = KPartitionTypeFAT16;           
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   749
        iPartitionInfo->iEntry[partitionCount].iPartitionBaseAddr = (Int64)item.iStart;                         
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   750
        iPartitionInfo->iEntry[partitionCount].iPartitionLen      = (Int64)item.iSize;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   751
        iPartitionAttributes[partitionCount] = 0; // No Additional Attributes required.           
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   752
        partitionCount++;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   753
        }   
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   754
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   755
// ROM Drive        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   756
    r = iTocPtr->GetItemByName(KTocRomGeneric, item); 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   757
    if (KErrNone == r)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   758
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   759
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("[MD  :   ] (%11s) in TOC found : Start addr = 0x%x  Size = 0x%x", item.iFileName, item.iStart, item.iSize));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   760
        iPartitionInfo->iEntry[partitionCount].iPartitionType     = KPartitionTypeROM;           
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   761
        iPartitionInfo->iEntry[partitionCount].iPartitionBaseAddr = (Int64) item.iStart + (KBB5HeaderSizeInSectors << KDiskSectorShift);                         
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   762
        iPartitionInfo->iEntry[partitionCount].iPartitionLen      = (Int64) item.iSize - (KBB5HeaderSizeInSectors << KDiskSectorShift);          
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   763
        partitionCount++;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   764
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   765
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   766
// ROFS            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   767
    for (TUint i = 0; i < KNoOfROFSPartitions; i++)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   768
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   769
        /* Search ROFSn item */            
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   770
        r = iTocPtr->GetItemByName(KRofsNames[i], item);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   771
        if (r == KErrNone)
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   772
            {
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   773
            __KTRACE_OPT(KPBUSDRV, Kern::Printf("[MD  :   ] (%11s) in TOC found : Start addr = 0x%X  Size = 0x%X", item.iFileName, item.iStart, item.iSize));
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   774
            iPartitionInfo->iEntry[partitionCount].iPartitionType     = KPartitionTypeRofs;           
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   775
            iPartitionInfo->iEntry[partitionCount].iPartitionBaseAddr = (Int64) item.iStart + (KBB5HeaderSizeInSectors << KDiskSectorShift);                         
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   776
            iPartitionInfo->iEntry[partitionCount].iPartitionLen      = (Int64) item.iSize - (KBB5HeaderSizeInSectors << KDiskSectorShift);
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   777
            partitionCount++;
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   778
            }
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   779
        }         
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   780
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   781
// CPS Drive - Only 1        
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   782
    r = iTocPtr->GetItemByName(KTocCps, item); 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   783
    if (KErrNone == r)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   784
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   785
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("[MD  :   ] (%11s) in TOC found : Start addr = 0x%X  Size = 0x%X", item.iFileName, item.iStart, item.iSize));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   786
        iPartitionInfo->iEntry[partitionCount].iPartitionType     = KPartitionTypePartitionMagic;           
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   787
        iPartitionInfo->iEntry[partitionCount].iPartitionBaseAddr = (Int64) item.iStart;                         
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   788
        iPartitionInfo->iEntry[partitionCount].iPartitionLen      = (Int64) item.iSize;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   789
        partitionCount++;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   790
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   791
    
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   792
// CRASH Drive - Only 1        
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   793
    r = iTocPtr->GetItemByName(KTocCrashLog, item); 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   794
    if (KErrNone == r)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   795
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   796
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("[MD  :   ] (%11s) in TOC found : Start addr = 0x%X  Size = 0x%X", item.iFileName, item.iStart, item.iSize));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   797
        iPartitionInfo->iEntry[partitionCount].iPartitionType     = KPartitionTypeSymbianCrashLog;           
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   798
        iPartitionInfo->iEntry[partitionCount].iPartitionBaseAddr = (Int64) item.iStart;                         
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   799
        iPartitionInfo->iEntry[partitionCount].iPartitionLen      = (Int64) item.iSize;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   800
        partitionCount++;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   801
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   802
    
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   803
// SWAP Partition - Only 1        
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   804
    r = iTocPtr->GetItemByName(KTocSwap, item);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   805
    if (KErrNone == r)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   806
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   807
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("[MD  :   ] (%11s) in TOC found : Start addr = 0x%X  Size = 0x%X", item.iFileName, item.iStart, item.iSize));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   808
        iPartitionInfo->iEntry[partitionCount].iPartitionType     = KPartitionTypePagedData;           
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   809
        iPartitionInfo->iEntry[partitionCount].iPartitionBaseAddr = (Int64) item.iStart;                         
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   810
        iPartitionInfo->iEntry[partitionCount].iPartitionLen      = (Int64) item.iSize;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   811
        partitionCount++;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   812
        }                
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   813
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   814
#ifdef __DEBUG_PARTITIONS_
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   815
    for (TInt i = 0; i<partitionCount; i++)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   816
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   817
        Kern::Printf("iPartitionType....: %d", iPartitionInfo->iEntry[i].iPartitionType);                
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   818
        Kern::Printf("iPartitionBaseAddr: 0x%lx (sectors: %d)", iPartitionInfo->iEntry[i].iPartitionBaseAddr, (TUint32)(iPartitionInfo->iEntry[i].iPartitionBaseAddr >> KDiskSectorShift));                
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   819
        Kern::Printf("iPartitionLen.....: 0x%lx (sectors: %d)", iPartitionInfo->iEntry[i].iPartitionLen, iPartitionInfo->iEntry[i].iPartitionLen >> KDiskSectorShift);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   820
        Kern::Printf("iPartitionAttribs.: 0x%x", iPartitionAttributes[i]);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   821
        Kern::Printf(" ");
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   822
        }
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   823
#endif //__DEBUG_PARTITIONS_
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   824
    
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   825
    if(partitionCount > iPartitionInfo->iPartitionCount)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   826
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   827
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("Mmc: New supported partitions found!"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   828
#ifdef __DEBUG_CHECK_PARTITION_         
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   829
        r = CheckPartitionBoundaries(iPartitionInfo->iPartitionCount,partitionCount);        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   830
        if (r == KErrNone)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   831
#endif // __DEBUG_CHECK_PARTITION_             
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   832
            {
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   833
            //Update master partition count
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   834
            iPartitionInfo->iPartitionCount = partitionCount;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   835
            iPartitionInfo->iMediaSizeInBytes = iCard->DeviceSize64();
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   836
            r = KErrNone;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   837
            }                
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   838
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   839
    else
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   840
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   841
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("<DBB5PartitionInfo: No New Partitions found - TOC"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   842
        r = KErrNotFound;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   843
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   844
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   845
    __KTRACE_OPT(KPBUSDRV, Kern::Printf("<DBB5PartitionInfo: DecodeTOCPartitionInfo(%d)",r));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   846
    return r;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   847
    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   848
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   849
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   850
// Version Info Support
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   851
TInt DBB5PartitionInfo::HalFunction(TInt aFunction, TAny* a1, TAny* /*a2*/)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   852
    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   853
    TInt ret = KErrGeneral;  
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   854
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   855
    __KTRACE_OPT(KPBUSDRV, Kern::Printf(">DBB5PartitionInfo::HalFunction"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   856
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   857
    if (aFunction == EGetVersionInfoItems)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   858
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   859
        __KTRACE_OPT(KPBUSDRV, Kern::Printf(">DBB5PartitionInfo::EGetVersionInfoItems %d Version Headers",iVersionInfoItems ));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   860
        kumemput32(a1, &iVersionInfoItems, sizeof(TUint32));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   861
        ret = KErrNone;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   862
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   863
    else if (aFunction == EGetVersionInfo)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   864
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   865
        __KTRACE_OPT(KPBUSDRV, Kern::Printf(">DBB5PartitionInfo::EGetVersionInfo"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   866
        kumemput32(a1, &iVersionInfo[0], sizeof(TVersionInfoItem)*iVersionInfoItems);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   867
        ret = KErrNone;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   868
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   869
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   870
    __KTRACE_OPT(KPBUSDRV, Kern::Printf("<DBB5PartitionInfo::HalFunction"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   871
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   872
    return ret;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   873
    }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   874
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   875
// returns KErrNotfound if reached the end of the toc
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   876
TInt DBB5PartitionInfo::ReadTOCVersionInfo(TUint32& aOffset)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   877
    {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   878
    TInt r = KErrNotFound;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   879
    for (; iTocCount < KMaxNbrOfTocItems; iTocCount++ )
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   880
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   881
        __KTRACE_OPT(KPBUSDRV, Kern::Printf("ReadTOCVersionInfo: Find next usable TOC entry (%d)",iTocCount));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   882
        // Iterate through the partition info table looking for valid partition headers
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   883
        if ( iTocPtr->iTOC[iTocCount].iStart == KEndOfToc ) 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   884
            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   885
            __KTRACE_OPT(KPBUSDRV, Kern::Printf("ReadTOCVersionInfo: End of the TOC"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   886
            break;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   887
            }    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   888
        else if ( iTocPtr->iTOC[iTocCount].iStart & 0x80000000 )             
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   889
            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   890
            __KTRACE_OPT(KPBUSDRV, Kern::Printf("ReadTOCVersionInfo: Image has negative offset"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   891
            continue;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   892
            }    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   893
        else if ( iTocPtr->iTOC[iTocCount].iSize <= 1024 ) 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   894
            {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   895
            __KTRACE_OPT(KPBUSDRV, Kern::Printf("ReadTOCVersionInfo: entry is less than 2 sectors in size"));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   896
            continue;
202
9aca3be14c27 201027_08
hgs
parents: 90
diff changeset
   897
            }
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   898
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   899
        r = KErrNone;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   900
        break;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   901
        } 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   902
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   903
    if (r == KErrNone)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   904
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   905
        aOffset = ((iTocPtr->iTOC[iTocCount].iStart) >> KSectorShift) + (iTocPtr->iTocStartSector);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   906
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   907
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   908
    return r;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   909
    }
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   910
300
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   911
void DBB5PartitionInfo::DecodeVersionInfo()
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   912
    {    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   913
    __KTRACE_OPT(KPBUSDRV,Kern::Printf(">Decode Version Info (%d)",iVersionInfoItems));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   914
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   915
#ifdef __PRINT_RAW_ENTRIES
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   916
    Kern::Printf("Version Info:");
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   917
    for (TUint i = 0; i < 1024; i+=8)
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   918
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   919
        Kern::Printf("%02x %02x %02x %02x   %02x %02x %02x %02x", iIntBuf[i],iIntBuf[i+1],iIntBuf[i+2],iIntBuf[i+3],iIntBuf[i+4],iIntBuf[i+5],iIntBuf[i+6],iIntBuf[i+7]);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   920
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   921
#endif
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   922
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   923
    // check BB5 common header and image header
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   924
    if ( *(TUint32*)&iIntBuf[0]                  == KBB5_CommonHeaderMagic || 
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   925
         *(TUint32*)&iIntBuf[KImageHeaderOffset] == KImageHeaderMagic )       
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   926
        {
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   927
        // pick up required info from TOC
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   928
        TVersionInfoItem *vinfo = (TVersionInfoItem *)&iVersionInfo[iVersionInfoItems];
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   929
        vinfo->iSectionMaxSize = iTocPtr->iTOC[iTocCount].iSize;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   930
        memcpy( &vinfo->iSectionName[0], &iTocPtr->iTOC[iTocCount].iFileName[0], KMaxSectionNameLen);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   931
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   932
        // pick up required info from image header
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   933
        TImageHeader *himage = (TImageHeader *)&iIntBuf[KImageHeaderOffset];
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   934
        vinfo->iImageCompressedSize = himage->iImageCompressedSize;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   935
        vinfo->iImageSize = himage->iImageSize;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   936
        memcpy( &vinfo->iVersion[0], &himage->iVersion[0], KMaxVersionInfoLen);
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   937
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   938
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   939
        __KTRACE_OPT(KPBUSDRV,Kern::Printf("Section Name (%11s)",vinfo->iSectionName));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   940
        __KTRACE_OPT(KPBUSDRV,Kern::Printf("Section size (%d)",vinfo->iSectionMaxSize));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   941
        __KTRACE_OPT(KPBUSDRV,Kern::Printf("Compressed Size %d", vinfo->iImageCompressedSize));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   942
        __KTRACE_OPT(KPBUSDRV,Kern::Printf("Image Size %d", vinfo->iImageSize));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   943
        __KTRACE_OPT(KPBUSDRV,Kern::Printf("VersionInfo (%11s)",vinfo->iVersion));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   944
        
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   945
        iVersionInfoItems++;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   946
        }
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   947
    
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   948
    __KTRACE_OPT(KPBUSDRV,Kern::Printf("<Decode Version Info (%d)",iVersionInfoItems));
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   949
    return;
1d28c8722707 201043_09
hgs
parents: 287
diff changeset
   950
    }
52
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   951
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   952
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   953
// End - DBB5PartitionInfo
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   954
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   955
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   956
EXPORT_C DEMMCPartitionInfo* CreateEmmcPartitionInfo()
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   957
	{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   958
	return new DBB5PartitionInfo;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   959
	}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   960
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   961
DECLARE_STANDARD_EXTENSION()
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   962
	{
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   963
	return KErrNone;
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   964
	}
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   965
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   966
//	End of File
2d65c2f76d7b Revision: 201005
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   967