📄 fat.c
字号:
StorePhysicalBLock(u16FAT_FAT_BASE+u16Block,ag8FATReadBuffer);
return(0x00);
}
}
/***************************************************************************************/
void FAT_FileWrite(UINT8 *pu8DataPointer,UINT32 u32Size)
{
UINT32 u32SectorToWrite;
UINT8 *pu8ArrayPointer;
UINT16 u16TempFat;
UINT8 u8ChangeSector=1;
while(u32Size)
{
if(u8ChangeSector)
{
u32SectorToWrite= u16FAT_Data_BASE + WHandler.ClusterIndex + (WHandler.CurrentFatEntry-2)*u16FAT_Cluster_Size;
GetPhysicalBlock(u32SectorToWrite,ag8FATWriteBuffer);
pu8ArrayPointer=ag8FATWriteBuffer+WHandler.SectorIndex;
u8ChangeSector=0;
}
while(WHandler.SectorIndex<u16FAT_Sector_Size && u32Size)
{
u32Size--;
WHandler.SectorIndex++;
WHandler.File_Size++;
*pu8ArrayPointer++=*pu8DataPointer++;
}
StorePhysicalBLock(u32SectorToWrite,ag8FATWriteBuffer); // Write Buffer to Sector
/* Check Sector Size */
if(WHandler.SectorIndex == u16FAT_Sector_Size)
{
WHandler.SectorIndex=0;
WHandler.ClusterIndex++;
u8ChangeSector=1;
}
/* Check Cluster Size */
if(WHandler.ClusterIndex == u16FAT_Cluster_Size)
{
WHandler.ClusterIndex=0;
u16TempFat=FAT_SearchAvailableFAT(WHandler.CurrentFatEntry);
(void)FAT_Entry(WHandler.CurrentFatEntry,u16TempFat,WRITE_ENTRY);
WHandler.CurrentFatEntry=u16TempFat;
u8ChangeSector=1;
}
}
}
/***************************************************************************************/
UINT16 FAT_FileRead(UINT8 *pu8UserBuffer)
{
UINT32 u32SectorToRead;
UINT16 u16BufferSize;
if(RHandler.File_Size==0)
return(0);
_BGND;
u32SectorToRead= u16FAT_Data_BASE + ((RHandler.FAT_Entry-2)*u16FAT_Cluster_Size)+RHandler.SectorOffset;
GetPhysicalBlock(u32SectorToRead,pu8UserBuffer);
if(RHandler.File_Size > u16FAT_Sector_Size)
{
RHandler.File_Size-=u16FAT_Sector_Size;
u16BufferSize=512;
}
else
{
u16BufferSize=(UINT16)RHandler.File_Size;
RHandler.File_Size=0;
}
if(RHandler.SectorOffset < (u16FAT_Cluster_Size)-1)
RHandler.SectorOffset++;
else
{
RHandler.SectorOffset=0;
RHandler.FAT_Entry = FAT_Entry(RHandler.FAT_Entry,0,NEXT_ENTRY); // Get Next FAT Entry
}
return(u16BufferSize);
}
/***************************************************************************************/
void FAT_FileNameOrganizer(UINT8 *pu8FileName,UINT8 *pu8Destiny)
{
UINT8 u8Counter=0;
while(u8Counter<12)
{
if(*pu8FileName != '.')
*pu8Destiny++=*pu8FileName++;
else
{
if(u8Counter<8)
*pu8Destiny++=0x20;
else
pu8FileName++;
}
u8Counter++;
}
}
/***************************************************************************************/
UINT8 FAT_FileOpen(UINT8 *pu8FileName,UINT8 u8Function)
{
UINT16 u16Temporal;
UINT8 u8FileName[11];
UINT8 u8Counter=0;
UINT8 u8Flag=False;
UINT16 u16Index;
UINT16 u16Block;
UINT16 u16BlockNum=u16FAT_Data_BASE-u16FAT_Root_BASE;
UINT8 u8ErrorCode=ERROR_IDLE;
UINT8 *pu8Pointer;
root_Entries *sFileStructure;
FAT_FileNameOrganizer(pu8FileName,&u8FileName[0]);
u16Block=0;
while(u16Block < u16BlockNum && u8ErrorCode==ERROR_IDLE)
{
GetPhysicalBlock(u16FAT_Root_BASE+u16Block,ag8FATReadBuffer);
sFileStructure = (root_Entries*)ag8FATReadBuffer;
u16Index=0;
while(u16Index<u16FAT_Sector_Size && u8ErrorCode==ERROR_IDLE)
{
/* If Read or Modify Function */
if(u8Function==READ || u8Function==MODIFY)
{
if(sFileStructure->FileName[0]==FILE_Clear)
u8ErrorCode=FILE_NOT_FOUND;
if(sFileStructure->FileName[0] == u8FileName[0])
{
u8Flag=True;
u8Counter=0;
while(u8Flag==True && u8Counter < 10)
{
u8Counter++;
if(sFileStructure->FileName[u8Counter] != u8FileName[u8Counter])
u8Flag=False;
}
if(u8Flag==True)
{
/* If Read Function */
if(u8Function==READ)
{
RHandler.Dir_Entry=(u16Block*RootEntrySize)+((u16Index)/RootEntrySize);
RHandler.File_Size=LWordSwap(sFileStructure->SizeofFile);
RHandler.FAT_Entry=ByteSwap(sFileStructure->ClusterNumber);
RHandler.SectorOffset=0;
u8ErrorCode=FILE_FOUND;
}
/* If Modify Function */
else
{
pu8Pointer=WHandler.FileName;
for(u8Counter=0;u8Counter<11;u8Counter++)
*pu8Pointer++=u8FileName[u8Counter];
WHandler.Dir_Entry=(u16Block*RootEntrySize)+((u16Index)/RootEntrySize);
WHandler.File_Size=LWordSwap(sFileStructure->SizeofFile);
WHandler.BaseFatEntry=ByteSwap(sFileStructure->ClusterNumber);
if(WHandler.BaseFatEntry != 0)
{
u16Temporal=WHandler.BaseFatEntry;
do
{
WHandler.CurrentFatEntry=WHandler.BaseFatEntry;
WHandler.BaseFatEntry=FAT_Entry(WHandler.CurrentFatEntry,0,NEXT_ENTRY);
}while(WHandler.BaseFatEntry!=0xFFFF);
WHandler.BaseFatEntry=u16Temporal;
}
else
{
WHandler.BaseFatEntry=FAT_SearchAvailableFAT(0);
WHandler.CurrentFatEntry=WHandler.BaseFatEntry;
}
u16Temporal=(UINT16)WHandler.File_Size % (u16FAT_Sector_Size<<4);
WHandler.ClusterIndex= u16Temporal/u16FAT_Sector_Size;
WHandler.SectorIndex= u16Temporal%u16FAT_Sector_Size;
u8ErrorCode=FILE_FOUND;
}
}
}
}
/* If Write function */
if(u8Function==CREATE)
{
if(sFileStructure->FileName[0]==FILE_Clear || sFileStructure->FileName[0]==FILE_Erased)
{
pu8Pointer=WHandler.FileName;
for(u8Counter=0;u8Counter<11;u8Counter++)
*pu8Pointer++=u8FileName[u8Counter];
WHandler.Dir_Entry=(u16Block*RootEntrySize)+((u16Index)/RootEntrySize);
WHandler.File_Size=0;
WHandler.BaseFatEntry=FAT_SearchAvailableFAT(0);
WHandler.CurrentFatEntry=WHandler.BaseFatEntry;
WHandler.ClusterIndex=0;
WHandler.SectorIndex=0;
if(WHandler.BaseFatEntry)
u8ErrorCode=FILE_CREATE_OK;
else
u8ErrorCode=NO_FAT_ENTRY_AVAIlABLE;
}
}
sFileStructure++;
u16Index+=RootEntrySize;
}
u16Block++;
}
if(u16BlockNum==u16Block)
u8ErrorCode=NO_FILE_ENTRY_AVAILABLE;
return(u8ErrorCode);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -