stm32+sdio+fatfs文件系统 源码分析
#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 LD2PT(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 mount ID */
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 _FIL
stm32sdiofatfs文件系 相关文章:
- STM32+SDIO+FATFS文件系统 直读SD卡(12-03)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)