原创 FatFS源代码阅读分析(二)

2009-11-17 20:35 5883 10 13 分类: MCU/ 嵌入式

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


回到家用source insight看代码,舒服多了。


继续分析ff.h文件内容。


#if _DF1S     /* DBCS configuration */双字节编码相关的设定,暂时不理会它。


#if _MULTI_PARTITION         /* Multiple partition configuration */


//该变量定义为1时,支持一个磁盘的多个分区。


typedef struct _PARTITION {


       BYTE pd;     /* Physical drive# */


       BYTE pt;      /* Partition # (0-3) */


} PARTITION;


Extern  const  PARTITION Drives[];//如果支持分区,则声明变量Drivers   


#define LD2PD(drv) (Drives[drv].pd)      /* 获得磁盘对应的物理磁盘


#define LD<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2PT(drv) (Drives[drv].pt)       /*获得磁盘对应的分区


#else                                         /* Single partition configuration */


#define LD2PD(drv) (drv)  /* Physical drive# is equal to the logical drive# */


#define LD2PT(drv) 0        /* Always mounts the 1st partition */


 


#if _MAX_SS == 512  //一般扇区长度取512字节。


#define   SS(fs)     512U


 


#if _LFN_UNICODE && _USE_LFN


typedef WCHAR XCHAR;       /* Unicode */ XCHAR是文件名的码型所用。


#else


typedef char XCHAR;        /* SBCS, DBCS */


#endif


 


typedef struct _FATFS_ {


       BYTE    fs_type;         /* FAT sub type */


       BYTE    drive;             /*对应实际驱动号01--- */


       BYTE    csize;             /* 每个簇的扇区数目 */


先查一下簇的含义:应该是文件数据分配的基本单位。


       BYTE    n_fats;           /* 文件分配表的数目 */


FAT文件系统依次应该是:引导扇区、文件分配表两个、根目录区和数据区。


       BYTE    wflag;            /* win[] dirty flag (1:must be written back) */


//文件是否改动的标志,为1时要回写。


       WORD  id;                 /* File system mount ID 文件系统加载ID*/


       WORD  n_rootdir;      /* 根目录区目录项的数目 */


#if _FS_REENTRANT


       _SYNC_t     sobj;              /* 允许重入,则定义同步对象 */


#endif


#if _MAX_SS != 512


       WORD  s_size;           /* Sector size */


#endif


#if !_FS_READONLY  //文件为可写


       BYTE    fsi_flag;   /* fsinfo dirty flag (1:must be written back) */


//文件需要回写的标志


       DWORD      last_clust;      /* Last allocated cluster */


       DWORD      free_clust;      /* Number of free clusters */


       DWORD      fsi_sector;      /* fsinfo sector */


#endif


#if _FS_RPATH


       DWORD      cdir;              /* 使用相对路径,则要存储文件系统当前目录


#endif


       DWORD      sects_fat;       /*文件分配表占用的扇区


       DWORD      max_clust;     /* 最大簇数


       DWORD      fatbase;  /*文件分配表开始扇区


       DWORD      dirbase;  /*  如果是FAT32,根目录开始扇区需要首先得到。


       DWORD      database;       /* 数据区开始扇区


       DWORD      winsect;  /* Current sector appearing in the win[] */


//目前的扇区在win[]里面,这个win[]数组暂时还不知道含义。


       BYTE    win[_MAX_SS];/* Disk access window for Directory/FAT */


//这是一个win[512]数组,存储着一个扇区,好像作为扇区缓冲使用。


} FATFS;


 


typedef struct _DIR_ {


       FATFS* fs;/* Pointer to the owner file system object */指向相应文件系统对象


       WORD  id;                 /* 文件系统加载ID*/


       WORD  index;     /* Current read/write index number */目前读写索引代码


       DWORD      sclust;     /* Table start cluster (0:Static table) */文件数据区开始簇


       DWORD      clust;             /* Current cluster */ 目前处理的簇


       DWORD      sect;              /* Current sector */ 目前簇里对应的扇区


       BYTE*  dir;  /* Pointer to the current SFN entry in the win[] */


       BYTE*  fn;                 /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */


#if _USE_LFN


       WCHAR*     lfn;   /* Pointer to the LFN working buffer */ 指向长文件名缓冲。


       WORD  lfn_idx;   /* Last matched LFN index number (0xFFFF:No LFN) */


#endif


} DIR;


 


typedef struct _FIL_ {


       FATFS* fs;                  /* Pointer to the owner file system object */


       WORD  id;                 /* Owner file system mountID */


       BYTE    flag;        /* File status flags */文件状态标志


       BYTE    csect;            /* Sector address in the cluster */扇区偏移


       DWORD      fptr;        /* File R/W pointer */ 读写指针


       DWORD      fsize;              /* File size */


       DWORD      org_clust;      /* File start cluster */文件开始簇


       DWORD      curr_clust;     /* Current cluster */当前簇


       DWORD      dsect;            /* Current data sector */文件当前扇区


#if !_FS_READONLY


       DWORD      dir_sect; /* Sector containing the directory entry */该文件目录项对应所在的扇区


       BYTE*  dir_ptr;   /* Ponter to the directory entry in the window */


#endif


#if !_FS_TINY


       BYTE    buf[_MAX_SS];/* File R/W buffer */文件读写缓冲


#endif


} FIL;


 


/* File status structure */


 


typedef struct _FILINFO_ {


       DWORD      fsize;              /* File size */


       WORD  fdate;             /* Last modified date */


       WORD  ftime;             /* Last modified time */


       BYTE    fattrib;    /* Attribute */


       char fname[13];     /* Short file name (8.3 format) */


#if _USE_LFN


       XCHAR*      lfname;          /* Pointer to the LFN buffer */


       int   lfsize;             /* Size of LFN buffer [chrs] */


#endif


} FILINFO; 这个结构主要描述文件的状态信息,包括文件名13个字符(8+.+3+\0)、属性、修改时间等。


 


 

文章评论3条评论)

登录后参与讨论

用户432933 2012-11-12 22:30

非常感谢...

用户401192 2012-4-5 11:59

楼主你这东西我太需要了

用户383189 2010-6-7 16:24

好东西,谢谢
相关推荐阅读
nthq2004 2010-05-08 20:04
USB自定义设备驱动02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  本来还想编写应用程序测试一下自定...
nthq2004 2010-05-07 21:35
USB自定义设备驱动01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、USB设备驱动入门1、学习目...
nthq2004 2010-05-04 21:01
智林开发板上实现自定义的USB HID设备
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />  一、自定义HID设备的相关概念1...
nthq2004 2010-05-01 21:58
U盘例程在智林开发板上的移植
 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 一、移植前的准备工作1、有哪些操...
nthq2004 2010-04-30 19:19
U盘实现流程跟踪分析02
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   二、追踪USB大容量设备的实现...
nthq2004 2010-04-27 21:51
U盘实现流程跟踪分析01
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   一、追踪USB大容量设备的实现...
我要评论
3
10
关闭 站长推荐上一条 /2 下一条