📄 fat.c
字号:
#include "def.h"
U8 SectorBuffer[512];
U8 ClusterBuffer[32][512];
U16 FatCache[256];
U16 fat[256];
typedef struct{
U8 name[11];
U8 attributes;
U16 startclus;
U16 dirID;
U32 filesize;
}DIR;
DIR file[16];
DIR dirFile[16];
unsigned char d[512];
//*********************************************
void fatInit()
{
int i;
fat[0]=0xffff;
for(i=1;i<256;i++){
fat[i]=0x0;}
printf("fatInit...\n");
NandFlashWrite( 0,0,fat);
}
//*********************************************
//*********************************************
void dirInit()
{
int i,j;
for(i=0;i<16;i++){
for(j=0;j<11;j++)file[i].name[j]='X';
file[i].attributes=0;
file[i].startclus=0x0;
file[i].dirID=0x0;
file[i].filesize=0x0;}
printf("dirInit...\n");
NandFlashWrite( 0,1,file);
}
//*********************************************
void u8toDir(unsigned char *a,DIR *b)
{int i,j;
for(j=0;j<16;j++){
for(i=0;i<11;i++){b[j].name[i]=a[i+20*j];} //U8
b[j].attributes=a[11+20*j]; //U8
b[j].startclus=a[13+20*j]<<8; //U16
b[j].startclus|=a[12+20*j];
b[j].dirID=a[15+20*j]<<8; //U16
b[j].dirID|=a[14+20*j];
b[j].filesize=a[19+20*j]<<24; //U32
b[j].filesize|=a[18+20*j]<<16;
b[j].filesize|=a[17+20*j]<<8;
b[j].filesize|=a[16+20*j];
}
}
//*********************************************
U8 Getfreeclus()
{
U8 i;
for(i=0;i<256;i++){
if(FatCache[i]==0x0)return i;}
printf("\nNo free cluster !\n");
return 1;
}
//*********************************************
//*********************************************
U8 Getfreedir()
{
U8 i;
for(i=0;i<256;i++){
if(dirFile[i].attributes==0)
return i;}
printf("\nSorry,only can create 16 files !\n");
return 1;
}
//*********************************************
void CreateFile(U8 *FileName, U32 Size)
{
U8 ClusID,ClusNum,ClusNext,i,PageNum;
U8 dirID;
printf(" Creating file now....\n");
//printf("\n [");
NandFlashRead(0,0,FatCache); //读出FAT表、根目录
NandFlashRead(0,1,d);
u8toDir(d,dirFile);
dirID=Getfreedir(); //找出空闲的目录
ClusNum = Size / (32 * 512) + 1; //计算文件所需的簇数
PageNum = Size / 512 + 1; //计算文件所需的业数
ClusID=Getfreeclus(); //找出第一个空闲簇
for(i=0;i<11;i++){
dirFile[dirID].name[i]=FileName[i];} //写目录
dirFile[dirID].filesize=Size; //
dirFile[dirID].startclus=ClusID;
dirFile[dirID].dirID=dirID; //
dirFile[dirID].attributes=0xff; //
FatCache[ClusID]=0xffff; //写FAT表
for (i=0;i<ClusNum-1;i++){
ClusNext=Getfreeclus(); //
FatCache[ClusID]=ClusNext; //
ClusID=ClusNext; //
FatCache[ClusID]=0xffff;} //
NandFlashEarse(0);
NandFlashWrite( 0,0,FatCache); //FAT表、根目录写回FLASH
NandFlashWrite( 0,1,dirFile); //
printf(" Succeed!!\n");
}
//*********************************************
void WriteFile(U8 *FileName,U32 Size)
{
U8 flag=1;
U16 i,j,k,fat1[256];
U32 Startclus,Fileclus,Nextclus;
DIR file1[16];
unsigned char a[512];
NandFlashRead(0,1,a); //读dir信息
u8toDir(a,file1);
for(i=0;i<16;i++) //寻找相应的文件
{flag=1;
for(j=0;j<11;j++)
{ if(FileName[j]!=file1[i].name[j])
{ flag=0;
j=11;
}
}
while(flag)
{
Startclus=file1[i].startclus; //找到文件开始簇号
Fileclus=file1[i].filesize; //得到文件总簇号
// printf(" W -File been find!!!- \n");
i=17;
break;
}
}
if(flag==0){
printf(" \n W -File not find!!!- \n");
return;}
//printf(" 0x%x---0x%x ",Startclus,Fileclus);
Nextclus=Startclus;
NandFlashRead(0,0,fat1);
if(Size<=512)//小于一页
{
for(i=0;i<Size;i++)SectorBuffer[i]='W'; //在缓冲区写数据
NandFlashEarse(Nextclus);
NandFlashWrite(Nextclus,0,SectorBuffer);
}
else
if(Size<=32*512)//小于一簇
{
NandFlashEarse(Nextclus);
for(j=0;j<Size/512;j++) //写整数页
{
for(i=0;i<512;i++)SectorBuffer[i]='p';
NandFlashWrite(Nextclus,j,SectorBuffer);
}
for(i=0;i<Size%512;i++)SectorBuffer[i]='G';
NandFlashWrite(Nextclus,Size/512,SectorBuffer); //写余下的文件
}
else//大于一簇
{
for(i=0;i<Size/(32*512);i++) //写整簇
{
NandFlashEarse(Nextclus);
for(j=0;j<32;j++)
{
for(k=0;k<512;k++)SectorBuffer[k]='C';
NandFlashWrite(Nextclus,j,SectorBuffer);
}
Nextclus=fat1[Nextclus];
}
NandFlashEarse(Nextclus);
for(j=0;j<(Size%(512*32))/512;j++) //余下的写整页
{
for(i=0;i<512;i++)SectorBuffer[i]='P';
NandFlashWrite(Nextclus,j,SectorBuffer);
}
for(i=0;i<Size%512;i++)SectorBuffer[i]='Y';
NandFlashWrite(Nextclus,(Size%(512*32))/512,SectorBuffer); //写余下的文件
}
printf("\n -Write file succeed!!!-\n");
return;
}
//*********************************************
void ReadFile(U8 *FileName,U32 Size)
{
U8 flag=1;
U16 i,j,k,fat1[256];
U32 Startclus,Fileclus,Nextclus;
DIR file1[16];
unsigned char a[512];
NandFlashRead(0,1,a); //读dir信息
u8toDir(a,file1);
for(i=0;i<16;i++) //寻找相应的文件
{
flag=1;
for(j=0;j<11;j++)
{
if(FileName[j]!=file1[i].name[j])
{ flag=0;
j=11;
}
}
while(flag)
{
Startclus=file1[i].startclus; //找到文件开始簇号
Fileclus=file1[i].filesize; //得到文件总簇号
//printf(" R-File been find!!!- \n");
i=17;
break;
}
}
if(flag==0){
printf(" \n R -File not find!!!- \n");
return;}
//printf(" 0x%x---0x%x ",Startclus,Fileclus);
Nextclus=Startclus;
NandFlashRead(0,0,fat1);
if(Size<=512)//读 小于一页的
{
NandFlashRead(Nextclus,0,a);
for(i=0;i<Size;i++)printf("%c",a[i]);
}
else
if(Size<=32*512)//读 小于一簇的
{
for(j=0;j<Size/512;j++)
{
NandFlashRead(Nextclus,j,a);
for(i=0;i<512;i++) printf("%c",a[i]);
}
NandFlashRead(Nextclus,Size/512,a);
for(i=0;i<Size%512;i++)printf("%c",a[i]);
}
else //读 大于一簇的
{
for(i=0;i<Size/(32*512);i++) //读整簇
{
for(j=0;j<32;j++)
{
NandFlashRead(Nextclus,j,a);
for(k=0;k<512;k++) printf("%c",a[k]);
}
Nextclus=fat1[Nextclus];
}
for(j=0;j<(Size%(512*32))/512;j++) //读余下的整页
{
NandFlashRead(Nextclus,j,a);
for(i=0;i<512;i++) printf("%c",a[i]);
}
NandFlashRead(Nextclus,(Size%(512*32))/512,a); //读余下的文件
for(i=0;i<Size%512;i++) printf("%c",a[i]);
}
return;
}
//*********************************************
void DeleteFile(U8 *FileName)
{
U8 flag=1;
U16 i,j,fat1[256],temp,temp1,DirID;
U32 Startclus,Fileclus;
DIR file1[16];
unsigned char a[512];
NandFlashRead(0,0,fat1); //读出FAT表、根目录dir
NandFlashRead(0,1,a);
u8toDir(a,file1);
for(i=0;i<16;i++) //寻找相应的文件
{
flag=1;
for(j=0;j<11;j++)
{
if(FileName[j]!=file1[i].name[j])
{ flag=0;
j=11;
}
}
while(flag)
{
Startclus=file1[i].startclus; //找到文件开始簇号
Fileclus=file1[i].filesize; //得到文件总簇数
DirID=file1[i].dirID;
//printf(" -File been find!!!- \n");
i=17;
break;
}
}
if(flag==0){
printf(" \n-File not find!!!- \n");
return;}
for(i=0;i<11;i++) //修改目录
file1[DirID].name[i]='X';
file1[DirID].filesize=0; //
file1[DirID].startclus=0; //
file1[DirID].dirID=0;
file1[DirID].attributes=0;
temp=temp1=Startclus; //修改写FAT表
for (i=0;i<Fileclus;i++){
NandFlashEarse(temp1);
temp1=fat1[temp1];
fat1[temp]=0x0;
temp=temp1;
NandFlashEarse(temp1);}
NandFlashEarse(0);
NandFlashWrite( 0,0,fat1); //FAT表、根目录写回FLASH
NandFlashWrite( 0,1,file1); //
printf(" \n-Delete file succeed!!- ");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -