diff -r a1925fb7753a -r ac03b93ca9c4 imgtools/romtools/rofsbuild/fatimagegenerator.cpp --- a/imgtools/romtools/rofsbuild/fatimagegenerator.cpp Thu Aug 12 09:00:16 2010 +0100 +++ b/imgtools/romtools/rofsbuild/fatimagegenerator.cpp Tue Aug 17 15:31:16 2010 +0800 @@ -35,12 +35,35 @@ iFatTable(0), iFatTableBytes(0), iTotalClusters(0), -iBytsPerClus(0) +iBytsPerClus(aAttr.iDriveClusterSize) { memset(&iBootSector,0,sizeof(iBootSector)); memset(&iFat32Ext,0,sizeof(iFat32Ext)); memset(&iFatHeader,0,sizeof(iFatHeader)); + + if(iBytsPerClus != 0){ + if(iBytsPerClus > KMaxClusterBytes){ + Print(EError,"Cluster size is too large!\n"); + iType = EFatUnknown; + return ; + }else if(iBytsPerClus < aAttr.iDriveSectorSize){ + Print(EError,"Cluster size cannot be smaller than sector size (%d)!\n", aAttr.iDriveSectorSize); + iType = EFatUnknown; + return ; + }else{ + TUint32 tempSectorSize = aAttr.iDriveSectorSize; + while (tempSectorSize < iBytsPerClus){ + tempSectorSize <<=1; + } + if (tempSectorSize > iBytsPerClus){ + Print(EError,"Cluster size should be (power of 2)*(sector size) i.e. 512, 1024, 2048, 4096, etc!\n"); + iType = EFatUnknown; + return; + } + } + } if(aAttr.iDriveSectorSize != 512 && aAttr.iDriveSectorSize != 1024 && aAttr.iDriveSectorSize != 2048 && aAttr.iDriveSectorSize != 4096) { + Print(EError,"Sector size must be one of (512, 1024, 2048, 4096)!\n"); iType = EFatUnknown ; return ; } @@ -66,19 +89,13 @@ TUint32 totalSectors = (TUint32)((aAttr.iImageSize + aAttr.iDriveSectorSize - 1) / aAttr.iDriveSectorSize); if(aType == EFat32) { - InitAsFat32(totalSectors,aAttr.iSectorPerCluster ,aAttr.iDriveSectorSize); + InitAsFat32(totalSectors,aAttr.iDriveSectorSize); } else if(aType == EFat16) { - InitAsFat16(totalSectors,aAttr.iSectorPerCluster,aAttr.iDriveSectorSize); + InitAsFat16(totalSectors,aAttr.iDriveSectorSize); } if(iType == EFatUnknown) return ; iBytsPerClus = iBootSector.BPB_SecPerClus * aAttr.iDriveSectorSize; -// if(iBytsPerClus > KMaxClusterBytes){ -// Print(EError,"Cluster too large!\n"); -// iType = EFatUnknown; -// return ; -// } - } TFatImgGenerator::~TFatImgGenerator() { @@ -92,9 +109,10 @@ } } -void TFatImgGenerator::InitAsFat16(TUint32 aTotalSectors,TUint8 aSecPerClus,TUint16 aBytsPerSec){ +void TFatImgGenerator::InitAsFat16(TUint32 aTotalSectors,TUint16 aBytsPerSec){ TUint32 numOfClusters ; + TUint8 aSecPerClus = iBytsPerClus / aBytsPerSec; if(aSecPerClus == 0) { //Auto-calc the SecPerClus // FAT32 ,Count of clusters must >= 4085 and < 65525 , however , to avoid the "off by xx" warning, @@ -122,19 +140,14 @@ } } else { - if( (aSecPerClus * aBytsPerSec) > KMaxClusterBytes){ - Print(EError,"Cluster too large!\n"); - iType = EFatUnknown; - return ; - } numOfClusters = (aTotalSectors + aSecPerClus - 1) / aSecPerClus; if(numOfClusters >= (65525 - 16)){ - Print(EError,"Cluster count is too big for FAT16, please use the FAT32 format or set a new bigger sector count of cluster!\n"); + Print(EError,"Cluster count is too big for FAT16, please use the FAT32 format or set a new bigger cluster size!\n"); iType = EFatUnknown ; return ; } else if(numOfClusters < (4085 + 16)){ - Print(EError,"Cluster count is too small for FAT16, please set a new small sector count of cluster or set the size bigger!\n"); + Print(EError,"Cluster count is too small for FAT16, please set a new smaller cluster size or set the image size bigger!\n"); iType = EFatUnknown ; return ; } @@ -161,9 +174,10 @@ *((TUint16*)iBootSector.BPB_FATSz16) = sectorsForFAT ; memcpy(iFatHeader.BS_FilSysType,"FAT16 ",sizeof(iFatHeader.BS_FilSysType)); } -void TFatImgGenerator::InitAsFat32(TUint32 aTotalSectors,TUint8 aSecPerClus,TUint16 aBytsPerSec) { +void TFatImgGenerator::InitAsFat32(TUint32 aTotalSectors,TUint16 aBytsPerSec) { TUint32 numOfClusters; + TUint8 aSecPerClus = iBytsPerClus / aBytsPerSec; if(aSecPerClus == 0) { //Auto-calc the SecPerClus // FAT32 ,Count of clusters must >= 65525, however , to avoid the "off by xx" warning, @@ -185,14 +199,9 @@ } } else { - if( (aSecPerClus * aBytsPerSec) > KMaxClusterBytes){ - Print(EError,"Cluster too large!\n"); - iType = EFatUnknown; - return ; - } numOfClusters = (aTotalSectors + aSecPerClus - 1) / aSecPerClus; if(numOfClusters < (65525 + 16)) { - Print(EError,"Cluster count is too small for FAT32, please set a new small sector count of cluster or set the size bigger or use the FAT16 format!\n"); + Print(EError,"Cluster count is too small for FAT32, please set a new smaller cluster size or set the image size bigger or use the FAT16 format!\n"); iType = EFatUnknown ; return ; }