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

📄 fat.h

📁 用SL811做USB主机的源码
💻 H
📖 第 1 页 / 共 3 页
字号:
 
 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 + -