⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.c

📁 一个精简的FAT16文件系统在NandFLASH上的建立。开发环境ARM7 S3C44b0
💻 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 + -