📄 f_fat.c
字号:
{
sector = (Cluster>>8) + pHandle->FirstFATSector;// 256(>>8) FATEntries(2 bytes) pre Sector
index = (u16)(Cluster%(pHandle->BytesPerSector/2)); //the startentry should be found
}
do
{
if(F_ReadSector(hFile, sector, 1, prFATBuffer))
{
//return CLUST_BAD if HAL_ReadSector failed .
if(pHandle->PartType == PART_TYPE_FAT32)
return (CLUST_BAD&FAT32_MASK);
else
return (CLUST_BAD&FAT16_MASK);
}
if (pHandle->PartType == PART_TYPE_FAT32)
{
for (; index < (pHandle->BytesPerSector/4); index++)//Read all Clusters in a sector
{
if ((fat32Buffer[index]&FAT32_MASK) == 0x00000000)
{
FreeClusterNo = (index + ((sector -pHandle->FirstFATSector)*(pHandle->BytesPerSector/4)));
//Check for MAX Cluster No.
if(FreeClusterNo < (pHandle->NumClusters + 2))
{
fat32Buffer[index] = FAT32_MASK;
F_WriteSector(hFile, sector, 1, prFATBuffer);
F_FAT_FAT2Refresh(sector+ pHandle->FirstFAT2Sector-pHandle->FirstFATSector, 1 ,prFATBuffer);
freesector = F_FAT_ClusterToSector(pHandle, FreeClusterNo);
for(;i<pHandle->SectorsPerCluster;i++)
{
F_ReadSector(hFile, freesector, 1, prSectorBuf);
memset(prSectorBuf,0,pHandle->BytesPerSector);
F_WriteSector(hFile, freesector, 1, prSectorBuf);
freesector++;
}
return FreeClusterNo;
}
else
return 0;
}
}
}
else if(pHandle->PartType == PART_TYPE_FAT16)
{
for (; index < (pHandle->BytesPerSector/2); index++)//Read all Clusters in a sector
{
if ((fat16Buffer[index]&FAT16_MASK) == 0x0000)
{
FreeClusterNo = (index + ((sector -pHandle->FirstFATSector)*(pHandle->BytesPerSector/2)));
//Check for MAX Cluster No.
if(FreeClusterNo < (pHandle->NumClusters + 2))
{
fat16Buffer[index] = FAT16_MASK;
F_WriteSector(hFile, sector, 1, prFATBuffer);
F_FAT_FAT2Refresh(sector+ pHandle->FirstFAT2Sector-pHandle->FirstFATSector, 1 ,prFATBuffer);
freesector = F_FAT_ClusterToSector(pHandle, FreeClusterNo);
for(;i<pHandle->SectorsPerCluster;i++)
{
F_ReadSector(hFile, freesector, 1, prSectorBuf);
memset(prSectorBuf,0,pHandle->BytesPerSector);
F_WriteSector(hFile, freesector, 1, prSectorBuf);
freesector++;
}
return FreeClusterNo;
}
else
return 0;
}
}
}
sector++;
index = 0;//the start entry should be found
}while (sector < pHandle->FirstFATSector+pHandle->FatSectors); // endof Fat entries
return 0;
}
u32 F_FAT_GetNextFreeCluster(FAT_HANDLE *pHandle, u32 Cluster)
{
u8 i = 0;
u16 index;
u32 sector;
u32 *fat32Buffer;
u16 *fat16Buffer;
u32 FreeClusterNo, freesector;
fat32Buffer= (u32 *)prFATBuffer;
fat16Buffer= (u16 *)prFATBuffer;
//Calculate the FAT LBA of this cluster no.
if (pHandle->PartType == PART_TYPE_FAT32)
{
sector = (Cluster>>7) + pHandle->FirstFATSector;// 128(>>7) FATEntries(4 bytes) pre Sector
index = (u16)(Cluster%(pHandle->BytesPerSector/4)); //the startentry should be found
}
else if(pHandle->PartType == PART_TYPE_FAT16)
{
sector = (Cluster>>8) + pHandle->FirstFATSector;// 256(>>8) FATEntries(2 bytes) pre Sector
index = (u16)(Cluster%(pHandle->BytesPerSector/2)); //the startentry should be found
}
do
{
if(F_ReadSector(hFile, sector, 1, prFATBuffer))
{
//return CLUST_BAD if HAL_ReadSector failed .
if(pHandle->PartType == PART_TYPE_FAT32)
return (CLUST_BAD&FAT32_MASK);
else
return (CLUST_BAD&FAT16_MASK);
}
if (pHandle->PartType == PART_TYPE_FAT32)
{
for (; index < (pHandle->BytesPerSector/4); index++)//Read all Clusters in a sector
{
if ((fat32Buffer[index]&FAT32_MASK) == 0x00000000)
{
FreeClusterNo = (index + ((sector -pHandle->FirstFATSector)*(pHandle->BytesPerSector/4)));
//Check for MAX Cluster No.
if(FreeClusterNo < (pHandle->NumClusters + 2))
{
fat32Buffer[index-1] = FreeClusterNo;
fat32Buffer[index] = FAT32_MASK;
F_WriteSector(hFile, sector, 1, prFATBuffer);
F_FAT_FAT2Refresh(sector+ pHandle->FirstFAT2Sector-pHandle->FirstFATSector, 1 ,prFATBuffer);
freesector = F_FAT_ClusterToSector(pHandle, FreeClusterNo);
for(;i<pHandle->SectorsPerCluster;i++)
{
F_ReadSector(hFile, freesector, 1, prSectorBuf);
memset(prSectorBuf,0,pHandle->BytesPerSector);
F_WriteSector(hFile, freesector, 1, prSectorBuf);
freesector++;
}
return FreeClusterNo;
}
else
return 0;
}
}
}
else if(pHandle->PartType == PART_TYPE_FAT16)
{
for (; index < (pHandle->BytesPerSector/2); index++)//Read all Clusters in a sector
{
if ((fat16Buffer[index]&FAT16_MASK) == 0x0000)
{
FreeClusterNo = (index + ((sector -pHandle->FirstFATSector)*(pHandle->BytesPerSector/2)));
//Check for MAX Cluster No.
if(FreeClusterNo < (pHandle->NumClusters + 2))
{
fat16Buffer[index-1] = FreeClusterNo;
fat16Buffer[index] = FAT16_MASK;
F_WriteSector(hFile, sector, 1, prFATBuffer);
F_FAT_FAT2Refresh(sector+ pHandle->FirstFAT2Sector-pHandle->FirstFATSector, 1 ,prFATBuffer);
freesector = F_FAT_ClusterToSector(pHandle, FreeClusterNo);
for(;i<pHandle->SectorsPerCluster;i++)
{
F_ReadSector(hFile, freesector, 1, prSectorBuf);
memset(prSectorBuf,0,pHandle->BytesPerSector);
F_WriteSector(hFile, freesector, 1, prSectorBuf);
freesector++;
}
return FreeClusterNo;
}
else
return 0;
}
}
}
sector++;
index = 0;//the start entry should be found
}while (sector < pHandle->FirstFATSector+pHandle->FatSectors); // endof Fat entries
return 0;
}
void F_FAT_BrowsingReset(FAT_HANDLE *pHandle, F_BrowsingCursor *Cursor)
{
Cursor->CurrentEntryIndex = 0;
Cursor->CurrentSectorAddr = F_FAT_ClusterToSector(pHandle, pHandle->currentDirCluster);
Cursor->DirEntryIndex = 0;
Cursor->SectorOffset = 0;
}
void F_FAT_GetLFN(u8 *debuf, u16 *LFN)
{
u8 i = 0, LfnCounter = 0, j = 0;
LfnCounter = debuf[i++]&0x0F;
for(j = 0;j<5;j++,i +=2)
LFN[(LfnCounter-1)*13 + j] = debuf[i] + (debuf[i+1]<<8);
i += 3;
for(j = 5;j<11;j++,i+=2)
LFN[(LfnCounter-1)*13 + j] = debuf[i] + (debuf[i+1]<<8);
i += 2;
for(j = 11;j<13;j++,i+=2)
LFN[(LfnCounter-1)*13 + j] = debuf[i] + (debuf[i+1]<<8);
}
u8 F_FAT_DirEntryToSFN(F_direntry *pde, c8 *SFNBuf, u8 SFNlen)
{
u8 i,j = 0;
if(SFNlen < 13)
return 1;
memset(SFNBuf,0,SFNlen);
for(i=0;i<8;i++)
{
if(pde->deName[i] == 0x20)
break;
else
SFNBuf[i] = (c8)(pde->deName[i]);
}
if((pde->deLowerCase & LCASE_BASE) == LCASE_BASE)
strlwr(SFNBuf);
if(pde->deExtension[0] != 0x20)
{
SFNBuf[strlen(SFNBuf)] = '.';
i = strlen(SFNBuf);
for(j=0;j<3;j++)
{
if(pde->deExtension[j] == 0x20)
break;
else
SFNBuf[i+j] = (c8)(pde->deExtension[j]);
}
if((pde->deLowerCase & LCASE_EXT) == LCASE_EXT)
strlwr(&SFNBuf[i]);
}
return 0;
}
u8 F_FAT_GetFileInfo(F_direntry *pde, F_FileInfo *fileInfo)
{
u16 date, time;
fileInfo->fileINF_size = pde->deFileSize;
fileInfo->fileINF_start_cluster = pde->deStartCluster + (pde->deHighClust<<16);
return 0;
}
//This function need to return current sector address and direntry index.
u8 F_FAT_GetFreeFDBEntry(FAT_HANDLE *pHandle, u8 num, F_BrowsingCursor *Cursor)
{
u8 Error = ERR_NONE, i = 0, tmpnum = 0, tmp = 0xFF;
u32 u32currnetsector = 0, nextCluster = 0, nextSector = 0;
F_direntry *de;
u32 lastsector = 0, lastindex = 0;
for(;;Cursor->SectorOffset++)
{
if((Cursor->SectorOffset%pHandle->SectorsPerCluster == 0)&&(Cursor->DirEntryIndex == 0))
{
if(Cursor->SectorOffset == 0 && Cursor->CurrentSectorAddr == F_FAT_ClusterToSector(pHandle, pHandle->currentDirCluster))
{
F_ReadSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
de = (F_direntry *)prSectorBuf;
}
else
{
Cursor->SectorOffset = 0;
nextCluster = F_FAT_GetNextCluster(pHandle, F_FAT_SectorToCluster(pHandle, Cursor->CurrentSectorAddr));
if(nextCluster == 0)
{
nextCluster = F_FAT_GetNextFreeCluster(pHandle, F_FAT_SectorToCluster(pHandle, Cursor->CurrentSectorAddr));
if(nextCluster == 0)
return EOF_CLUSTER;
}
nextSector = F_FAT_ClusterToSector(pHandle, nextCluster);
Cursor->CurrentSectorAddr = nextSector;
F_ReadSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
de = (F_direntry *)prSectorBuf;
}
}
else
{
if(Cursor->DirEntryIndex == 0)
{
Cursor->CurrentSectorAddr += Cursor->SectorOffset;
F_ReadSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
}
de = (F_direntry *)prSectorBuf;
}
if(de == NULL)
return EOF_CLUSTER;
for(de += Cursor->DirEntryIndex;Cursor->DirEntryIndex<(pHandle->BytesPerSector/DIRENTRY_SIZE); Cursor->DirEntryIndex++)
{
if(*de->deName!=tmp)
{
tmp = *de->deName;
tmpnum = 0;
}
if(*de->deName == SLOT_EMPTY)
{
tmpnum++;
if(tmpnum == 1)
{
lastsector = Cursor->CurrentSectorAddr;
lastindex = Cursor->DirEntryIndex;
}
if(tmpnum == num)
{
if(Cursor->CurrentSectorAddr != lastsector)
{
Cursor->CurrentSectorAddr = lastsector;
}
Cursor->DirEntryIndex = lastindex;
return ERR_NONE;
}
}
else if(*de->deName == SLOT_DELETED)
{
tmpnum++;
if(tmpnum == 1)
{
lastsector = Cursor->CurrentSectorAddr;
lastindex = Cursor->DirEntryIndex;
}
if(tmpnum == num)
{
if(Cursor->CurrentSectorAddr != lastsector)
{
Cursor->CurrentSectorAddr = lastsector;
}
Cursor->DirEntryIndex = lastindex;
return ERR_NONE;
}
}
else
{
tmpnum = 0;
de++;
}
}
Cursor->DirEntryIndex = 0;
}
return EOF_FATCHAIN;
}
u8 F_FAT_CheckIfLFN(c8 *filename, u8 *fdbnum)
{
u16 i = 0;
c8 *ePtr;
u16 eNameLen,eNameOff=0;
c8 c;
u16 FirstSpacePos=0;
u8 SpaceCount=0;
u16 FirstDotPos=0;
u8 DotNum=0;
u16 ExtPos=0;
u8 ExtFlag=0;
u8 SpecialCharExist=0;
u16 unicode[MAX_LFN_BUF] = {0};
eNameLen = strlen(filename);
ePtr = filename;
eNameOff=i;
ePtr+=i;
for(i=eNameOff;i<eNameLen;i++)
{
c=ePtr[i];
if(ExtFlag == 1&&c!='.')
{
ExtPos++;
}
if(c=='.')
{
ExtFlag = 1;
ExtPos = 0;
if(FirstDotPos==0)
FirstDotPos = i;
DotNum++;
}
else if(c==' ')
{
if(FirstSpacePos==0)
FirstSpacePos = i;
SpaceCount++;
}
else if(c== '+'||c== ','||c==';'||c== '='||c=='['||c==']')
{
SpecialCharExist=1;
}
}
if((eNameLen-eNameOff > 12)
||(ExtPos>3)||(DotNum>1)
||(((FirstSpacePos+SpaceCount)<(eNameLen-eNameOff))&&(SpaceCount>0))
||(SpecialCharExist)
|| ((FirstDotPos==0)&&(eNameLen-eNameOff > 8)))
{
eNameLen = F_GB2312StrToUniStr((u8 *)filename, unicode);
*fdbnum += eNameLen/13;
if(eNameLen%13 !=0)
*fdbnum +=1;
return 1;
}else
{
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -