📄 fat32_base.c
字号:
* 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 + -