»ùÓÚ51µ¥Æ¬»úFAT32Îļþϵͳ³ÌÐò
#ifndef __ZNFAT_H__ #define __ZNFAT_H__
#include \ÀàÐÍÖØ¶¨Òå
/*******************************************************/ //znFATµÄ²Ã¼õºê--------------------------------------------------------- //#define ZNFAT_ENTER_DIR //Óд˺꣬º¯Êý znFAT_Enter_Dir() ²ÎÓë±àÒë #define ZNFAT_OPEN_FILE //Óд˺꣬º¯Êý znFAT_Open_File() ²ÎÓë±àÒë //#define ZNFAT_SEEK_FILE //Óд˺꣬º¯Êý znFAT_Seek_File() ²ÎÓë±àÒë //#define ZNFAT_READ_FILE //Óд˺꣬º¯Êý znFAT_Read_File() ²ÎÓë±àÒë //#define ZNFAT_READ_FILEX //Óд˺꣬º¯Êý znFAT_Read_FileX() ²ÎÓë±àÒë //#define ZNFAT_ADD_DAT //Óд˺꣬º¯Êý znFAT_Add_Dat() ²ÎÓë±àÒë //#define ZNFAT_CREATE_DIR //Óд˺꣬º¯Êý znFAT_Create_Dir() ²ÎÓë±àÒë
//#define ZNFAT_CREATE_FILE //Óд˺꣬º¯Êý znFAT_Create_File() ²ÎÓë±àÒë //#define ZNFAT_DEL_FILE //Óд˺꣬º¯Êý znFAT_Del_File() ²ÎÓë±àÒë //#define ZNFAT_XCOPY_FILE //Óд˺꣬º¯Êý znFAT_XCopy_File() ²ÎÓë±àÒë
//#define ZNFAT_RENAME_FILE //Óд˺꣬º¯Êý znFAT_Rename_File() ²ÎÓë±àÒë //#define ZNFAT_GET_TOTAL_SIZE //Óд˺꣬º¯Êý znFAT_Get_Total_Size() ²ÎÓë±àÒë //#define znFAT_GET_REMAIN_CAP //Óд˺꣬º¯Êý znFAT_Get_Remain_Cap() ²ÎÓë±àÒë
#include \#include \
//----------------------------------------------------------------------
#define SOC(c) (((c-pArg->FirstDirClust)*(pArg->SectorsPerClust))+pArg->FirstDirSector) // ÓÃÓÚ¼ÆËã´ØµÄ¿ªÊ¼ÉÈÇø #define CONST const //É豸±í
#define SDCARD 0 //SD¿¨ #define UDISK 1 //UÅÌ #define CFCARD 2 //CF¿¨ #define OTHER 3 //ÆäËü
//ÕâÀïµÄ´æ´¢É豸±í£¬¿ÉÒÔÁé»îÀ©³ä£¬ÒÔʵÏÖ¶Ô¸ü¶à´æ´¢É豸µÄÖ§³Ö //-------------------------------------------
#define MAKE_FILE_TIME(h,m,s) ((((unsigned int)h)<<11)+(((unsigned int)m)<<5)+(((unsigned int)s)>>1)) /* Éú³ÉÖ¸¶¨Ê±·ÖÃëµÄÎļþʱ¼äÊý¾Ý */
#define MAKE_FILE_DATE(y,m,d) (((((unsigned int)y)+20)<<9)+(((unsigned int)m)<<5)+((unsigned int)d)) /* Éú³ÉÖ¸¶¨ÄêÔÂÈÕµÄÎļþÈÕÆÚÊý¾Ý */ //DPT:·ÖÇø¼Ç¼½á¹¹ÈçÏ struct PartRecord {
UINT8 Active; //0x80±íʾ´Ë·ÖÇøÓÐЧ UINT8 StartHead; //·ÖÇøµÄ¿ªÊ¼´ÅÍ· UINT8 StartCylSect[2];//¿ªÊ¼ÖùÃæÓëÉÈÇø UINT8 PartType; //·ÖÇøÀàÐÍ
UINT8 EndHead; //·ÖÇøµÄ½áÊøÍ· UINT8 EndCylSect[2]; //½áÊøÖùÃæÓëÉÈÇø UINT8 StartLBA[4]; //·ÖÇøµÄµÚÒ»¸öÉÈÇø UINT8 Size[4]; //·ÖÇøµÄ´óС
};
//MBR:·ÖÇøÉÈÇø£¨¾ø¶Ô0ÉÈÇø£©¶¨ÒåÈçÏ struct PartSector {
UINT8 PartCode[446]; //MBRµÄÒýµ¼³ÌÐò
struct PartRecord Part[4]; //4¸ö·ÖÇø¼Ç¼ UINT8 BootSectSig0; //55 UINT8 BootSectSig1; //AA };
//znFATÖжÔBPBµÄ¶¨ÒåÈçÏ һ¹²Õ¼ÓÃ90¸ö×Ö½Ú struct znFAT_BPB {
UINT8 BS_jmpBoot[3]; //Ìø×ªÖ¸Áî offset: 0 UINT8 BS_OEMName[8]; // offset: 3 UINT8 BPB_BytesPerSec[2];//ÿÉÈÇø×Ö½ÚÊý offset:11 UINT8 BPB_SecPerClus[1]; //ÿ´ØÉÈÇøÊý offset:13 UINT8 BPB_RsvdSecCnt[2]; //±£ÁôÉÈÇøÊýÄ¿ offset:14 UINT8 BPB_NumFATs[1]; //´Ë¾íÖÐFAT±íÊý offset:16 UINT8 BPB_RootEntCnt[2]; //znFATΪ0 offset:17 UINT8 BPB_TotSec16[2]; //znFATΪ0 offset:19 UINT8 BPB_Media[1]; //´æ´¢½éÖÊ offset:21 UINT8 BPB_FATSz16[2]; //znFATΪ0 offset:22 UINT8 BPB_SecPerTrk[2]; //´ÅµÀÉÈÇøÊý offset:24 UINT8 BPB_NumHeads[2]; //´ÅÍ·Êý offset:26 UINT8 BPB_HiddSec[4]; //FATÇøÇ°ÒþÉÈÇøÊý offset:28 UINT8 BPB_TotSec32[4]; //¸Ã¾í×ÜÉÈÇøÊý offset:32 UINT8 BPB_FATSz32[4]; //Ò»¸öFAT±íÉÈÇøÊý offset:36 UINT8 BPB_ExtFlags[2]; //znFATÌØÓÐ offset:40 UINT8 BPB_FSVer[2]; //znFATÌØÓÐ offset:42 UINT8 BPB_RootClus[4]; //¸ùĿ¼´ØºÅ offset:44 UINT8 FSInfo[2]; //±£ÁôÉÈÇøFSINFOÉÈÇøÊýoffset:48 UINT8 BPB_BkBootSec[2]; //ͨ³£Îª6 offset:50 UINT8 BPB_Reserved[12]; //À©Õ¹Óà offset:52 UINT8 BS_DrvNum[1]; // offset:64 UINT8 BS_Reserved1[1]; // offset:65 UINT8 BS_BootSig[1]; // offset:66 UINT8 BS_VolID[4]; // offset:67 UINT8 BS_FilSysType[11]; // offset:71 UINT8 BS_FilSysType1[8]; //\};
struct znFAT_FAT_Item {
UINT8 Item[4]; };
struct znFAT_FAT {
struct znFAT_FAT_Item Items[128]; };
struct direntry
{
UINT8 deName[8]; // ÎļþÃû£¬²»×㲿·ÖÒÔ¿Õ¸ñ²¹³ä UINT8 deExtension[3]; // À©Õ¹Ãû£¬²»×㲿·ÖÒÔ¿Õ¸ñ²¹³ä UINT8 deAttributes; // ÎļþÊôÐÔ UINT8 deLowerCase; // 0 UINT8 deCHundredth; // ÊÀ¼Í UINT8 deCTime[2]; // ´´½¨Ê±¼ä UINT8 deCDate[2]; // ´´½¨ÈÕÆÚ UINT8 deADate[2]; // ·ÃÎÊÈÕÆÚ
UINT8 deHighClust[2]; // ¿ªÊ¼´ØµÄ¸ß×Ö UINT8 deMTime[2]; // ×î½üµÄÐÞ¸Äʱ¼ä UINT8 deMDate[2]; // ×î½üµÄÐÞ¸ÄÈÕÆÚ UINT8 deLowCluster[2]; // ¿ªÊ¼´ØµÄµÍ×Ö UINT8 deFileSize[4]; // Îļþ´óС };
//znFAT³õʼ»¯Ê±³õʼ²ÎÊý×°ÈëÈçϽṹÌåÖÐ struct znFAT_Init_Arg {
UINT8 DEV_No;
UINT8 BPB_Sector_No; //BPBËùÔÚÉÈÇøºÅ UINT32 Total_Size; //´ÅÅ̵Ä×ÜÈÝÁ¿ UINT32 FirstDirClust; //¸ùĿ¼µÄ¿ªÊ¼´Ø
UINT32 BytesPerSector; //ÿ¸öÉÈÇøµÄ×Ö½ÚÊý UINT32 FATsectors; //FAT±íËùÕ¼ÉÈÇøÊý UINT32 SectorsPerClust; //ÿ´ØµÄÉÈÇøÊý UINT32 FirstFATSector; //µÚÒ»¸öFAT±íËùÔÚÉÈÇø UINT32 FirstDirSector; //µÚÒ»¸öĿ¼ËùÔÚÉÈÇø };
struct Date {
UINT16 year; UINT8 month; UINT8 day; };
struct Time {
UINT8 hour; UINT8 min; UINT8 sec; };
struct FileInfoStruct {
UINT8 FileName[15]; //ÎļþÃû
UINT32 FileStartCluster; //ÎļþµÄ¿ªÊ¼´Ø UINT32 FileCurCluster; //ÎļþµÄµ±Ç°´Ø UINT32 FileSize; //Îļþ´óС UINT32 FileCurSector; //ÎļþµÄµ±Ç°ÉÈÇø
UINT16 FileCurPos; //ÎļþÔÚµ±Ç°ÉÈÇøÖеÄλÖà UINT32 FileCurOffset; //ÎļþµÄµ±Ç°Æ«ÒÆÁ¿