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

📄 fat32.c

📁 mp4的源码,主要包括loader,usb driver,mp3 decoder,jpeg decoder,mpeg decoder部分.引导部分是基于arm9的s3c2410,部分代码未经过完善.
💻 C
字号:
#include "def.h"
#include "mmc.h"
#include "fat32.h"

U8 BPB_SecPerClus=0;      //count of sectors per cluster
U32 FatStartSector=0;      //sector number of first fat sector
U32 RootStartSector=0;     //sector number of first data sector
U32 ClusterSum=0;          //cluster count of the disk

U32 BPB_RootClus=0;        //cluster number of the first cluster of the root directory, usually 2 but not required to be 2.
U32 BPB_FATSz32=0;         //This field is the FAT32 32-bit count of sectors occupied by ONE FAT.
U32 BPB_FSInfo=0;          //Sector number of FSINFO structure in the reserved area of the FAT32 volume. Usually 1.
U32 FatStartSector=0;      //sector number of first fat sector

U8 DBUF[512];
U8 FATBUF[512];				//avoid read fat too 
U32 FatSectorPointer=0;		//fraquantly.


S8 Init_Fat32(void)
{
	PMBR_BLOCK  pMBR;
	PBPB_BLOCK  pBPB;
	U32 BPB_StartSector;
	
	Mmc_Init();
	if(!Mmc_Read_Sector(0x0,DBUF))
		return FALSE;
	pMBR=(PMBR_BLOCK)DBUF;
	if(DBUF[0]==0xeb||DBUF[0]==0xe9)
		BPB_StartSector=0;
	else
		BPB_StartSector=SwapINT32(pMBR->StartSector);
	if(!Mmc_Read_Sector(BPB_StartSector,DBUF))
		return FALSE;
	pBPB=(PMBR_BLOCK)DBUF;
	if(pMBR->Type==0x0c)
	{
		FAT_type=FAT32;
		BPB_SecPerClus=pBPB->BPB_SecPerClus;
		BPB_RootClus=SwapINT32(pBPB->BPB_RootClus);
		BPB_FATSz32=SwapINT32(pBPB->BPB_FATSz32);
		BPB_FSInfo=SwapINT16(pBPB->BPB_FSInfo);
		FatStartSector=BPB_StartSector+SwapINT16(pBPB->BPB_RsvdSecCn);
		ClusterSum=(BPB_FATSz32<<7);//(*512/4)
		RootStartSector=FatStartSector+2*BPB_FATSz32;
	}
	else 
		return FLASE;
	return TRUE;
}

U32 GetNextClusterNum_32(U32 clusterNum)
{
	U32 xxgFatSecNum;
	xxgFatSecNum=ThisFatSecNum_32(clusterNum);
	if(FatSectorPointer!=xxgFatSecNum)
	{
		if(!Mmc_Read_Sector(xxgFatSecNum,FATBUF))	return 0x0FFFFFFF;
		FatSectorPointer=xxgFatSecNum;
	}
	clusterNum=SwapINT32(((U32 *)(FATBUF+ThisFatEntOffset_32(clusterNum)))[0]);
	return clusterNum;
}


U32 SwapINT32(U32 dData)
{
    S32 t;
    ((U8 * )(&t))[0] = ((U8 * )(&dData))[3];
    ((U8 * )(&t))[1] = ((U8 * )(&dData))[2];
    ((U8 * )(&t))[2] = ((U8 * )(&dData))[1];
    ((U8 * )(&t))[3] = ((U8 * )(&dData))[0];
    return t;
}

U16 SwapINT16(U16 dData)
{
    U16 t;
    ((U8 * )(&t))[0] = ((U8 * )(&dData))[1];
    ((U8 * )(&t))[1] = ((U8 * )(&dData))[0];
    return t;
}

⌨️ 快捷键说明

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