📄 fat32.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 + -