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

📄 apfs_fat32_table.c

📁 一个可以在开发板上运行的fat文件系统,是在windows平台下开发的,是学习文件系统的好帮手
💻 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 + -