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

📄 fat.h

📁 用SL811做USB主机的源码
💻 H
📖 第 1 页 / 共 3 页
字号:
	 {
	  if(((uint32*)&FAT1)[i] == 0)
	  {
	    cluster = FAT1num*128+i;
	    for(k=0;k<MAXFILENUM;k++)
	    {
		  if(RWFileStatus[k] == 0) continue;
	  	  for(j=0;j<MAXFILECHAINLEN;j++) if(RWFileClusterChain[k][j] == cluster) goto FindCluster0_;
	    }
		return cluster;
	  } 
FindCluster0_:  
	  NOP();
	 }
	 first = 0;
	 temp++;
	 }while(1); 	 
 }
 else if(FAT_ID == 0x01)
 { 
     return FAT12FindNextUnusedCluster(StartCluster);
 }
 else
 {
	 temp = StartCluster/256; 
	 first = StartCluster%256;  
	 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<256;i++)
	 {
	  if(FAT1[i] == 0)
	  {
	    cluster = FAT1num*256+i;
	    for(k=0;k<MAXFILENUM;k++)
	    {
		  if(RWFileStatus[k] == 0) continue;
	  	  for(j=0;j<MAXFILECHAINLEN;j++) if(RWFileClusterChain[k][j] == cluster) goto FindClusterLoop_;
	    }
		return cluster;
	  } 
FindClusterLoop_:  
	  NOP();
	 }
	 first = 0;
	 temp++;
	 }while(1); 	
 } // end of if(FAT_ID == 0x01)
 return 0xFFFFFFFF;
}

// pBuffer 内存放文件顺次占用的各个簇号
uint8 WriteFAT1FileAllocate(uint32* pBuffer, uint16 num)
{
 uint8  first = 1;
 uint16 temp;
 uint16 i,len;
 uint8  tag;
 uint16 number;
  
 if( num == 0) return 0;
 if(FAT_ID == 0x0B)
 {
	 for(i=0;i<num;i++)
	 {
	   if(pBuffer[i] < 2 || pBuffer[i] > 0xFFFFFFEF) return 0x20;
	   temp = pBuffer[i]/128; 
	   if( (temp+FAT1Start) >= FAT2Start) return 0x30;
	 } 	 
 }
 else if(FAT_ID == 0x01)
 {
	 for(i=0;i<num;i++)
	 {
	   if(pBuffer[i] < 2 || pBuffer[i] > 0xFEF) return 0x21;
	   temp = (pBuffer[i]*3)>>10;
	   if( (temp+FAT1Start) >= FAT2Start) return 0x31;
	 }
 } 
 else
 {
	 for(i=0;i<num;i++)
	 {
	   if(pBuffer[i] < 2 || pBuffer[i] > 0xFFEF) return 0x22;
	   temp = pBuffer[i]/256; 
	   if( (temp+FAT1Start) >= FAT2Start) return 0x32;
	 } 	
 }// end of if(FAT_TAG == 0x01)
 
 if(FAT_ID == 0x0B)
 {
	 for(i=0;i<num;i++)
	 {
	   temp = pBuffer[i]/128; 
	   if( temp != FAT1num) 
	   {
	     if(first == 0)
		 {
	   	   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]; 
		 first = 0;  
	   }
	   ((uint32*)&FAT1)[pBuffer[i]%128] = pBuffer[i+1]; 
	   if( (i+1) == num ) ((uint32*)&FAT1)[pBuffer[i]%128] = 0xFFFFFFFF; 
	 } 	 
 }
 else if(FAT_ID == 0x01)
 { 
	 for(i=0;i<num;i++)
	 {	 
		 number = pBuffer[i]*3>>1;
		 if(number<<1 == pBuffer[i]*3) tag = 0;
		 else tag = 1;
		 temp = number>>9;
		 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)
		 {
		 	((uint8*)&FAT1)[number%512] = pBuffer[i+1];
		 	if( i == num-1 ) ((uint8*)&FAT1)[number%512] = 0xFF;
		 	if(number%512 == 511)
		 	{
		   	   	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];  
		   		((uint8*)&FAT1)[0] = (((uint8*)&FAT1)[0]& 0xF0) + pBuffer[i+1]>>8;	
		   		if( i == (num-1) ) ((uint8*)&FAT1)[0] = (((uint8*)&FAT1)[0]& 0xF0) | 0x0F;		 		
		 	}
		 	else
		 	{
		 		((uint8*)&FAT1)[number%512 + 1] = (((uint8*)&FAT1)[number%512 + 1]& 0xF0) + pBuffer[i+1]>>8;	
		 	}
		 }
		 else
		 {
		 	((uint8*)&FAT1)[number%512] = (((uint8*)&FAT1)[number%512]& 0x0F) | (pBuffer[i+1] & 0x00F)<<4;
		 	if( i == num-1 ) ((uint8*)&FAT1)[number%512] = (((uint8*)&FAT1)[number%512]& 0x0F) | 0xF0;
		 	if(number%512 == 511)
		 	{
		   	   	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];  
		   		((uint8*)&FAT1)[0] = pBuffer[i+1]>>4;	
		   		if( i == num-1 ) ((uint8*)&FAT1)[0] = 0xFF;		 		
		 	}
		 	else
		 	{
		 		((uint8*)&FAT1)[number%512 + 1] = 0xFF;	
		 	}	 	
		 }// end of if(tag == 0)
	 }// end of for(i=0;i<num;i++)
 }
 else
 {
	 for(i=0;i<num;i++)
	 {
	   temp = pBuffer[i]/256; 
	   if( temp != FAT1num) 
	   {
	     if(first == 0)
		 {
	   	   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]; 
		 first = 0;  
	   }
	   FAT1[pBuffer[i]%256] = pBuffer[i+1]; 
	   if( (i+1) == num ) FAT1[pBuffer[i]%256] = 0xFFFF; 
	 } 	
 }// end of if(FAT_TAG == 0x01)
  
 for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len]; 
 UFI_Write10(FAT1Start + FAT1num); 
 return 0;  
}

uint8 CreatFile(FILE_INFO* pfileinfo, uint8 Delete)
{
 uint8 filenum;
 uint8 i;
 uint32 StartCluster = 2;
 
 if( DetectFile((uint8*)pfileinfo) ) 
 {
   if(Delete) DeleteFile((uint8*)pfileinfo);
   else  return 0xFF;
 }

 StartCluster = FindNextUnusedCluster(StartCluster);
 if(StartCluster == 0xFFFFFFFF) return 0xFF;
 
 filenum = FindUnusedFileNum(0);
 if(filenum == 0xFF) return 0xFF;
 RWFileStatus[filenum] = 0x02;
 
 if( ((uint8*)pfileinfo)[0] == 0xE5 ) ((uint8*)pfileinfo)[0] = 0x05;
 for(i = 0; i < sizeof(FILE_INFO); i++) ((uint8*)&RWFileInfo[filenum])[i] = ((uint8*)pfileinfo)[i];
 RWFileClusterChain[filenum][0] = StartCluster;
  
 FileInfoRW[filenum].StartClusterNum = 0;
 FileInfoRW[filenum].StartAddress = (RWFileClusterChain[filenum][0]-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
 FileInfoRW[filenum].NowSectorInCluster = 0;
 FileInfoRW[filenum].NowDataInSector = 0;
 
 return filenum;
}

uint8 CloseFile(uint8 filenum)
{
 uint8  i,j,temp;
 uint16 len;
 uint32 SectorAddress;
 
 if( filenum >= MAXFILENUM) return 0x10;
 if( RWFileStatus[filenum] == 0) return 0x20;		//filenum not used										
 if( RWFileStatus[filenum] == 0x01)					//filenum opend for read
 {
   RWFileStatus[filenum] = 0;
   return 0; 
 }

 RWFileStatus[filenum] = 0;
 RWFileInfo[filenum].High16 = RWFileClusterChain[filenum][0] / 65536;
 RWFileInfo[filenum].Low16 = RWFileClusterChain[filenum][0] & 0xFFFF; 
 RWFileInfo[filenum].FileLength = FileInfoRW[filenum].StartClusterNum*Bpb_Fat16.SectorBytes*Bpb_Fat16.SectorsPerCluster + \
 								  FileInfoRW[filenum].NowSectorInCluster*Bpb_Fat16.SectorBytes + \
								  FileInfoRW[filenum].NowDataInSector;
 
 for(SectorAddress=DIRStart;SectorAddress <= DIREnd;SectorAddress++)
 {
  UFI_Read10(SectorAddress);
  for(i=0;i<16;i++)
  {
   if(ReadBlockData[i*32] != 0 && ReadBlockData[i*32] != 0xE5) continue;
   
   if(FileInfoRW[filenum].NowDataInSector)
   {
   	 for(len=0;len<FileInfoRW[filenum].NowDataInSector;len++) 
	    WriteBlockData[len] = RWFileTempBuffer[filenum][len];
	 UFI_Write10(FileInfoRW[filenum].StartAddress+FileInfoRW[filenum].NowSectorInCluster);
   } // end of if(FileInfoRW[filenum].NowDataInSector) 
     
   for(j=0;j<32;j++) ReadBlockData[i*32 + j] = ((uint8*)&(RWFileInfo[filenum]))[j];
   for(len=0;len<512;len++) WriteBlockData[len] = ReadBlockData[len];
   UFI_Write10(SectorAddress);
   
   temp = WriteFAT1FileAllocate(RWFileClusterChain[filenum],FileInfoRW[filenum].StartClusterNum+1);
   if(temp == 0)return 0;
   else return 0x40;

  }  // end of for(i=0;i<16;i++)
 }  // end of for(SectorAddress=DIRStart;SectorAddress <= DIREnd;SectorAddress++)
 return 0x50;
}

uint8 WriteFile(uint8 filenum,uint8* pBuffer,uint32 length)
{
 uint8  Sectors,datas;
 uint32 i,j,len,TempCluster;
 uint32 TotalLength;
 
 if( filenum >= MAXFILENUM) return 0x10;
 if( RWFileStatus[filenum] == 0) return 0x20;		//filenum not used										
 if( RWFileStatus[filenum] == 0x01) return 0x30;    //filenum opend for read
 
 TotalLength = length + FileInfoRW[filenum].NowDataInSector;
 datas = TotalLength % Bpb_Fat16.SectorBytes;
 Sectors = TotalLength / Bpb_Fat16.SectorBytes;

 if(Sectors == 0)
 {
   for(i=FileInfoRW[filenum].NowDataInSector;i<datas;i++)
   {
     RWFileTempBuffer[filenum][i] = *pBuffer++;
   } 
   FileInfoRW[filenum].NowDataInSector = datas;
   return 0;
 }

 for(i=0;i<FileInfoRW[filenum].NowDataInSector;i++)
 {
     WriteBlockData[i] = RWFileTempBuffer[filenum][i];
 }  
 
 for(j=0;j<Sectors;j++)
 {
   for(i=FileInfoRW[filenum].NowDataInSector;i<512;i++)
   {
   	 WriteBlockData[i] = *pBuffer++;											   
   }
   UFI_Write10(FileInfoRW[filenum].StartAddress+FileInfoRW[filenum].NowSectorInCluster);
   if(FileInfoRW[filenum].NowSectorInCluster >= (Bpb_Fat16.SectorsPerCluster-1))
   {
     TempCluster = FindNextUnusedCluster(RWFileClusterChain[filenum][FileInfoRW[filenum].StartClusterNum]);
	 if( TempCluster == 0xFFFFFFFF) return 0x40;
	 FileInfoRW[filenum].StartClusterNum++;
	 RWFileClusterChain[filenum][FileInfoRW[filenum].StartClusterNum] = TempCluster;
	 FileInfoRW[filenum].StartAddress = (TempCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
	 FileInfoRW[filenum].NowSectorInCluster = 0;
   }
   else FileInfoRW[filenum].NowSectorInCluster++;
   FileInfoRW[filenum].NowDataInSector = 0;
 }
 
 for(j=0;j<datas;j++)
 {
   RWFileTempBuffer[filenum][i] = *pBuffer++;
 }
 FileInfoRW[filenum].NowDataInSector = datas;
 
 return 0;
}

uint8 WriteFileDirectly(FILE_INFO* pfileinfo, uint8 Delete, uint8* pBuffer, uint32 length)
{
  uint8 filenum;
  
  filenum = CreatFile(pfileinfo,Delete); 
  if( filenum == 0xFF) return 0x10;
  if( WriteFile(filenum,pBuffer,length) != 0 )
  {
    DiscardFile(filenum);
    return 0x20;
  }
  if(CloseFile(filenum) != 0) return 0x30;
  
  return 0;
}



















#define readfile(n) ReadFileAll(&Fat_data[n*32])
uint8 ReadFileAll(uint8* FileName)
{
 uint8 i,j,k,z;
 uint32 StartCluster,StartAddress;
 uint32 SectorAddress,m;
 uint16 len,temp;
 
 
 for(SectorAddress=DIRStart;SectorAddress <=DIREnd ;SectorAddress++)
 {
  UFI_Read10(SectorAddress);
  for(i=0;i<16;i++)//最多16个文件判断
  {
   for(j=0;j<32;j++) ((uint8*)&File_Information)[j] = ReadBlockData[i*32 + j];//Fat
   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;
	if (UFI_Read10(StartAddress)!=0) return 0xff;
	m =  File_Information.FileLength;
	z=0;
	temp=0;
    for(len = 0; len < File_Information.FileLength; len++)
  	 {
	 if(len == 512)
	  {
	  StartCluster = NextCluster(StartCluster);
	  if (UFI_Read10((StartCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart)!=0) return 0xff;
	  len = 0;
	  File_Information.FileLength -= 512;
	  }
  	 put_u1(ReadBlockData[len]);
//  	 putchar(ReadBlockData[len]);
	 
	 //显示数据
/*	 usb_data[z++]=ReadBlockData[len];
	 if (z==240) {ram_cpl
	 			 clear_screen();
	 			 USB_display(temp);
				 //ram_cpl
				 //clear_screen();
	 			 //USB_display(temp);
				 delayms(3000);
				 for (z=0;z<240;z++) usb_data[z]=0;
				 z=0;
				 temp+=240;
				 }*/
	 }
	return 0;//成功读取所选文件
//*********************************************************
   }//end of if(k==11)
  }//endo of for(i=0;i<16;i++) 
 }// end of for(SectorAddress=DIRStart;SectorAddress <=DIREnd ;SectorAddress++)  
 return 0x20;
}// End of readfileAll
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -