📄 apfs_fat32_table.c
字号:
//-----------------------------------------------------------------------------
// This file is part of AP.FS
// AP.FS is a FAT32 file system face to the embedded system,It's target is to
// support the portable storage device such as SD Card,TF Card or USB Disc 's
// file system.
// caiyuqing
// 2008-1-8
//-----------------------------------------------------------------------------
#include "apfs_fat32_definitions.h"
#include "apfs_fat32_table.h"
#include "apfs_fat32_base.h"
// sector_buffer is a global symbol used to read from/write to a sector
struct sector_buffer sector_buffer;
extern struct fat32 fat32_struct;
//-----------------------------------------------------------------------------
// apfs_fat32_init_fat32_buffer:
//-----------------------------------------------------------------------------
void apfs_fat32_init_sector_buffer()
{
sector_buffer.sector= 0xFFFFFFFF;
sector_buffer.changed = FALSE;
sector_buffer.reads= 0;
sector_buffer.writes= 0;
memset(sector_buffer.data, 0, sizeof(sector_buffer.data));
memset(sector_buffer.zero_buf, 0, sizeof(sector_buffer.zero_buf));
}
//-----------------------------------------------------------------------------
// apfs_fat32_read_fat_sector: Read a FAT sector
//-----------------------------------------------------------------------------
BOOL apfs_fat32_read_fat_sector(UINT32 sector)
{
// Only do anything if sector not already loaded
if((sector != sector_buffer.sector))
{
// Writeback
if(sector_buffer.changed)
{
sector_buffer.writes++;
if (!apfs_fat32_write_sector(sector_buffer.sector,
sector_buffer.data))
{
return FALSE;
}
}
sector_buffer.sector = sector;
sector_buffer.changed = FALSE;
// Read next sector
if (!apfs_fat32_read_sector(sector_buffer.sector,
sector_buffer.data))
{
return FALSE;
}
sector_buffer.reads++;
}
return TRUE;
}
//-----------------------------------------------------------------------------
// apfs_fat32_write_fat_sector: Write a FAT sector
//-----------------------------------------------------------------------------
BOOL apfs_fat32_write_fat_sector(UINT32 sector)
{
sector_buffer.sector = sector;
sector_buffer.changed = FALSE;
sector_buffer.writes++;
return apfs_fat32_write_sector(sector_buffer.sector, sector_buffer.data);
}
//-----------------------------------------------------------------------------
// apfs_fat32_purge_fat_buffer: Purge a sector
//-----------------------------------------------------------------------------
BOOL apfs_fat32_purge_fat_buffer()
{
// Writeback
if(sector_buffer.changed)
{
sector_buffer.writes++;
if(!apfs_fat32_write_sector(sector_buffer.sector, sector_buffer.data))
{
return FALSE;
}
sector_buffer.changed = FALSE;
}
return TRUE;
}
//-----------------------------------------------------------------------------
// apfs_fat32_find_next_cluster: Return Cluster number of next cluster in chain by
// reading FAT table and traversing it. Return 0xffffffff for end of chain.
//-----------------------------------------------------------------------------
UINT32 apfs_fat32_find_next_cluster(UINT32 current_cluster)
{
UINT32 fat_sector_offset, position;
UINT32 next_cluster;
if(current_cluster==0)
{
current_cluster=2;
}
// Find which sector of FAT table to read
fat_sector_offset = current_cluster / 128;
// Read FAT sector into buffer
if(!apfs_fat32_read_fat_sector(fat32_struct.fat_begin_lba + fat_sector_offset))
{
return (FAT32_EOC_FLAG);
}
// Find 32 bit entry of current sector relating to cluster number
position = (current_cluster - (fat_sector_offset * 128)) * 4;
// Read Next Clusters value from Sector Buffer
next_cluster = FAT32_GET_32BIT_WORD((UINT16)position);
// Mask out MS 4 bits (its 28bit addressing)
next_cluster = next_cluster & 0x0FFFFFFF;
// If 0x0FFFFFFF then end of chain found
if(next_cluster == 0x0FFFFFFF)
{
return (FAT32_EOC_FLAG);
}
else// Else return next cluster
{
return (next_cluster);
}
}
//-----------------------------------------------------------------------------
// apfs_fat32_set_fsInfo_next_cluster: Write the next free cluster to the
// FSINFO table
//-----------------------------------------------------------------------------
void apfs_fat32_set_fsInfo_next_cluster(UINT32 newValue)
{
// Load sector to change it
if(!apfs_fat32_read_fat_sector(fat32_struct.fat_begin_lba +
fat32_struct.fs_info_sector))
{
return ;
}
// Change
FAT32_SET_32BIT_WORD(492, newValue);
// Write back
apfs_fat32_write_fat_sector(fat32_struct.fat_begin_lba +
fat32_struct.fs_info_sector);
}
//-----------------------------------------------------------------------------
// apfs_fat32_find_blank_cluster: Find a free cluster entry by reading the FAT
//-----------------------------------------------------------------------------
BOOL apfs_fat32_find_blank_cluster(UINT32 start_cluster, UINT32 *free_cluster)
{
UINT32 fat_sector_offset, position;
UINT32 next_cluster;
UINT32 current_cluster = start_cluster;
do
{
// Find which sector of FAT table to read
fat_sector_offset = current_cluster / 128;
if( fat_sector_offset < fat32_struct.fat_sectors)
{
// Read FAT sector into buffer
apfs_fat32_read_sector(fat32_struct.fat_begin_lba + fat_sector_offset);
// Find 32 bit entry of current sector relating to cluster number
position = (current_cluster - (fat_sector_offset * 128)) * 4;
// Read Next Clusters value from Sector Buffer
next_cluster = FAT32_GET_32BIT_WORD((UINT16)position);
// Mask out MS 4 bits (its 28bit addressing)
next_cluster = next_cluster & 0x0FFFFFFF;
if(next_cluster !=0 )
{
current_cluster++;
}
}
else// Otherwise, run out of FAT sectors to check...
{
return FALSE;
}
}while(next_cluster != 0x0);
// Found blank entry
*free_cluster = current_cluster;
if(!apfs_fat32_clean_cluster(current_cluster))
{
return FALSE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -