📄 fat.c.bak
字号:
#include "DataType.h"
#include "Console.h"
#include "ufi.h"
#include "host_811.h"
#include "FAT.h"
extern Control USB_Control;
BPB_INFO DiskInfo;
FILE_INFO ThisFile;
DIR_INFO ThisDir;
//WORD FATCache[512*256];
WORD Fat16Cache[2][257];
DWORD Fat32Cache[2][129];
//BYTE BUF[512];
//////////////////////////////////////////////////////////////////////////////////
BYTE InitFsys(void)
{
BYTE BUF[512];
DWORD OffsetSector;
WORD FAT16Size,FSInfoSecNum;
//////////////////////////////////////////////////////////////////////////////
Delay(20000);
if(!Read(0x0,1,(BYTE *)BUF))
return FALSE;
if(BUF[0]==0xeb||BUF[0]==0xe9)
{
OffsetSector=0;
// printf("\n错误3\n");
}
else
{
OffsetSector=MakeU32(BUF[457],BUF[456],BUF[455],BUF[454]);
printf("\n偏移0%d\n",OffsetSector);
}
//开始读取BPB信息
if(Read(OffsetSector,1,(BYTE *)BUF)==FALSE)
{
printf("\n错误01\n");
return FALSE;
}
DiskInfo.BytesPerSec=MakeU16(BUF[12],BUF[11]);
DiskInfo.SecPerClus=BUF[13];
DiskInfo.RootEntCnt=MakeU16(BUF[18],BUF[17]);
DiskInfo.RsvdSecCnt=MakeU16(BUF[15],BUF[14]);
FAT16Size=MakeU16(BUF[23],BUF[22]);
if(FAT16Size>0)
{
USB_Control.bIsFat32=0;
DiskInfo.FATSz=FAT16Size;
DiskInfo.FatStartSector=OffsetSector+DiskInfo.RsvdSecCnt;
DiskInfo.RootStartSector=DiskInfo.FatStartSector+2*DiskInfo.FATSz;
DiskInfo.FirstDataSector=DiskInfo.RootStartSector+(DiskInfo.RootEntCnt>>4);
DiskInfo.FSI_Nxt_Free=2;
///////////////////////////////////////////////////////////////////////
ThisDir.bRootDir=1;
ThisDir.DepthIndex=0;
ThisDir.Link[0]=DiskInfo.RootStartSector;
ThisDir.ParentStartCluster=0;
ThisDir.StartCluster=0;
ThisDir.StartSector=DiskInfo.RootStartSector;
}else{
USB_Control.bIsFat32=1;// is FAT 32
DiskInfo.FATSz=MakeU32(BUF[39],BUF[38],BUF[37],BUF[36]);
DiskInfo.FatStartSector=OffsetSector+DiskInfo.RsvdSecCnt;
DiskInfo.RootClusterNum=MakeU32(BUF[47],BUF[46],BUF[45],BUF[44]);
DiskInfo.FirstDataSector=DiskInfo.FatStartSector+2*DiskInfo.FATSz;
/////////////////////////////////////////////////////////////////////
ThisDir.bRootDir=1;
ThisDir.DepthIndex=0;
ThisDir.Link[0]=DiskInfo.RootClusterNum;
ThisDir.ParentStartCluster=0;
ThisDir.StartCluster=DiskInfo.RootClusterNum;
////////////////////////////////////////////////////////////////////
FSInfoSecNum=MakeU16(BUF[49],BUF[48]);
if(!Read(FSInfoSecNum,1,BUF))
{
return FALSE;
}
DiskInfo.FSI_Free_Count=MakeU32(BUF[491],BUF[490],BUF[489],BUF[488]);
if(DiskInfo.FSI_Free_Count==0xFFFFFFFF)
{
DiskInfo.FSI_Free_Count=0;
}
DiskInfo.FSI_Nxt_Free=MakeU32(BUF[495],BUF[494],BUF[493],BUF[492]);
if(DiskInfo.FSI_Nxt_Free==0xFFFFFFFF)
{
DiskInfo.FSI_Nxt_Free=0;
}
///////////////////////////////////////////////////////////////////
}//end
ThisFile.bOpen=0;
return TRUE;
}
DWORD GetNextCluster(DWORD ClusterNum)
{
BYTE Fatbuf[512];
DWORD Cluster,ThisFATSecNum;
WORD ThisFATEntOffset,FATOffset;
//////////////////////////////////////////////////////////////////////////////////
FATOffset=USB_Control.bIsFat32?(ClusterNum*4):(ClusterNum*2);
ThisFATSecNum=DiskInfo.RsvdSecCnt+(FATOffset/DiskInfo.BytesPerSec);
ThisFATEntOffset=FATOffset%DiskInfo.BytesPerSec;
if(!Read(ThisFATSecNum,1,(BYTE *)Fatbuf))
return FALSE;
if(USB_Control.bIsFat32==0)
{
Cluster=MakeU16(Fatbuf[ThisFATEntOffset+1],Fatbuf[ThisFATEntOffset]);
}else{
Cluster=MakeU32(Fatbuf[ThisFATEntOffset+3],Fatbuf[ThisFATEntOffset+2],\
Fatbuf[ThisFATEntOffset+1],Fatbuf[ThisFATEntOffset]);
}
return Cluster;
}
DWORD ClusterToSec(DWORD ClusterNum)
{
//////////////////////////////////////////////////////////////////
U32 sec;
if(ClusterNum<2)
{
sec=DiskInfo.FirstDataSector;
}else{
sec=(ClusterNum-2)*DiskInfo.SecPerClus+DiskInfo.FirstDataSector;
}
return sec;
}
DWORD SecToCluster(DWORD SectorNum)
{
//////////////////////////////////////////////////////////////////
return ((SectorNum-DiskInfo.FirstDataSector)/DiskInfo.SecPerClus+2);
}
DWORD LinkClusterNum(DWORD ClusterNum)
{
static BYTE VariedCluster=2;
DWORD i,j,CurrentFatSec;
BYTE p;
//////////////////////////////////////////////////////////////////////////////////
if(VariedCluster==2)
{ Fat16Cache[0][256]=0;
Fat32Cache[0][128]=0;
VariedCluster=3;
}
CurrentFatSec=USB_Control.bIsFat32?(ClusterNum*4/DiskInfo.BytesPerSec+DiskInfo.FatStartSector): \
(ClusterNum*2/DiskInfo.BytesPerSec+DiskInfo.FatStartSector);
if(USB_Control.bIsFat32==0)
{
if(Fat16Cache[0][256]!=CurrentFatSec)
{
Fat16Cache[0][256]=0;
if(!Read(CurrentFatSec,1,(BYTE *)Fat16Cache[0]))
{
return FALSE;
}
}
for(i=CurrentFatSec;i<(DiskInfo.FATSz+DiskInfo.FatStartSector);i++)
{
if(i!=CurrentFatSec)
{
p=1;
Fat16Cache[0][256]=0;
if(!Read(i,1,(BYTE *)Fat16Cache[p]))
return FALSE;
}else{
p=0;
Fat16Cache[0][256]=CurrentFatSec;
}
//////////////////////////////////////////////////////////////////////
for(j=0;j<256;j++)
{
if(Fat16Cache[p][j]==0)
{
Fat16Cache[p][j]=0xffff;
Fat16Cache[p][ClusterNum%256]=(i-DiskInfo.FatStartSector)*256+j;
if(i!=CurrentFatSec)
{
if(!Write(CurrentFatSec,1,(BYTE *)Fat16Cache[0]))
return FALSE;
if(!Write(i,1,(BYTE *)Fat16Cache[p]))
return FALSE;
}
return (i-DiskInfo.FatStartSector)*256+j;
}
}//end for j
}//end for i
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//从FAT开始处回查
for(i=DiskInfo.FatStartSector;i<CurrentFatSec;i++)
{
for(j=0;j<256;j++)
{
if(Fat16Cache[p][j]==0x0000)
{
Fat16Cache[p][j]=0xffff;
Fat16Cache[p][ClusterNum%256]=(i-DiskInfo.FatStartSector)*256+j;//WordSwap((i-DiskInfo.FatStartSector)*256+j);
if(!Write(CurrentFatSec,1,(BYTE *)Fat16Cache[0]))
return FALSE;
if(!Write(i,1,(BYTE *)Fat16Cache[p]))
return FALSE;
return (i-DiskInfo.FatStartSector)*256+j;
}
}
}
//回查结束
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
}else{
if(Fat32Cache[0][128]!=CurrentFatSec)
{
Fat32Cache[0][128]=0;
if(!Read(CurrentFatSec,1,(BYTE *)Fat32Cache[0]))
{
return FALSE;
}
}
for(i=CurrentFatSec;i<(DiskInfo.FATSz+DiskInfo.FatStartSector);i++)
{
if(i!=CurrentFatSec)
{
p=1;
Fat32Cache[0][128]=0;
if(!Read(i,1,(BYTE *)Fat32Cache[p]))
return FALSE;
}else{
p=0;
Fat32Cache[0][128]=CurrentFatSec;
}
//////////////////////////////////////////////////////////////////////
for(j=0;j<128;j++)
{
if(Fat32Cache[p][j]==0)
{
Fat32Cache[p][j]=0x0fffffff;
Fat32Cache[p][ClusterNum%128]=(i-DiskInfo.FatStartSector)*128+j;//DWordSwap(i*128+j);
if(i!=CurrentFatSec)
{
if(!Write(CurrentFatSec,1,(BYTE *)Fat32Cache[0]))
return FALSE;
if(!Write(i,1,(BYTE *)Fat32Cache[p]))
return FALSE;
}
///////////////////////////////////////////////////////////////////
return (i-DiskInfo.FatStartSector)*128+j;
}
}//end for j
}//end for i
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//从FAT开始处回查
for(i=DiskInfo.FatStartSector;i<CurrentFatSec;i++)
{
for(j=0;j<128;j++)
{
if(Fat32Cache[p][j]==0x0000)
{
Fat32Cache[p][j]=0x0fffffff;
Fat32Cache[p][ClusterNum%128]=(i-DiskInfo.FatStartSector)*256+j;;//DWordSwap(i*128+j);
if(!Write(CurrentFatSec,1,(BYTE *)Fat32Cache[0]))
return FALSE;
if(!Write(i,1,(BYTE *)Fat32Cache[p]))
return FALSE;
return (i-DiskInfo.FatStartSector)*128+j;;
}
}
}
//回查结束
///////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}//end if
return 0x0fffffff;
}
DWORD SeekEmptyCluster(void)
{
WORD Cache16[256];
DWORD Cache32[128],i,j;
//////////////////////////////////////////////////////////////////////////////////
if(USB_Control.bIsFat32==0)
{
for(i=0;i<DiskInfo.FATSz;i++)
{
if(!Read(i+DiskInfo.FatStartSector,1,(BYTE *)Cache16))
return FALSE;
for(j=0;j<256;j++)
{
if(Cache16[j]==0)
{
return ((i)*256+j);
}
}
}
}else{
for(i=DiskInfo.FatStartSector;i<DiskInfo.FATSz;i++)
{
if(!Read(i,1,(BYTE *)Cache32))
return FALSE;
for(j=0;j<128;j++)
{
if(Cache32[j]==0)
{
return ((i-DiskInfo.FatStartSector)*128+j);
}
}
}
}
return 0xffffffff;
}
BYTE DeleteClusterList(DWORD ClusterNum)
{
WORD sector,FATbuf16[256];
DWORD FATbuf32[128],i,temp;
if(ClusterNum<2)
return TRUE;
if(USB_Control.bIsFat32==0) //is fat16
{
sector=ClusterNum*2/DiskInfo.BytesPerSec;
if(!Read(sector+DiskInfo.FatStartSector,1,(BYTE *)FATbuf16))
{
printf("DeleteClusterList中1错误,%d\n",sector);
return FALSE;
}
i=(ClusterNum)%(DiskInfo.BytesPerSec>>1);
for(;;)
{
if(FATbuf16[i]==0xffff)
{
FATbuf16[i]=0x0000;
if(!Write((sector+DiskInfo.FatStartSector),1,(BYTE *)FATbuf16))
{
printf("DeleteClusterList中2错误,%d\n",sector);
return FALSE;
}
break;
}else{
temp=FATbuf16[i];
FATbuf16[i]=0x00;
i=temp;
}
if((i*2/DiskInfo.BytesPerSec)!=sector)
{
if(!Write((sector+DiskInfo.FatStartSector),1,(BYTE *)FATbuf16))
{
printf("DeleteClusterList中3错误,%d\n",sector);
return FALSE;
}
sector=(i*2/DiskInfo.BytesPerSec);
if(!Read((sector+DiskInfo.FatStartSector),1,(BYTE *)FATbuf16))
{
printf("DeleteClusterList中4错误,%d\n",sector);
return FALSE;
}
i=(i)%(DiskInfo.BytesPerSec>>1);
}
}//end for
}else{// IS FAT32
sector=ClusterNum*4/DiskInfo.BytesPerSec;
if(!Read((sector+DiskInfo.FatStartSector),1,(BYTE *)FATbuf32))
{
return FALSE;
}
i=ClusterNum%(DiskInfo.BytesPerSec>>2);
for(;;)
{
if(FATbuf32[i]==0x0fffffff)
{
FATbuf32[i]=0x0000;
if(!Write((sector+DiskInfo.FatStartSector),1,(BYTE *)FATbuf32))
{
printf("DeleteClusterList中5错误,%d\n",sector);
return FALSE;
}
break;
}else{
temp=FATbuf32[i];
FATbuf32[i]=0x00;
i=temp;
}
if((i*4/DiskInfo.BytesPerSec)!=sector)
{
if(!Write((sector+DiskInfo.FatStartSector),1,(BYTE *)FATbuf32))
{
printf("DeleteClusterList中6错误,%d\n",sector);
return FALSE;
}
sector=(i*4/DiskInfo.BytesPerSec);
if(!Read((sector+DiskInfo.FatStartSector),1,(BYTE *)FATbuf32))
{
printf("DeleteClusterList中7错误,%d\n",sector);
return FALSE;
}
i=i%(DiskInfo.BytesPerSec>>2);
}
}//end for
}
return TRUE;
}
BYTE UpdateFat(void)
{
if(USB_Control.bIsFat32==0)
{
if(Fat16Cache[0][256]!=0)
{
if(!Write(Fat16Cache[0][256],1,(BYTE *)Fat16Cache))
{
return FALSE;
}
}
}else{
// is fat32
if(Fat32Cache[0][128]!=0)
{
if(!Write(Fat32Cache[0][128],1,(BYTE *)Fat32Cache))
{
return FALSE;
}
}
///////////////////////////////////////////////////////////
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -