userlibandfileserver/fileserver/sfat32/sl_fatmisc32.cpp
author hgs
Tue, 02 Nov 2010 15:42:21 +0000
changeset 301 172f33f13d7d
parent 291 206a6eaaeb71
permissions -rw-r--r--
201043_12
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     1
// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     2
// All rights reserved.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     3
// This component and the accompanying materials are made available
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     5
// which accompanies this distribution, and is available
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     7
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     8
// Initial Contributors:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    10
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    11
// Contributors:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    12
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    13
// Description:
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    14
// f32\sfat\sl_fatmisc32.cpp
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    15
// 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    16
//
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    17
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    18
#include "sl_std.h"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    19
#include "sl_cache.h"
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    20
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
    21
//-------------------------------------------------------------------------------------------------------------------
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    22
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    23
Calculate the FAT size in sectors for a Fat32 volume
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    24
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    25
@return The number of sectors
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    26
*/
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    27
TUint CFatFormatCB::MaxFat32Sectors() const
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    28
	{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    29
	TUint32 calc1 = iMaxDiskSectors - iReservedSectors;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    30
	TUint32 calc2 = (256 * iSectorsPerCluster) + iNumberOfFats;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    31
	calc2 = calc2 >> 1;
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    32
	return ((calc1 + (calc2 - 1))/calc2);
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    33
	}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    34
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    35
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    36
const TUint KDefFatResvdSec = 1;    ///< default number of FAT12/16 reserved sectors
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    37
const TUint KDefFat32ResvdSec = 32; ///< default number of FAT32 reserved sectors
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    38
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    39
//-------------------------------------------------------------------------------------------------------------------
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    40
void Dump_TLDFormatInfo(const TLDFormatInfo& aInfo)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    41
{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    42
    (void)aInfo;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    43
#ifdef _DEBUG
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    44
    __PRINT(_L("----- TLDFormatInfo dump:"));
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    45
    __PRINT1(_L("iCapacity:%d"), aInfo.iCapacity);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    46
    __PRINT1(_L("iSectorsPerCluster:%d"), aInfo.iSectorsPerCluster);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    47
    __PRINT1(_L("iSectorsPerTrack:%d"), aInfo.iSectorsPerTrack);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    48
    __PRINT1(_L("iFATBits:%d"), aInfo.iFATBits);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    49
    __PRINT1(_L("iReservedSectors:%d"), aInfo.iReservedSectors);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    50
    __PRINT1(_L("iFlags:%d"), aInfo.iFlags);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    51
    __PRINT(_L("-----"));
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    52
#endif
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    53
}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    54
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    55
//-------------------------------------------------------------------------------------------------------------------
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    56
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    57
TInt CFatFormatCB::FirstDataSector() const
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    58
	{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    59
	TInt rootDirSectors = (iRootDirEntries * KSizeOfFatDirEntry + (iBytesPerSector-1)) / iBytesPerSector;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    60
    return iHiddenSectors + iReservedSectors + iNumberOfFats*iSectorsPerFat + rootDirSectors;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    61
	}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    62
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    63
void CFatFormatCB::AdjustClusterSize(TUint aRecommendedSectorsPerCluster)
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    64
	{
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    65
    const TUint KMaxSecPerCluster = 64;	// 32K
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    66
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    67
	while (aRecommendedSectorsPerCluster > iSectorsPerCluster && iSectorsPerCluster <= (KMaxSecPerCluster/2))
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    68
		iSectorsPerCluster<<= 1;
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    69
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    70
	}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    71
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    72
// AdjustFirstDataSectorAlignment()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    73
// Attempts to align the first data sector on an erase block boundary by modifying the
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    74
// number of reserved sectors.
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    75
TInt CFatFormatCB::AdjustFirstDataSectorAlignment(TUint aEraseBlockSizeInSectors)
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    76
	{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    77
	const TBool bFat16 = Is16BitFat();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    78
    const TBool bFat32 = Is32BitFat();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    79
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    80
	// Save these 2 values in the event of a convergence failure; this should 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    81
	// hopefully never happen, but we will cater for this in release mode to be safe,
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    82
	TUint reservedSectorsSaved = iReservedSectors;
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    83
	TUint sectorsPerFatSaved = iSectorsPerFat;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    84
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    85
	TUint reservedSectorsOld = 0;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    86
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    87
	// zero for FAT32
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    88
	TUint rootDirSectors = (iRootDirEntries * KSizeOfFatDirEntry + (iBytesPerSector-1)) / iBytesPerSector;
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    89
	TUint fatSectors = 0;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    90
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    91
	TUint KMaxIterations = 10;
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
    92
	TUint n;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    93
	for (n=0; n<KMaxIterations && reservedSectorsOld != iReservedSectors; n++)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    94
		{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    95
		reservedSectorsOld = iReservedSectors;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    96
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    97
		iSectorsPerFat = bFat32 ? MaxFat32Sectors() : bFat16 ? MaxFat16Sectors() : MaxFat12Sectors();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    98
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
    99
		fatSectors = iSectorsPerFat * iNumberOfFats;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   100
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   101
		// calculate number of blocks
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   102
		TInt  nBlocks = (iReservedSectors + fatSectors + rootDirSectors + aEraseBlockSizeInSectors-1) / aEraseBlockSizeInSectors;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   103
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   104
		iReservedSectors = (nBlocks * aEraseBlockSizeInSectors) - rootDirSectors - fatSectors;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   105
		}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   106
	
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   107
	ASSERT(iReservedSectors >= (bFat32 ? KDefFat32ResvdSec : KDefFatResvdSec));
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   108
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   109
	if ((FirstDataSector() & (aEraseBlockSizeInSectors-1)) == 0)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   110
		return KErrNone;
291
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   111
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   112
	
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   113
    iReservedSectors = reservedSectorsSaved;
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   114
	iSectorsPerFat = sectorsPerFatSaved;
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   115
	return KErrGeneral;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   116
	}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   117
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   118
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   119
//-------------------------------------------------------------------------------------------------------------------
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   120
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   121
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   122
Create the boot sector on media for the volume. For FAT32 also creates a backup copy of the boot sector.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   123
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   124
@leave System wide error codes
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   125
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   126
void CFatFormatCB::CreateBootSectorL()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   127
	{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   128
	__PRINT1(_L("CFatFormatCB::CreateBootSector() drive:%d"),DriveNumber());
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   129
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   130
    _LIT8(KName_Fat12,"FAT12   ");    ///< Name in BPB given to a Fat12 volume
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   131
    _LIT8(KName_Fat16,"FAT16   ");    ///< Name in BPB given to a Fat16 volume
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   132
    _LIT8(KName_Fat32,"FAT32   ");    ///< Name in BPB given to a Fat32 volume
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   133
    _LIT8(KDefaultVendorID, "EPOC");  ///< Vendor Name for BPB for any volume formated using a Symbian OS device
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   134
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   135
    const TBool bFat32 = Is32BitFat();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   136
    
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   137
    TFatBootSector bootSector;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   138
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   139
	bootSector.SetVendorID(KDefaultVendorID);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   140
	bootSector.SetBytesPerSector(iBytesPerSector);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   141
	bootSector.SetSectorsPerCluster(iSectorsPerCluster);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   142
	bootSector.SetReservedSectors(iReservedSectors);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   143
	bootSector.SetNumberOfFats(iNumberOfFats);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   144
	iCountOfClusters=iMaxDiskSectors/iSectorsPerCluster;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   145
	if (!bFat32)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   146
		{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   147
		if (iCountOfClusters>(TInt)KMaxTUint16)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   148
			User::Leave(KErrTooBig);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   149
		}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   150
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   151
	bootSector.SetReservedByte(0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   152
	TTime timeID;
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   153
	timeID.HomeTime();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   154
	bootSector.SetUniqueID(I64LOW(timeID.Int64()));	//	Generate Volume UniqueID from time
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   155
	bootSector.SetVolumeLabel(_L8(""));
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   156
	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   157
    //-- set a text string in BPB that corresponds to the FS type
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   158
    switch(FatType())
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   159
        {
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   160
        case EFat12:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   161
            bootSector.SetFileSysType(KName_Fat12);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   162
        break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   163
        
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   164
        case EFat16:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   165
            bootSector.SetFileSysType(KName_Fat16);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   166
        break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   167
        
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   168
        case EFat32:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   169
            bootSector.SetFileSysType(KName_Fat32);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   170
        break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   171
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   172
        default:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   173
            ASSERT(0);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   174
            User::Leave(KErrArgument);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   175
        };
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   176
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   177
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   178
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   179
	bootSector.SetJumpInstruction();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   180
	bootSector.SetMediaDescriptor(KBootSectorMediaDescriptor);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   181
	bootSector.SetNumberOfHeads(iNumberOfHeads);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   182
	bootSector.SetHiddenSectors(iHiddenSectors);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   183
	bootSector.SetSectorsPerTrack(iSectorsPerTrack);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   184
	bootSector.SetPhysicalDriveNumber(128);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   185
	bootSector.SetExtendedBootSignature(0x29);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   186
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   187
	if(bFat32)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   188
		{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   189
		bootSector.SetFatSectors(0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   190
		bootSector.SetFatSectors32(iSectorsPerFat);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   191
		bootSector.SetRootDirEntries(0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   192
		bootSector.SetTotalSectors(0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   193
		bootSector.SetHugeSectors(iMaxDiskSectors);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   194
		bootSector.SetFATFlags(0);			
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   195
		bootSector.SetVersionNumber(0x00);	
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   196
		bootSector.SetRootClusterNum(iRootClusterNum);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   197
		bootSector.SetFSInfoSectorNum(KFSInfoSectorNum);	
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   198
        bootSector.SetBkBootRecSector(KBkBootSectorNum);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   199
		}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   200
	else//fat12 and 16
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   201
		{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   202
		bootSector.SetFatSectors32(0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   203
		bootSector.SetFatSectors(iSectorsPerFat);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   204
		bootSector.SetRootDirEntries(iRootDirEntries);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   205
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   206
		if (iMaxDiskSectors<=KMaxTUint16)
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   207
			{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   208
			bootSector.SetTotalSectors(iMaxDiskSectors);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   209
			bootSector.SetHugeSectors(0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   210
			}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   211
		else
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   212
			{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   213
			bootSector.SetTotalSectors(0);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   214
			bootSector.SetHugeSectors(iMaxDiskSectors);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   215
			}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   216
		}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   217
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   218
	//-- write main boot sector to the first sector on media
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   219
    User::LeaveIfError(FatMount().DoWriteBootSector(KBootSectorNum*bootSector.BytesPerSector(), bootSector));
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   220
	
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   221
    //-- for FAT32 write backup copy of the boot sector
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   222
    if(bFat32)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   223
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   224
        User::LeaveIfError(FatMount().DoWriteBootSector(KBkBootSectorNum*bootSector.BytesPerSector(), bootSector));    
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   225
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   226
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   227
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   228
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   229
//-------------------------------------------------------------------------------------------------------------------
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   230
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   231
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   232
Format a disk section, called iteratively to erase whole of media, on last iteration
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   233
creates an empty volume. If called with quick formatonly erases the Fat leaving the
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   234
rest of the volume intact.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   235
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   236
@leave System wide error code
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   237
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   238
void CFatFormatCB::DoFormatStepL()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   239
	{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   240
	if (iFormatInfo.iFormatIsCurrent==EFalse)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   241
		{ // Only done first time through
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   242
		if (iMode & EForceErase)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   243
			{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   244
			TInt r = FatMount().ErasePassword();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   245
			User::LeaveIfError(r);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   246
			// CFatMountCB::ErasePassword() calls TBusLocalDrive::ForceRemount(),
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   247
			// so need to stop a remount from occurring in next call to :
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   248
			// TFsFormatNext::DoRequestL((), TDrive::CheckMount().
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   249
			FatMount().Drive().SetChanged(EFalse);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   250
			}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   251
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   252
        RecordOldInfoL();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   253
		InitializeFormatDataL();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   254
		FatMount().DoDismount();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   255
		if (iVariableSize)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   256
			FatMount().ReduceSizeL(0,I64LOW(FatMount().iSize));
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   257
		}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   258
    //
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   259
    // Blank disk if not EQuickFormat
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   260
    //
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   261
	if (!iVariableSize && !(iMode & EQuickFormat) && iCurrentStep)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   262
		{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   263
		if (iFormatInfo.iFormatIsCurrent == EFalse)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   264
			{//-- firstly invalidate sectors 0-6 inclusive, they may contain main boot sector, backup boot sector and FSInfo sector.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   265
	        DoZeroFillMediaL(0, (KBkBootSectorNum+1)*iBytesPerSector);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   266
            }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   267
		TInt ret=FatMount().LocalDrive()->Format(iFormatInfo);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   268
		if (ret!=KErrNone && ret!=KErrEof) // Handle format error
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   269
            ret = HandleCorrupt(ret);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   270
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   271
        if (ret!=KErrNone && ret!=KErrEof) // KErrEof could be set by LocalDrive()->Format()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   272
		    User::Leave(ret);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   273
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   274
		if (ret==KErrNone)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   275
			{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   276
			iCurrentStep = I64LOW( 100 - (100 * TInt64(iFormatInfo.i512ByteSectorsFormatted)) / iMaxDiskSectors );
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   277
			if (iCurrentStep<=0)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   278
				iCurrentStep=1;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   279
			return;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   280
			}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   281
		}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   282
291
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   283
    
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   284
    {//-- ReMount whole driver stack since MBR may have been rewritten and partition may have moved / changed size.
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   285
     
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   286
    //-- this is mostly applicable to SD cards formatting, since SD stack takes care of creating partition table.
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   287
    //-- use KForceMediaChangeReOpenAllMediaDrivers flag that will cause remounting media 
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   288
    //-- drivers associatied with the current partition only and not affecting other ones.
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   289
    const TInt ret = LocalDrive()->ForceRemount((TUint)RFs::KForceMediaChangeReOpenMediaDriver);
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   290
    if(ret != KErrNone && ret != KErrNotSupported)
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   291
	    User::Leave(ret);
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   292
    }
206a6eaaeb71 201041_05
hgs
parents: 271
diff changeset
   293
	
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   294
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   295
	// MBR may have changed, so need to re-read iHiddenSectors etc.before BPB is written
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   296
	InitializeFormatDataL();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   297
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   298
    // Translate bad sector number to cluster number which contains that sector
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   299
    // This only happens in full format, in quick format they are already cluster numbers
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   300
    if (!iVariableSize && !(iMode & EQuickFormat))
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   301
        User::LeaveIfError(BadSectorToCluster());
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   302
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   303
	//Check if root cluster is bad and update as required
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   304
	if(Is32BitFat() && !iVariableSize && (iMode & EQuickFormat))
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   305
		{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   306
		if(iBadClusters.Find(iRootClusterNum) !=  KErrNotFound)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   307
			{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   308
			iRootClusterNum++;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   309
            while(iBadClusters.Find(iRootClusterNum) != KErrNotFound)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   310
				{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   311
				iRootClusterNum++;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   312
				}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   313
			}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   314
		}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   315
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   316
    //
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   317
    // Do the rest of the disk in one lump
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   318
    //
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   319
	iCurrentStep=0;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   320
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   321
    //-- zero-fill media from position 0 to the FAT end, i.e main & backup boot sector, FSInfo and its copy and all FATs
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   322
    const TUint32 posFatEnd = ((iSectorsPerFat*iNumberOfFats) + iReservedSectors) * iBytesPerSector; //-- last FAT end position
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   323
	
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   324
    if (iVariableSize)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   325
		FatMount().EnlargeL(posFatEnd); 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   326
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   327
    DoZeroFillMediaL(0, posFatEnd);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   328
    
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   329
    if(Is32BitFat())
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   330
		{//create an empty root directory entry here
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   331
		
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   332
        const TUint KFat32EntrySz = 4; //-- FAT32 entry size, bytes
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   333
        const TInt  startFAT1   = iReservedSectors;              //-- FAT1 start sector
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   334
        const TInt  entryOffset = iRootClusterNum*KFat32EntrySz; //-- Root dir entry offset in the FAT, bytes
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   335
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   336
		TBuf8<KFat32EntrySz> EOF(KFat32EntrySz);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   337
		EOF[0]=0xFF;		
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   338
		EOF[1]=0xFF;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   339
		EOF[2]=0xFF;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   340
		EOF[3]=0x0F;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   341
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   342
        //-- write EOF mark to the every FAT copy
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   343
    	for(TInt i=0; i<iNumberOfFats; i++)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   344
            {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   345
		    const TInt rootDirEntryPos = iBytesPerSector*(startFAT1 + i*iSectorsPerFat) + entryOffset;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   346
            User::LeaveIfError(LocalDrive()->Write(rootDirEntryPos, EOF));
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   347
            }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   348
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   349
        //-- zero-fill FAT32 root directory (just 1 cluster)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   350
		const TInt firstDataSector = iReservedSectors + (iNumberOfFats * iSectorsPerFat); //+RootDirSectors (not required for fat32)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   351
        const TInt firstSectorOfCluster = ((iRootClusterNum - KFatFirstSearchCluster) * iSectorsPerCluster) + firstDataSector;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   352
	
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   353
        const TUint32 posRootDirStart = firstSectorOfCluster * iBytesPerSector;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   354
        const TUint32 posRootDirEnd = posRootDirStart + iSectorsPerCluster*iBytesPerSector;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   355
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   356
        DoZeroFillMediaL(posRootDirStart, posRootDirEnd);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   357
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   358
	else
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   359
		{//-- FAT12/16
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   360
		    //-- Zero fill root directory
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   361
            const TInt rootDirSector = iReservedSectors + (iNumberOfFats * iSectorsPerFat); 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   362
            const TInt rootDirSize   = iRootDirEntries * KSizeOfFatDirEntry; //-- size in bytes
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   363
            
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   364
            const TUint32 posRootDirStart = rootDirSector * iBytesPerSector;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   365
            const TUint32 posRootDirEnd   = posRootDirStart + rootDirSize;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   366
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   367
            const TInt numOfRootSectors=(rootDirSize%iBytesPerSector) ? (rootDirSize/iBytesPerSector+1) : (rootDirSize/iBytesPerSector);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   368
		    if (iVariableSize)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   369
			    FatMount().EnlargeL(iBytesPerSector*numOfRootSectors);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   370
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   371
            DoZeroFillMediaL(posRootDirStart, posRootDirEnd);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   372
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   373
		// Enlarge ram drive to take into account rounding of
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   374
		// data start to cluster boundary
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   375
		if(iVariableSize && iSectorsPerCluster!=1)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   376
			{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   377
			const TInt firstFreeSector=rootDirSector+numOfRootSectors;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   378
			const TInt firstFreeCluster=firstFreeSector%iSectorsPerCluster ? firstFreeSector/iSectorsPerCluster+1 : firstFreeSector/iSectorsPerCluster;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   379
			const TInt alignedSector=firstFreeCluster*iSectorsPerCluster;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   380
			if(alignedSector!=firstFreeSector)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   381
				FatMount().EnlargeL((alignedSector-firstFreeSector)*iBytesPerSector);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   382
			}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   383
		}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   384
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   385
    //-- FAT[0] must contain media descriptor in the low byte, FAT[1] for fat16/32 may contain some flags
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   386
	TBuf8<8> startFat(8);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   387
    startFat.Fill(0xFF);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   388
   
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   389
    if(Is32BitFat()) //-- FAT32
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   390
        {//-- FAT32 uses only low 28 bits in FAT entry. 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   391
        startFat[3] = 0x0F;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   392
        startFat[7] = 0x0F;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   393
        } 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   394
    else if(iVariableSize||Is16BitFat()) //-- FAT16 or RAM drive which is always FAT16
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   395
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   396
        startFat.SetLength(4);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   397
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   398
    else //-- FAT12
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   399
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   400
        startFat.SetLength(3);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   401
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   402
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   403
    startFat[0]=KBootSectorMediaDescriptor;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   404
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   405
    //-- write FAT[0] and FAT[1] entries to all copies of FAT
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   406
	for(TInt i=0;i<iNumberOfFats;i++)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   407
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   408
		User::LeaveIfError(LocalDrive()->Write(iBytesPerSector*(iReservedSectors+(iSectorsPerFat*i)),startFat));
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   409
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   410
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   411
	//-- create boot sectors
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   412
    CreateBootSectorL();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   413
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   414
    //-- create FSInfo sectors
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   415
    if (Is32BitFat())
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   416
		{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   417
		CreateReservedBootSectorL();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   418
        CreateFSInfoSectorL();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   419
		}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   420
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   421
    //-- here we have bad clusters numbers saved by the quick format
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   422
    //-- Interpret old bad cluster number to new cluster number and mark new bad clusters
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   423
    if (!iVariableSize && iBadClusters.Count()>0)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   424
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   425
 	
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   426
        //-- Here we need fully mounted volume, so mount it normally.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   427
	    FatMount().MountL(EFalse);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   428
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   429
        iBadClusters.Sort();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   430
        TranslateL();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   431
        const TInt mark = FatMount().Is32BitFat() ? KBad_32Bit : (FatMount().Is16BitFat() ? KBad_16Bit : KBad_12Bit);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   432
        
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   433
        for (TInt i=0; i<iBadClusters.Count(); ++i)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   434
            FatMount().FAT().WriteL(iBadClusters[i], mark);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   435
        
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   436
        FatMount().FAT().FlushL();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   437
        
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   438
        //-- indicate that the volume is "dirty" in order to the next Mount evend not to use FSInfo, which
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   439
        //-- contains incorrect value of free clusters because we already have bad ones saved.  
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   440
        //-- This is a very rare condition.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   441
        FatMount().SetVolumeCleanL(EFalse); 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   442
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   443
#if defined(_DEBUG)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   444
	TInt r=FatMount().CheckDisk();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   445
	__PRINT1(_L("CFatFormatCB::DoFormatStepL() CheckDisk res: %d"),r);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   446
#endif
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   447
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   448
        else
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   449
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   450
        //-- We do not need to perform full mount in this case, the TDrive object will be marked as changed in ~CFormatCB and the
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   451
        //-- mount will be closed. Therefore on the first access to it it will be mounted normally.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   452
        FatMount().MountL(ETrue); //-- force mount
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   453
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   454
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   455
    __PRINT1(_L("CFatFormatCB::DoFormatStepL() Format complete drv:%d"), DriveNumber());
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   456
	}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   457
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   458
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   459
//-------------------------------------------------------------------------------------------------------------------
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   460
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   461
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   462
void CFatFormatCB::RecordOldInfoL()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   463
    {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   464
    // Check if mount or disk is corrupt
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   465
    // This should be stored in member variable because FatMount is remounted
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   466
    //  every time RFormat::Next() gets called thus FatMount().Initialised()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   467
    //  will be inconsistent with previous state.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   468
	TLocalDriveCapsV3Buf caps;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   469
	User::LeaveIfError(LocalDrive()->Caps(caps));
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   470
	iVariableSize=((caps().iMediaAtt)&KMediaAttVariableSize) ? (TBool)ETrue : (TBool)EFalse;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   471
    iDiskCorrupt = !FatMount().ConsistentState();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   472
    iBadClusters.Reset();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   473
    iBadSectors.Reset();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   474
    if (!iVariableSize && !iDiskCorrupt && (iMode&EQuickFormat))
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   475
        {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   476
        iOldFirstFreeSector = FatMount().iFirstFreeByte>>FatMount().SectorSizeLog2();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   477
        iOldSectorsPerCluster = FatMount().SectorsPerCluster();
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   478
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   479
        FatMount().FAT().InvalidateCacheL(); //-- invalidate whole FAT cache
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   480
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   481
        // Collect bad cluster information from current FAT table
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   482
        const TInt maxClusterNum = FatMount().UsableClusters() + KFatFirstSearchCluster;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   483
        const TUint32 mark = FatMount().Is32BitFat() ? KBad_32Bit : (FatMount().Is16BitFat() ? KBad_16Bit : KBad_12Bit);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   484
        
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   485
        for (TInt i=KFatFirstSearchCluster; i<maxClusterNum; ++i)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   486
            {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   487
            if (FatMount().FAT().ReadL(i) == mark)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   488
                iBadClusters.AppendL(i);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   489
            }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   490
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   491
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   492
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   493
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   494
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   495
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   496
TInt CFatFormatCB::BadSectorToCluster()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   497
    {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   498
    TInt sizeofFatAndRootDir;
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   499
    
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   500
    if(!Is32BitFat())
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   501
		sizeofFatAndRootDir = iSectorsPerFat*iNumberOfFats + ((iRootDirEntries*KSizeOfFatDirEntry+(1<<iSectorSizeLog2)-1)>>iSectorSizeLog2);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   502
    else
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   503
        sizeofFatAndRootDir = (iRootClusterNum-2) * iSectorsPerCluster;
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   504
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   505
    TUint firstFreeSector = iReservedSectors + sizeofFatAndRootDir;
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   506
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   507
    // Check in rare case that corrupt in critical area
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   508
    // which includes bootsector, FAT table, (and root dir if not FAT32)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   509
    TInt i, r;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   510
    for (i=0; i<iBadSectors.Count(); ++i)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   511
        {
90
947f0dc9f7a8 Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 0
diff changeset
   512
        const TUint badSector = iBadSectors[i];
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   513
        // Check in rare case that corrupt in critical area
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   514
        // which includes bootsector, FAT table, (and root dir if not FAT32)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   515
        if (firstFreeSector > badSector)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   516
            {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   517
            if (badSector == 0) // Boot sector corrupt
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   518
                return KErrCorrupt;
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   519
            
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   520
            if (Is32BitFat() && badSector==1) // FSInfo corrupt
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   521
                return KErrCorrupt;
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   522
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   523
            if (badSector < iReservedSectors) // Harmless in reserved area
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   524
                continue;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   525
            // Extend reserved area to cover bad sector
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   526
            iReservedSectors = badSector + 1;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   527
            firstFreeSector = iReservedSectors + sizeofFatAndRootDir;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   528
            continue;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   529
            }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   530
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   531
        // Figure out bad cluster number and record it
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   532
        TUint cluster = (badSector-firstFreeSector)/iSectorsPerCluster+2;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   533
        if (iBadClusters.Find(cluster) == KErrNotFound)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   534
            {
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   535
            if ((r=iBadClusters.Append(cluster)) != KErrNone)
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   536
                return r;
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   537
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   538
            if (Is32BitFat() && iRootClusterNum==cluster)
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   539
                iRootClusterNum++;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   540
            }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   541
        }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   542
    return KErrNone;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   543
    }
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   544
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   545
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   546
Create the File system information sector and its backup copy on a disk. 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   547
Note that CFatMountCB is still not in mounted state, so we can not rely on it.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   548
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   549
@leave System wide error codes
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   550
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   551
void CFatFormatCB::CreateFSInfoSectorL()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   552
	{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   553
	__PRINT1(_L("CFatFormatCB::CreateFSInfoSectorL() drv:%d"), DriveNumber());
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   554
	
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   555
    ASSERT(Is32BitFat()); //-- Actually, CFatMount shall be in a consistent state.
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   556
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   557
    TFSInfo fsInfo;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   558
	TBuf8<KSizeOfFSInfo> fsInfoSecBuf;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   559
    
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   560
    const TUint32 freeSectors  = iMaxDiskSectors - (iReservedSectors + (iNumberOfFats * iSectorsPerFat));
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   561
    const TUint32 freeClusters = (freeSectors / iSectorsPerCluster) - 1; //-- 1st cluster is taken by empty Root Dir on FAT32
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   562
    const TUint32 nextFreeClust = iRootClusterNum+1; 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   563
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   564
    fsInfo.SetFreeClusterCount(freeClusters);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   565
    fsInfo.SetNextFreeCluster(nextFreeClust);
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   566
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   567
    fsInfo.Externalize(fsInfoSecBuf); //-- put data to the sector buffer
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   568
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   569
    User::LeaveIfError(LocalDrive()->Write(KFSInfoSectorNum*iBytesPerSector, fsInfoSecBuf)); //-- main FSInfo Sector
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   570
    User::LeaveIfError(LocalDrive()->Write(KBkFSInfoSectorNum*iBytesPerSector, fsInfoSecBuf)); //-- Backup FSInfo Sector
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   571
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   572
	}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   573
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   574
/**
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   575
Create the reserved boot sector and its backup copy on a disk. 
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   576
These are located at sectors 2 & 8
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   577
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   578
@leave System wide error codes
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   579
*/
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   580
void CFatFormatCB::CreateReservedBootSectorL()
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   581
	{
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   582
	__PRINT1(_L("CFatFormatCB::CreateReserveBootSectorL() drv:%d"), DriveNumber());
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   583
	
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   584
    ASSERT(Is32BitFat());
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   585
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   586
    TFatBootSector bootSector;
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   587
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   588
	User::LeaveIfError(FatMount().DoWriteBootSector(KReservedBootSectorNum*KDefaultSectorSize, bootSector));
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   589
	User::LeaveIfError(FatMount().DoWriteBootSector(KBkReservedBootSectorNum*KDefaultSectorSize, bootSector));    
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   590
	}
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   591
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   592
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   593
//-------------------------------------------------------------------------------------------------------------------
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   594
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   595
/**
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   596
    Initialize the user-specific format parameters
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   597
    Tries to figure out number of FATs, SPC, etc. values passed from the user side.
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   598
    This method is called if the user has specified some formatting parameters, like SPC
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   599
*/
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   600
TInt CFatFormatCB::ProcessVolParam_User(const TLocalDriveCapsV6& aCaps)
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   601
{
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   602
    (void)aCaps;
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   603
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   604
    __PRINT1(_L("CFatFormatCB::ProcessVolParam_User() sectors:%d"), iMaxDiskSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   605
    Dump_TLDFormatInfo(iSpecialInfo());
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   606
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   607
    //-- KErrArgument will be returned if iSpecialInfo().iFATBits isn't one of EFB32, EFB16, EFB32
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   608
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   609
    if(iSpecialInfo().iFlags & TLDFormatInfo::EOneFatTable)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   610
		iNumberOfFats = 1;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   611
    else if(iSpecialInfo().iFlags & TLDFormatInfo::ETwoFatTables)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   612
		iNumberOfFats = 2;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   613
    else if(Drive().IsRemovable())
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   614
		iNumberOfFats = KNumberOfFatsExternal;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   615
	else
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   616
		iNumberOfFats = KNumberOfFatsInternal;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   617
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   618
    
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   619
    if(iSpecialInfo().iReservedSectors)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   620
        iReservedSectors = iSpecialInfo().iReservedSectors; 
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   621
    else
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   622
        iReservedSectors = KDefFatResvdSec; //-- the user hasn't specified reserved sectors count, use default (FAT12/16)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   623
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   624
    //-----------------------------------------
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   625
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   626
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   627
    const TUint KMaxSecPerCluster    = 64; 
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   628
	const TUint KDefaultSecPerCluster= 8;   //-- default value, if the iSpecialInfo().iSectorsPerCluster isn't specified
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   629
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   630
    iSectorsPerCluster = iSpecialInfo().iSectorsPerCluster;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   631
    if(iSectorsPerCluster <= 0)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   632
        {//-- default value, user hasn't specified TLDFormatInfo::iSectorsPerCluster
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   633
        iSectorsPerCluster = KDefaultSecPerCluster; //-- will be adjusted later
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   634
        }
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   635
    else
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   636
        {
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   637
        iSectorsPerCluster = Min(1<<Log2(iSectorsPerCluster), KMaxSecPerCluster);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   638
	    }
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   639
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   640
    //-----------------------------------------
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   641
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   642
    if (iMaxDiskSectors < 4096) // < 2MB
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   643
        {
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   644
        iSectorsPerCluster = 1;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   645
		iRootDirEntries = 128;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   646
        }
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   647
	else if (iMaxDiskSectors < 8192) // < 4MB
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   648
        {
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   649
        iSectorsPerCluster = Min((TUint32)iSectorsPerCluster, (TUint32)2);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   650
		iRootDirEntries = 256;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   651
        }
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   652
	else if (iMaxDiskSectors < 32768) // < 16MB
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   653
        {
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   654
        iSectorsPerCluster = Min((TUint32)iSectorsPerCluster, (TUint32)4);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   655
		iRootDirEntries = 512;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   656
        }
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   657
	else if (iMaxDiskSectors < 1048576) // < 512MB
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   658
        {
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   659
        iSectorsPerCluster = Min((TUint32)iSectorsPerCluster, (TUint32)8);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   660
		iRootDirEntries = 512;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   661
        }
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   662
    else // FAT32
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   663
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   664
        iRootDirEntries = 512;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   665
        iSectorsPerCluster = Min((TUint32)iSectorsPerCluster, (TUint32)KMaxSecPerCluster);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   666
        }
0
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   667
a41df078684a Convert Kernelhwsrv package from SFL to EPL
John Imhofe
parents:
diff changeset
   668
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   669
    //-----------------------------------------
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   670
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   671
	TLDFormatInfo::TFATBits fatBits = iSpecialInfo().iFATBits;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   672
	if (fatBits == TLDFormatInfo::EFBDontCare)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   673
		{//-- the user hasn't specified FAT type, need to work it out according to volume geometry
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   674
        const TFatType fatType = SuggestFatType();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   675
		switch(fatType)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   676
			{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   677
			case EFat12:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   678
				fatBits = TLDFormatInfo::EFB12;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   679
				break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   680
			case EFat16:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   681
				fatBits = TLDFormatInfo::EFB16;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   682
				break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   683
			case EFat32:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   684
				fatBits = TLDFormatInfo::EFB32;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   685
				break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   686
			case EInvalid:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   687
				ASSERT(0);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   688
			}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   689
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   690
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   691
    TFatType reqFatType(EInvalid); //-- requested FAT type
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   692
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   693
    switch (fatBits)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   694
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   695
		case TLDFormatInfo::EFB12:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   696
            SetFatType(EFat12);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   697
			iSectorsPerFat=MaxFat12Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   698
			reqFatType = EFat12;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   699
            break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   700
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   701
		case TLDFormatInfo::EFB16:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   702
            SetFatType(EFat16);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   703
			iSectorsPerFat=MaxFat16Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   704
			reqFatType = EFat16;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   705
            break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   706
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   707
		case TLDFormatInfo::EFB32:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   708
            SetFatType(EFat32);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   709
			iSectorsPerFat=MaxFat32Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   710
	        
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   711
			iRootDirEntries = 0;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   712
			iRootClusterNum = 2;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   713
			
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   714
            if(iSpecialInfo().iReservedSectors == 0)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   715
                iReservedSectors = KDefFat32ResvdSec; //-- user hasn't specified reserved sectors count, use default (FAT32)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   716
            else
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   717
                iReservedSectors = iSpecialInfo().iReservedSectors;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   718
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   719
			reqFatType = EFat32;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   720
            break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   721
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   722
        default:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   723
            __PRINT(_L("CFatFormatCB::InitFormatDataForFixedSizeDiskUser() Incorrect FAT type specifier!"));
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   724
            return KErrArgument;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   725
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   726
	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   727
        //-- check if we can format the volume with requested FAT type
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   728
        const TFatType fatType = SuggestFatType();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   729
        if(fatType != reqFatType)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   730
			{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   731
			//-- volume metrics don't correspond to the requested FAT type
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   732
            __PRINT(_L("CFatFormatCB::InitFormatDataForFixedSizeDiskUser() FAT type mismatch!"));
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   733
            return KErrArgument;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   734
			}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   735
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   736
        return KErrNone;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   737
}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   738
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   739
//-------------------------------------------------------------------------------------------------------------------
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   740
/**
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   741
    Initialize format parameters from the information provided by the media driver.
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   742
    This method is mostly called for SD cards formatting
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   743
*/
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   744
TInt CFatFormatCB::ProcessVolParam_Custom(const TLocalDriveCapsV6& aCaps)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   745
{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   746
    __PRINT(_L("CFatFormatCB::ProcessVolParam_Custom()"));
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   747
    
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   748
    ASSERT(aCaps.iExtraInfo);
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   749
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   750
    //-- the driver may have decided which file system should be used on the media.
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   751
    //-- E.g. for SD cards > 32GB exFAT must be used.
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   752
    if(aCaps.iFileSystemId != KDriveFileSysFAT)
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   753
        {//-- the media driver decides that other than FAT FS must be used on the media.
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   754
        __PRINT1(_L(" the media driver required other than FAT FS:%d"), aCaps.iFileSystemId);
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   755
        return KErrNotSupported;
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   756
        }
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   757
    
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   758
    
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   759
    //-- TLDFormatInfo structure is filled by the media driver, it decides the media formatting parameters
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   760
    const TLDFormatInfo& fmtInfo = aCaps.iFormatInfo;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   761
    Dump_TLDFormatInfo(fmtInfo);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   762
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   763
	if(fmtInfo.iFlags & TLDFormatInfo::EOneFatTable)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   764
		iNumberOfFats = 1;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   765
    else if(fmtInfo.iFlags & TLDFormatInfo::ETwoFatTables)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   766
		iNumberOfFats = 2;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   767
    else if(Drive().IsRemovable())
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   768
		iNumberOfFats = KNumberOfFatsExternal;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   769
	else
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   770
		iNumberOfFats = KNumberOfFatsInternal;	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   771
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   772
	iRootDirEntries=512;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   773
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   774
	iSectorsPerCluster = fmtInfo.iSectorsPerCluster;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   775
	iSectorsPerTrack   = fmtInfo.iSectorsPerTrack;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   776
	iNumberOfHeads	   = fmtInfo.iNumberOfSides;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   777
	iReservedSectors   = fmtInfo.iReservedSectors ? fmtInfo.iReservedSectors : KDefFatResvdSec;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   778
	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   779
    switch (fmtInfo.iFATBits)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   780
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   781
		case TLDFormatInfo::EFB12:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   782
            SetFatType(EFat12);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   783
			iSectorsPerFat  = MaxFat12Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   784
			break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   785
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   786
		case TLDFormatInfo::EFB16:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   787
            SetFatType(EFat16);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   788
			iSectorsPerFat  = MaxFat16Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   789
            break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   790
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   791
		case TLDFormatInfo::EFB32:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   792
            SetFatType(EFat32);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   793
			iReservedSectors = fmtInfo.iReservedSectors ? fmtInfo.iReservedSectors : KDefFat32ResvdSec;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   794
			iSectorsPerFat   = MaxFat32Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   795
			iRootDirEntries  = 0;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   796
			iRootClusterNum  = 2;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   797
            break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   798
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   799
		default:
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   800
			{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   801
			TInt64 clusters64 = (fmtInfo.iCapacity / KDefaultSectorSize) / iSectorsPerCluster;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   802
			TInt clusters = I64LOW(clusters64);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   803
			if (clusters < 4085)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   804
				{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   805
                SetFatType(EFat12);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   806
				iSectorsPerFat  = MaxFat12Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   807
				}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   808
			else if(clusters < 65525)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   809
				{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   810
                SetFatType(EFat16);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   811
				iSectorsPerFat  = MaxFat16Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   812
                }
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   813
			else
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   814
				{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   815
                SetFatType(EFat32);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   816
				iReservedSectors = fmtInfo.iReservedSectors ? fmtInfo.iReservedSectors : KDefFat32ResvdSec;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   817
				iSectorsPerFat   = MaxFat32Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   818
				iRootDirEntries  = 0;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   819
				iRootClusterNum  = 2;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   820
				}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   821
			}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   822
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   823
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   824
    return KErrNone;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   825
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   826
}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   827
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   828
//-------------------------------------------------------------------------------------------------------------------
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   829
/**
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   830
    Initialize format parameters by defult.
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   831
    This method is called if the used has not specified any formatting parameters (all default)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   832
*/
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   833
TInt CFatFormatCB::ProcessVolParam_Default(const TLocalDriveCapsV6& aCaps)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   834
{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   835
	__PRINT1(_L("CFatFormatCB::ProcessVolParam_Default sectors:%d"), iMaxDiskSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   836
    
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   837
    if( Drive().IsRemovable() )
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   838
		iNumberOfFats = KNumberOfFatsExternal;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   839
	else
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   840
		iNumberOfFats = KNumberOfFatsInternal;	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   841
 	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   842
	iReservedSectors=KDefFatResvdSec;		
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   843
	if (iMaxDiskSectors <=4084*1)	// 2MB
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   844
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   845
		iRootDirEntries=128;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   846
		iSectorsPerCluster=1;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   847
        SetFatType(EFat12);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   848
		iSectorsPerFat=MaxFat12Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   849
   		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   850
	else if (iMaxDiskSectors<4084*2) // < 4MB (8168 sectors)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   851
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   852
		iRootDirEntries=256; 
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   853
		iSectorsPerCluster=2;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   854
        SetFatType(EFat12);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   855
		iSectorsPerFat=MaxFat12Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   856
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   857
	else if (iMaxDiskSectors<4084*4) // < 8MB (16336 sectors)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   858
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   859
		iRootDirEntries=512;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   860
		iSectorsPerCluster=4;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   861
        SetFatType(EFat12);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   862
		iSectorsPerFat=MaxFat12Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   863
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   864
	else if (iMaxDiskSectors<4084*8) // < 16MB (32672 sectors)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   865
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   866
		iRootDirEntries=512;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   867
		iSectorsPerCluster=8;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   868
        SetFatType(EFat12);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   869
		iSectorsPerFat=MaxFat12Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   870
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   871
	else if(iMaxDiskSectors<1048576) // >= 16Mb - FAT16   < (1048576) 512MB
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   872
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   873
        SetFatType(EFat16);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   874
		TUint minSectorsPerCluster=(iMaxDiskSectors+KMaxFAT16Entries-1)/KMaxFAT16Entries;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   875
		iRootDirEntries=512;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   876
		iSectorsPerCluster=1;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   877
		
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   878
		while (minSectorsPerCluster>iSectorsPerCluster)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   879
			iSectorsPerCluster<<=1;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   880
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   881
		iSectorsPerFat=MaxFat16Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   882
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   883
	else	//use FAT32
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   884
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   885
        SetFatType(EFat32);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   886
		iRootDirEntries=0;						//this is always the case for fat32
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   887
		
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   888
        if(iMaxDiskSectors < 16777216)		//8GB in 512byte sectors
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   889
			iSectorsPerCluster=8;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   890
		else if(iMaxDiskSectors < 33554432)	//16GB in 512byte sectors
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   891
			iSectorsPerCluster=16;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   892
		else if(iMaxDiskSectors < 67108864)	//32GB in 512byte sectors 
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   893
			iSectorsPerCluster=32;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   894
		else
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   895
			iSectorsPerCluster=64;				//Anything >= 32GB uses a 32K cluster size
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   896
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   897
		iReservedSectors=KDefFat32ResvdSec;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   898
		iRootClusterNum=2;						//As recomended in the document
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   899
		iSectorsPerFat=MaxFat32Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   900
		
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   901
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   902
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   903
	const TFatType fatType = SuggestFatType();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   904
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   905
	// Ensure cluster size is a multiple of the block size
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   906
	TInt blockSizeInSectors = aCaps.iBlockSize >> iSectorSizeLog2;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   907
	__PRINT1(_L("blockSizeInSectors: %d"),blockSizeInSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   908
	ASSERT(blockSizeInSectors == 0 || IsPowerOf2(blockSizeInSectors));
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   909
	if (blockSizeInSectors != 0 && IsPowerOf2(blockSizeInSectors))
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   910
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   911
		__PRINT1(_L("iSectorsPerCluster    (old): %d"),iSectorsPerCluster);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   912
		AdjustClusterSize(blockSizeInSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   913
		__PRINT1(_L("iSectorsPerCluster    (new): %d"),iSectorsPerCluster);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   914
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   915
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   916
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   917
	for (; iSectorsPerCluster>1; iSectorsPerCluster>>= 1)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   918
		{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   919
		// Align first data sector on an erase block boundary if
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   920
		// (1) the iEraseBlockSize is specified
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   921
		// (2) the start of the partition is already aligned to an erase block boundary, 
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   922
		//     i.e. iHiddenSectors is zero or a multiple of iEraseBlockSize
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   923
		__PRINT1(_L("iHiddenSectors: %d"),iHiddenSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   924
		TInt eraseblockSizeInSectors = aCaps.iEraseBlockSize >> iSectorSizeLog2;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   925
		__PRINT1(_L("eraseblockSizeInSectors: %d"),eraseblockSizeInSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   926
		ASSERT(eraseblockSizeInSectors == 0 || IsPowerOf2(eraseblockSizeInSectors));	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   927
		ASSERT(eraseblockSizeInSectors == 0 || eraseblockSizeInSectors >= blockSizeInSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   928
		if ((eraseblockSizeInSectors != 0) &&
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   929
			(iHiddenSectors % eraseblockSizeInSectors == 0) &&	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   930
			(IsPowerOf2(eraseblockSizeInSectors)) &&
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   931
			(eraseblockSizeInSectors >= blockSizeInSectors))
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   932
			{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   933
			TInt r = AdjustFirstDataSectorAlignment(eraseblockSizeInSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   934
			ASSERT(r == KErrNone);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   935
			(void) r;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   936
			}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   937
		__PRINT1(_L("iReservedSectors: %d"),iReservedSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   938
		__PRINT1(_L("FirstDataSector: %d"), FirstDataSector());
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   939
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   940
		// If we've shrunk the number of clusters by so much that it's now invalid for this FAT type
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   941
		// then we need to decrease the cluster size and try again, otherwise we're finshed.
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   942
		if (SuggestFatType() == fatType)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   943
			break;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   944
		}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   945
	__PRINT1(_L("iSectorsPerCluster  (final): %d"),iSectorsPerCluster);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   946
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   947
    return KErrNone;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   948
}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   949
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   950
//-------------------------------------------------------------------------------------------------------------------
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   951
/**
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   952
    Initialize the format parameters for a variable sized disk (RAM drive)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   953
    
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   954
    @return standard error code
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   955
*/
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   956
TInt CFatFormatCB::ProcessVolParam_RamDisk(const TLocalDriveCapsV6& aCaps)
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   957
	{
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   958
	__PRINT1(_L("CFatFormatCB::ProcessVolParam_RamDisk() sectors:%d"), iMaxDiskSectors);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   959
271
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   960
    if(aCaps.iFileSystemId != KDriveFileSysFAT)
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   961
        {//-- RAM media driver must set this value correctly.
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   962
        __PRINT1(_L("RAM media driver required other than FAT FS:%d"), aCaps.iFileSystemId);
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   963
        ASSERT(0);
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   964
        return KErrNotSupported;
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   965
        }
dc268b18d709 201037_07
hgs
parents: 269
diff changeset
   966
269
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   967
    iNumberOfFats   = 2; // 1 FAT 1 Indirection table (FIT)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   968
	iReservedSectors= 1;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   969
	iRootDirEntries = 2*(4*KDefaultSectorSize)/sizeof(SFatDirEntry);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   970
	TUint minSectorsPerCluster=(iMaxDiskSectors+KMaxFAT16Entries-1)/KMaxFAT16Entries;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   971
	iSectorsPerCluster=1;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   972
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   973
	while(minSectorsPerCluster > iSectorsPerCluster)
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   974
		iSectorsPerCluster<<=1;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   975
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   976
	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   977
	iSectorsPerFat=MaxFat16Sectors();
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   978
	__PRINT1(_L("iSectorsPerCluster = %d"),iSectorsPerCluster);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   979
    __PRINT1(_L("iSectorsPerFat = %d"),iSectorsPerFat);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   980
	
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   981
    SetFatType(EFat16);
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   982
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   983
	return KErrNone;
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   984
	}
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   985
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   986
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   987
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   988
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   989
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   990
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   991
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   992
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   993
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   994
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   995
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   996
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   997
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   998
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
   999
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
  1000
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
  1001
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
  1002
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
  1003
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
  1004
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
  1005
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
  1006
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
  1007
d57b86b1867a 201035_03
hgs
parents: 90
diff changeset
  1008