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

📄 fat32_base.c

📁 在Bf533上实现FAT32文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
*             currentcluster_t cluster - current cluster number ( do not contain the sector in case 2)
*             DWORD offset - offset of target sector in the cluster
* Output   : cluster - current cluster number
*******************************************************************/
currentcluster_t fnFAT32_WriteSector(currentcluster_t cluster, DWORD offset)
{
 	  DWORD SectortoRead = 0;
	  DWORD ClustertoRead = 0;
	  DWORD ClusterChain = 0;
	  int i;
	  
	  if(cluster.value==0xFFFFFFFF)
	  	return cluster;

	  ClusterChain = cluster.value;

	
	  ClustertoRead = offset / current_fs->bpb.sector_per_cluster;	  
	  SectortoRead = offset - (ClustertoRead*current_fs->bpb.sector_per_cluster);
	  
	  // cast 2 -call finFAT32_FindNextCluster() to find cluster that contain target sector
	  for (i=cluster.offset; i<ClustertoRead; i++)
	  	  ClusterChain = fnFAT32_FindNextCluster(ClusterChain);

	  //register current cluster
	  cluster.value=ClusterChain;
	  cluster.offset=ClustertoRead;
	  if (ClusterChain==0xFFFFFFFF) 
	  { 
	  	  return cluster;
	  }
	  
	  //write target sector
	  fnIDE_WriteBufferSector(&(buffers.currentsector),fnFAT32_LBAofCluster(ClusterChain)+SectortoRead,1);
	  
	  return cluster;
}

/******************************************************************
* Function     : fnFAT32_UpdateFAT
* Description : Update FAT data table in HD with fat buffer data in SDRAM 
* write target sector( according to offset of target sector in cluster)
* Input     : 
*             DWORD - Current_Cluster - cluster in buffer
* Output   : 1-done/ 0-fail
*******************************************************************/
YTE fnFAT32_UpdateFAT(DWORD Current_Cluster)
{
	DWORD FAT_group_num;
	DWORD *buffer;
	BYTE i;
	
	if (Current_Cluster<2||Current_Cluster>=(current_fs->bpb.sector_per_FAT*current_fs->bpb.byte_per_sector/4)) 
		return 0;

	FAT_group_num = Current_Cluster>>FAT_GROUP_DWORD_SIZE_M;
	
	// write FAT data in SDRAM to HD FAT data table( according to Current_Cluster)
	for(i=0;i<FAT_GROUP_NUM;i++)
	{
		if(FAT_group_num==fat_group_index[i])
		{
			buffer=(DWORD *)(fat_chain[i]);
			
			fnIDE_WriteBufferSector(buffer,current_fs->fat_begin_lba+FAT_group_num*FAT_GROUP_SECTOR_NUM,0);
	
			fnIDE_WriteBufferSector(buffer,current_fs->fat_begin_lba+FAT_group_num*FAT_GROUP_SECTOR_NUM+current_fs->bpb.sector_per_FAT,0);
			return 1;
		}
	}
	return 0;
}

/******************************************************************
* Function     : fnFAT32_NextEmptyCluster
* Description : search next empty cluster in FAT buffer in SDRAM and fetch another 128KB data from HD FAT data table if not. 
* Input     : 
*             DWORD cluster - start cluster ( not used, routine search from cluster 2)
* Output   : Empty cluster number
*******************************************************************/
DWORD fnFAT32_NextEmptyCluster(DWORD cluster)
{
	DWORD i,j,k;
	DWORD FAT_group_num=0,FAT_group_offset;
	DWORD sector_offset,cluster_base;
	DWORD FAT_group_size=FAT_GROUP_SIZE>>2;
	DWORD total_group=current_fs->bpb.sector_per_FAT*current_fs->bpb.byte_per_sector/FAT_GROUP_SIZE+1;
	DWORD * data;
	DWORD buffer[128];
	WORD  u32_per_sector = current_fs->bpb.byte_per_sector>>2;

      //start searching from cluster 2
	for(i=0;i<total_group;i++)
	{
		// search in FAT buffer in SDRAM	
		for(j=0;j<FAT_GROUP_NUM;j++)
		{
			if(i==fat_group_index[j])
			{
				data = (DWORD *)(fat_chain[i]);
				break;
			}
		}
		//update FAT buffer if find nothing
		if(j==FAT_GROUP_NUM)
		{
			sector_offset = (i<<FAT_GROUP_SIZE_M)/current_fs->bpb.byte_per_sector;
			data = (DWORD*)(fat_chain[next_fat_group]);
			fnFAT32_UpdateFAT(cluster);
			fnIDE_BufferSector(data,current_fs->fat_begin_lba+sector_offset,FAT_GROUP_SECTOR_NUM);
			fat_group_index[next_fat_group] = FAT_group_num;
			next_fat_group= next_fat_group+1;
			if(next_fat_group==FAT_GROUP_NUM)
			{
				next_fat_group=1;
			}
		}
		
		cluster_base=i*FAT_group_size; //DWORD
		for(k=0;k<FAT_group_size;k++)
		{
		
			if(data[k]==0x00000000)
			{
				return cluster_base+k;
			}
		}
	}
	
	return 0xFFFFFFFF;
}

/******************************************************************
* Function     : fnFAT32_EditFat
* Description : Edit FAT table
* Input     : 
*             DWORD Current_Cluster-target cluster number             
*             DWORD value-edit value
* Output   : 1-done/ 0-fail
*******************************************************************/
BYTE fnFAT32_EditFat(DWORD Current_Cluster,DWORD value)
{
	DWORD FAT_sector_offset, UI32position;
	DWORD FAT_group_num,FAT_group_offset,sector_offset;
	BUFFER *buffer;
	DWORD *cluster;
	BYTE i;
	
	if (Current_Cluster<2||Current_Cluster>=(current_fs->bpb.sector_per_FAT*current_fs->bpb.byte_per_sector/4)) 
		return 0;

	//get offset of target cluster in FAT buffer in SDRAM
	FAT_group_num = Current_Cluster>>FAT_GROUP_DWORD_SIZE_M;
	FAT_group_offset= Current_Cluster-(FAT_group_num<<FAT_GROUP_DWORD_SIZE_M);
	FAT_sector_offset = FAT_group_offset / 128;
	
	UI32position = (FAT_group_offset - (FAT_sector_offset * 128)) ; 

	//edit target cluster in FAT buffer, update FAT table
	for(i=0;i<FAT_GROUP_NUM;i++)
	{
		if(FAT_group_num==fat_group_index[i])
		{
			buffer=(BUFFER *)(fat_chain[i]+FAT_sector_offset*512);
			buffer->u32data[UI32position]=value;
			fnIDE_WriteBufferSector(buffer,current_fs->fat_begin_lba+FAT_group_num*FAT_GROUP_SECTOR_NUM+FAT_sector_offset,1);
			fnIDE_WriteBufferSector(buffer,current_fs->fat_begin_lba+FAT_group_num*FAT_GROUP_SECTOR_NUM+current_fs->bpb.sector_per_FAT+FAT_sector_offset,1);
			return 1;
		}
	}

	// read new data from FAT table in HD to SDRAM and edit it if there is no target cluster in SDRAM
	sector_offset = (FAT_group_num<<FAT_GROUP_SIZE_M)/current_fs->bpb.byte_per_sector;
	cluster = (DWORD*)(fat_chain[next_fat_group]);
	fnIDE_BufferSector(cluster,current_fs->fat_begin_lba+sector_offset,FAT_GROUP_SECTOR_NUM);
	fat_group_index[next_fat_group] = FAT_group_num;
	
	buffer=(BUFFER *)(fat_chain[next_fat_group]+FAT_sector_offset*512);
	buffer->u32data[UI32position]=value;
	
	fnIDE_WriteBufferSector(buffer,current_fs->fat_begin_lba+FAT_group_num*FAT_GROUP_SECTOR_NUM+FAT_sector_offset,1);
	
	fnIDE_WriteBufferSector(buffer,current_fs->fat_begin_lba+FAT_group_num*FAT_GROUP_SECTOR_NUM+current_fs->bpb.sector_per_FAT+FAT_sector_offset,1);
	next_fat_group= next_fat_group +1;
	if(next_fat_group==FAT_GROUP_NUM)
	{
		next_fat_group=1;
	}
	
	
	return 1;
}

/******************************************************************
* Function     : fnFAT32_EditFatChain
* Description : Edit FAT table - only edit FAT buffer in SDRAM
* Input     : 
*             DWORD Current_Cluster-target cluster number             
*             DWORD value-edit value
* Output   : 1-done/ 0-fail
*******************************************************************/
BYTE fnFAT32_EditFatChain(DWORD Current_Cluster,DWORD value)
{
	DWORD FAT_group_num,FAT_group_offset,sector_offset;
	DWORD *buffer;
	BYTE i;
	
	if (Current_Cluster<2||Current_Cluster>=(current_fs->bpb.sector_per_FAT*current_fs->bpb.byte_per_sector/4)) 
		return 0;


	FAT_group_num = Current_Cluster>>FAT_GROUP_DWORD_SIZE_M;
	FAT_group_offset= Current_Cluster-(FAT_group_num<<FAT_GROUP_DWORD_SIZE_M);
	 

	for(i=0;i<FAT_GROUP_NUM;i++)
	{
		if(FAT_group_num==fat_group_index[i])
		{
			buffer=(DWORD *)(fat_chain[i]);
			buffer[FAT_group_offset]=value;
			return 1;
		}
	}
	
	return 0;
}

⌨️ 快捷键说明

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