📄 fat.h
字号:
for(SectorAddress=DIRStart;SectorAddress <= DIREnd;SectorAddress++)
{
UFI_Read10(SectorAddress);
for(i=0;i<16;i++)
{
for(j=0;j<32;j++) ((uint8*)&File_Information)[j] = ReadBlockData[i*32 + j];
if(File_Information.FileName[0] == 0) return 0xFF;
if(File_Information.FileName[0] == 0xE5) continue;
if(File_Information.FileName[0] == 0x2E) continue;
if(File_Information.FileName[0] == 0x05) File_Information.FileName[0] = 0xE5;
for(k=0;k<11;k++) if(FileName[k] != File_Information.FileName[k]) break;
if(k==11)
{
filenum = FindUnusedFileNum(1);
if(filenum == 0xFF) return 0xFF;
RWFileStatus[filenum] = 0x01;
for(len = 0; len < sizeof(FILE_INFO); len++) ((uint8*)&RWFileInfo[filenum])[len] = ((uint8*)&File_Information)[len];
StartCluster = File_Information.High16*65536 + File_Information.Low16;
for(len = 0; len < MAXFILECHAINLEN; len++)
{
if(FAT_ID == 0x0B && StartCluster>2 && StartCluster<0xFFFFFFF0)
RWFileClusterChain[filenum][len] = StartCluster;
else if(FAT_ID == 0x01 && StartCluster>2 && StartCluster<0xFF0)
RWFileClusterChain[filenum][len] = StartCluster;
else if(FAT_ID != 0x01 && StartCluster>2 && StartCluster<0xFFF0)
RWFileClusterChain[filenum][len] = StartCluster;
else break;
StartCluster = NextCluster(StartCluster);
}
FileInfoRW[filenum].StartClusterNum = MAXFILECHAINLEN;
FileInfoRW[filenum].StartAddress = (RWFileClusterChain[j][0]-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
FileInfoRW[filenum].NowSectorInCluster = 0;
FileInfoRW[filenum].NowDataInSector = 0;
return filenum;
} // end of if(k==11)
} // end of for(i=0;i<16;i++)
} // end of for(SectorAddress=DIRStart;SectorAddress <= DIREnd;SectorAddress++)
return 0xFF;
}
uint8 ReadFileDirectly(uint8* FileName, uint8* pBuffer, uint32 num)
{
uint8 i,j,k;
uint32 StartCluster,StartAddress;
uint32 SectorAddress;
uint16 len;
for(SectorAddress=DIRStart;SectorAddress<SecondClusterStart;SectorAddress++)
{
UFI_Read10(SectorAddress);
for(i=0;i<16;i++)
{
for(j=0;j<32;j++) ((uint8*)&File_Information)[j] = ReadBlockData[i*32 + j];
if(File_Information.FileName[0] == 0) return 0x10;
if(File_Information.FileName[0] == 0xE5) continue;
if(File_Information.FileName[0] == 0x2E) continue;
if(File_Information.FileName[0] == 0x05) File_Information.FileName[0] = 0xE5;
for(k=0;k<11;k++) if(FileName[k] != File_Information.FileName[k]) break;
if(k==11)
{
StartCluster = File_Information.High16*65536 + File_Information.Low16;
StartAddress = (StartCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
goto MoveFileData_;
}
}
}
return 0x20;
MoveFileData_:
if (File_Information.FileLength > num) File_Information.FileLength = num;
UFI_Read10(StartAddress);
for(len = 0; len < File_Information.FileLength; len++)
{
*pBuffer++ = ReadBlockData[len];
if(len == 511)
{
StartCluster = NextCluster(StartCluster);
if(FAT_ID == 0x0B && StartCluster >= 0xFFFFFFF0)
return 0x30;
else if(FAT_ID == 0x01 && StartCluster >= 0xFF0)
return 0x31;
else if(StartCluster >= 0xFFF0)
return 0x32;
UFI_Read10((StartCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart);
len = 0;
File_Information.FileLength -= 512;
}
}
return 0;
}
uint8 ReadFile(uint8 filenum, uint32 allocate, uint8* pBuffer, uint32 num)
{
uint32 StartCluster;
uint32 len;
if( num == 0) return 0;
if( filenum >= MAXFILENUM) return 0x10;
if( RWFileStatus[filenum] == 0) return 0x20; //filenum not used
if( RWFileStatus[filenum] == 0x01) //filenum opend for read
{
if(allocate >= RWFileInfo[filenum].FileLength ) return 0x40;
if((allocate+num) > RWFileInfo[filenum].FileLength) num = RWFileInfo[filenum].FileLength - allocate;
FileInfoRW[filenum].StartClusterNum = allocate / (Bpb_Fat16.SectorsPerCluster*Bpb_Fat16.SectorBytes);
FileInfoRW[filenum].NowSectorInCluster = (allocate - FileInfoRW[filenum].StartClusterNum*Bpb_Fat16.SectorsPerCluster*Bpb_Fat16.SectorBytes)/Bpb_Fat16.SectorBytes;
FileInfoRW[filenum].NowDataInSector = allocate % Bpb_Fat16.SectorBytes;
StartCluster = RWFileClusterChain[filenum][FileInfoRW[filenum].StartClusterNum];
FileInfoRW[filenum].StartAddress = (StartCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
UFI_Read10(FileInfoRW[filenum].StartAddress + FileInfoRW[filenum].NowSectorInCluster);
if((FileInfoRW[filenum].NowDataInSector + num)<=512)
{
for(len = 0; len < num; len++) *pBuffer++ = ReadBlockData[len+FileInfoRW[filenum].NowDataInSector];
return 0;
}
else
{
for(len = FileInfoRW[filenum].NowDataInSector; len < 512; len++) *pBuffer++ = ReadBlockData[len];
}
FileInfoRW[filenum].NowSectorInCluster++;
if(FileInfoRW[filenum].NowSectorInCluster >= 4)
{
FileInfoRW[filenum].NowSectorInCluster = 0;
FileInfoRW[filenum].StartClusterNum++;
}
StartCluster = RWFileClusterChain[filenum][FileInfoRW[filenum].StartClusterNum];
FileInfoRW[filenum].StartAddress = (StartCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
UFI_Read10(FileInfoRW[filenum].StartAddress + FileInfoRW[filenum].NowSectorInCluster);
num -= (512-FileInfoRW[filenum].NowDataInSector);
for(len = 0; len < num; len++)
{
*pBuffer++ = ReadBlockData[len];
if(len == 511)
{
FileInfoRW[filenum].NowSectorInCluster++;
if(FileInfoRW[filenum].NowSectorInCluster >= 4)
{
FileInfoRW[filenum].NowSectorInCluster = 0;
FileInfoRW[filenum].StartClusterNum++;
}
StartCluster = RWFileClusterChain[filenum][FileInfoRW[filenum].StartClusterNum];
if(FAT_ID == 0x0B && StartCluster >= 0xFFFFFFF0)
return 0x50;
else if(FAT_ID == 0x01 && StartCluster >= 0xFF0)
return 0x51;
else if(StartCluster >= 0xFFF0)
return 0x52;
FileInfoRW[filenum].StartAddress = (StartCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
UFI_Read10(FileInfoRW[filenum].StartAddress + FileInfoRW[filenum].NowSectorInCluster);
len = 0;
num -= 512;
} // end of if(len == 511)
} // end of for(len = 0; len < num; len++)
return 0;
} //end of if( RWFileStatus[filenum] == 0x01)
else return 0x30;
}
uint8 DeleteFile(uint8* FileName)
{
uint8 i,j,k;
uint16 temp;
uint32 StartCluster;
uint32 SectorAddress;
uint16 len;
uint8 tag;
uint16 number;
for(SectorAddress=DIRStart;SectorAddress <= DIREnd;SectorAddress++)
{
UFI_Read10(SectorAddress);
for(i=0;i<16;i++)
{
for(j=0;j<32;j++) ((uint8*)&File_Information)[j] = ReadBlockData[i*32 + j];
if(File_Information.FileName[0] == 0) return 0x10;
if(File_Information.FileName[0] == 0xE5) continue;
if(File_Information.FileName[0] == 0x2E) continue;
if(File_Information.Attribute & 0x18 ) continue; //是目录或者卷标
if(File_Information.FileName[0] == 0x05) File_Information.FileName[0] = 0xE5;
for(k=0;k<11;k++) if(FileName[k] != File_Information.FileName[k]) break;
if(k==11)
{
for(len=0;len<512;len++) WriteBlockData[len] = ReadBlockData[len];
WriteBlockData[i*32] = 0xE5;
UFI_Write10(SectorAddress);
StartCluster = File_Information.High16*65536 + File_Information.Low16;
goto DeleteFATRecord_;
} // end of if(k==11)
} // end of for(i=0;i<16;i++)
} // end of for(SectorAddress=DIRStart;SectorAddress <= DIREnd;SectorAddress++)
return 0x20;
DeleteFATRecord_:
if(FAT_ID == 0x0B)
{
do{
temp = StartCluster/128;
if( (temp+FAT1Start) >= FAT2Start) return 0x20;
if( temp != FAT1num)
{
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
UFI_Read10(FAT1Start + temp);
FAT1num = temp;
for(len=0;len<512;len++) ((uint8*)&FAT1)[len] = ReadBlockData[len];
}
temp = StartCluster%128;
StartCluster = ((uint32*)&FAT1)[temp];
((uint32*)&FAT1)[temp] = 0;
}while(StartCluster>2 && StartCluster<0xFFFFFFF0);
}
else if(FAT_ID == 0x01)
{
do{
number = StartCluster*3>>1;
if(number<<1 == StartCluster*3) tag = 0;
else tag = 1;
temp = number>>9;
if( (temp+FAT1Start) >= FAT2Start) return 0x20;
if( temp != FAT1num)
{
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
UFI_Read10(FAT1Start + temp);
FAT1num = temp;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
}// end of if( temp != FAT1num)
if(tag == 0)
{
if(number%512 == 511)
{
StartCluster = ((uint8*)&FAT1)[511];
((uint8*)&FAT1)[511] = 0;
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
UFI_Read10(FAT1Start + temp + 1);
FAT1num = temp+1;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
StartCluster += (((uint8*)&FAT1)[0] & 0x0F)<<8;
((uint8*)&FAT1)[0] &= 0xF0;
}
else
{
StartCluster = ((uint8*)&FAT1)[number%512] + (((uint8*)&FAT1)[number%512+1]& 0x0F)<<8;
((uint8*)&FAT1)[number%512] = 0;
((uint8*)&FAT1)[number%512+1] = (((uint8*)&FAT1)[number%512+1]& 0xF0);
}
}
else
{
if(number%512 == 511)
{
StartCluster = (((uint8*)&FAT1)[511]& 0xF0)>>4;
((uint8*)&FAT1)[511] &= 0x0F;
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
UFI_Read10(FAT1Start + temp + 1);
FAT1num = temp+1;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
StartCluster += (((uint8*)&FAT1)[0])<<4;
((uint8*)&FAT1)[0] = 0;
}
else
{
StartCluster = (((uint8*)&FAT1)[number%512]& 0xF0)>>4 + (((uint8*)&FAT1)[number%512+1])<<4;
((uint8*)&FAT1)[number%512] &= 0x0F;
((uint8*)&FAT1)[number%512+1] = 0;
}
} // end of if(tag == 0)
}while(StartCluster>2 && StartCluster<0xFF0);
}
else
{
do{
temp = StartCluster/256;
if( (temp+FAT1Start) >= FAT2Start) return 0x20;
if( temp != FAT1num)
{
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
UFI_Read10(FAT1Start + temp);
FAT1num = temp;
for(len=0;len<512;len++) ((uint8*)&FAT1)[len] = ReadBlockData[len];
}
temp = StartCluster%256;
StartCluster = FAT1[temp];
FAT1[temp] = 0;
}while(StartCluster>2 && StartCluster<0xFFF0);
}// end of if(FAT_ID == 0x01)
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
return 0;
}
uint8 DeleteAllFiles(void)
{
uint8 temp;
uint32 SectorAddress;
uint16 len;
for(len=0;len<512;len++) WriteBlockData[len] = 0;
WriteBlockData[0] = 0xF8;
WriteBlockData[1] = 0xFF;
WriteBlockData[2] = 0xFF;
if(FAT_ID == 0x01) WriteBlockData[3] = 0;
else WriteBlockData[3] = 0xFF;
if(FAT_ID == 0x0B)
{
WriteBlockData[4] = 0xFF;
WriteBlockData[5] = 0xFF;
WriteBlockData[6] = 0xFF;
WriteBlockData[7] = 0xFF;
WriteBlockData[8] = 0xFF;
WriteBlockData[9] = 0xFF;
WriteBlockData[10] = 0xFF;
WriteBlockData[11] = 0x0F;
}
UFI_Write10(FAT1Start);
for(len=0;len<12;len++) WriteBlockData[len] = 0;
for(temp = FAT1Start+1; temp < FAT2Start; temp++)
{
UFI_Write10(temp);
}
for(SectorAddress=DIRStart;SectorAddress <= DIREnd;SectorAddress++)
{
UFI_Write10(SectorAddress);
}
return 0;
}
uint32 FAT12FindNextUnusedCluster(uint32 StartCluster)
{
uint8 tag;
uint16 i,j,k;
uint16 temp,cluster;
uint16 number;
do{
number = StartCluster*3>>1;
tag = number%3; //Only = 0 or 1
temp = number/512;
if( (temp+FAT1Start) >= FAT2Start) return 0xFFFFFFFF;
if( temp != FAT1num)
{
UFI_Read10(FAT1Start + temp);
FAT1num = temp;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
}// end of if( temp != FAT1num)
if(tag == 0)
{
cluster = ((uint8*)&FAT1)[number%512];
if(number%512 == 511)
{
UFI_Read10(FAT1Start + temp + 1);
FAT1num = temp+1;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
cluster += (((uint8*)&FAT1)[0] & 0x0F)<<8;
}
else
{
cluster += (((uint8*)&FAT1)[number%512+1] & 0x0F)<<8;
}
}
else
{
cluster = (((uint8*)&FAT1)[number%512]& 0xF0)>>4;
if(number%512 == 511)
{
UFI_Read10(FAT1Start + temp + 1);
FAT1num = temp+1;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
cluster += (((uint8*)&FAT1)[0])<<4;
}
else
{
cluster += (((uint8*)&FAT1)[number%512+1])<<4;
}
}// end of if(tag == 0)
if(cluster == 0)
{
for(k=0;k<MAXFILENUM;k++)
{
if(RWFileStatus[k] == 0) continue;
for(j=0;j<MAXFILECHAINLEN;j++) if(RWFileClusterChain[k][j] == cluster) goto ClusterLoop_;
}
return StartCluster;
}
ClusterLoop_:
StartCluster++;
}while(1);
return 0xFFFFFFFF;
}
// Return 0xFFFFFFFF if no Unused Cluster
uint32 FindNextUnusedCluster(uint32 StartCluster)
{
uint8 first,tag;
uint16 i,j,k;
uint32 temp,cluster;
uint32 number;
if(FAT_ID == 0x0B)
{
temp = StartCluster/128;
first = StartCluster%128;
do{
if( (temp+FAT1Start) >= FAT2Start) return 0xFFFFFFFF;
if( temp != FAT1num)
{
UFI_Read10(FAT1Start + temp);
FAT1num = temp;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
}
for(i=first;i<128;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -