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

📄 fat.c.bak

📁 arm(s3c440b)读写u盘源程序
💻 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 + -