版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、、概述1、目的在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。2、准备工作在官方网站下载了 0.07c 版本的源代码,利用记事本进行阅读。二、源代码的结构1、源代码组成源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。src文 件夹里共五个文件和一个文件夹。文件夹是option,还有OOreadme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。对比网上的文章,版本已经不同了,已 经没有所谓的 tff.c 和 tff.h 了,估计现在都采用条件编译解决这个问题了,当然 文件更少,可
2、能编译选项可能越复杂。2、 00readme.txt 的说明Low level disk I/O module is not included in this archive because the FatFsmodule is only a generic file system layer and not depend on any specificstorage device. You have to provide a low level disk I/O module that writtento control your storage device .主要是说不包含底层10代码,
3、这是个通用文件系统可以在各种介质上使用。我们移植时针对具体存储设备提供底层代码。接下来做了版权声明 -可以自由使用和传播。然后对版本的变迁做了说明。3、源代码阅读次序先读integer.h,了解所用的数据类型,然后是ff.h, 了解文件系统所用的数据 结构和各种函数声明,然后是diskio.h,了解与介质相关的数据结构和操作函 数。再把ff.c和diskio.c两个文件所实现的函数大致扫描一遍。最后根据用户应 用层程序调用函数的次序仔细阅读相关代码。三、源代码阅读1、 integer.h 头文件这个文件主要是类型声明。以下是部分代码。typedef intINT;typedef unsigne
4、d int UINT;typedef signed charCHAR;/* These types must be 8-bit integer */都是用 typedef 做类型定义。移植时可以修改这部分代码,特别是某些定义 与你所在工程的类型定义有冲突的时候。2、 ff.h 头文件以下是部分代码的分析#include“ intege使用 integer.h 的类型定义#ifndef _FATFS#define _FATFS 0x007版本号 007c, 0.07c#define _WORD_ACCESS 0如/果定义为 1,则可以使用 word 访问。中间有一些看着说明很容易弄清楚意思。这里
5、就不例举了。#define _CODE_PAGE 936/* The _CODE_PAGE specifies the OEM code page to be used on the target system./936 -Simplified Chinese GBK (DBCS, OEM, WindoW跟据这个中国应该是 936.打开option文件夹看一下。打开CC936.C文件,里面有一个很大的数组 static const WCHAR uni2oem。根据英文说明,这个数组用于 uni code码和OEM码之间的相互转换。接下来又有两个函数ff_convert()和ff_wtouppe
6、r()具体执行码型转换和将字 符转换为大写。百度一下:看OEM码什么意思。unicode 是一种双字节字符编码,无论中文还是英文,或者其他语言统一到2 个字节。与现有的任何编码(ASCII,GB等)都不兼容。Win dowsNT(2000的内核即使用该编码,所有数据 进入内核前转换成UNICODE退出内核后在转换成版本相关的编码(通常称为 OEM,在简体中文版下即为 GB).(百度所得)继续往下阅读。#define _USE_LFN 1/这/ 个估计是长文件名支持了,以前的 0.06 版本好像是 不支持。#define _MAX_LFN 255/最长支持 255个双字节字符。#define _
7、FS_RPATH 0/是/ 否文件相对路径选项。/* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir,/f_chdrive function are available./ 有些函数会受影响。/Note that output of the f_readdir fnction is affected by this option. */#define _FS_REENTRANT 0如/果要支持文件系统可重入,必须加入几个函 数。#define _TIMEOUT1000/* Timeout peri
8、od in unit of time ticks of the OS */#define _SYNC_tHANDLE/* Type of sync object used on the OS. e.g. HANDLE,OS_EVENT*, ID and etc. */ /* To make the FatFs module re-entrant, set _FS_REENTRANT to 1 and add user /provided synchronization handlers, ff_req_grant, ff_rel_grant, ff_del_syncobj /and ff_cr
9、e_syncobj function to the project. */ #elif _CODE_PAGE = 936 /* Simplified Chinese GBK */ #define _DF1S 0 x 81 #define _DF1E 0xFE #define DS1S0 x 40 #define _DS1E 0x7E #define DS2S 0 x 80 #define _DS2E 0xFE小写、数字。暂时不理会它。接下来很大一部分都是与语言相关的因素,略过。#define IsUpper(c) (c)>='A')&&(c)<=
10、39; Z')#define IsLower(c) (c)>=' a')&&(c)<=' z')#define IsDigit(c) (c)>='0,)&&(c)v二' 9 ,/* Character code support macros */ 三个宏判断是否大写、)#if _DF1S/* DBCS configuration */双字节编码相关的设定,#if _MULTI_PARTITION/* Multiple partition configuration */ / 该变量定义为
11、1 时,支持一个磁盘的多个分区。typedef struct _PARTITION BYTE pd;/* Physical drive# */BYTE pt;/* Partition # (0-3) */ PARTITION;Externc on st PARTITION Drives;如果支持分区,则声明变量 Drivers #defi ne LD2 PD(drv) (Drivesdrv. pd)/*获得磁盘对应的物理磁盘 #defi ne LD2 PT(drv) (Drivesdrv. pt)/*获得磁盘对应的分区 #else/* Single partition configuratio
12、n */ #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字节。#defineSS(fs)512U #if _LFN_UNICODE && _USE_LFN typ edef WCHAR XCHAR;/* Un icode */ XCHA是文件名的码型所用。#else typedef char XC
13、HAR;/* SBCS, DBCS */ #endif typedef struct _FATFS_ BYTEfs_type;/* FAT sub type */BYTEdrive;/*对应实际驱动号01 */BYTEcsize;/*每个簇的扇区数目*/先查一下簇的含义:应该是文件数据分配的基本单位。BYTEn_fats;/*文件分配表的数目*/FAT文件系统依次应该是:引导扇区、文件分配表两个、根目录区和数据 区。BYTEwflag;/* win dirty flag (1:must be written back) */文件是否改动的标志,为1时要回写。WORDid;/* File sys
14、tem mount ID文 件系统加载 ID*/WORDn_rootdir;/*根目录区目录项的数目*/#if _FS_REENTRANT_SYNC_tsobj;/*允许重入,则定义同步对象*/#endif#if _MAX_SS != 512WORDs_size;/* Sector size */#endif#if! FS READONLY文件为可写BY TEfsi_flag;/* fsinfo dirty flag (1:must be writte n back) */ 文件需要回写的标志DWORDlast_clust;/* Last allocated cluster */DWORDfr
15、ee_clust;/* Number of free clusters */DWORDfsi_sector;/* fsinfo sector */#endif#if _FS_RPATHDWORDcdir;/*使用相对路径,则要存储文件系统当前目录#endifDWORDsects_fat;/*文件分配表占用的扇区DWORDmax_clust;/*最大簇数DWORDfatbase;/*文件分配表开始扇区DWORDdirbase;/*如果是FAT32根目录开始扇区需要首先得到。DWORDdatabase;/*数据区开始扇区DWORDwinsect;/* Current sector appearin
16、g in the win */目前的扇区在win里面,这个win数组暂时还不知道含义。BYTEwin_MAX_SS;/* Disk access window for Directory/FAT */这是一个win512数组,存储着一个扇区,好像作为扇区缓冲使用。 FATFS;typedef struct _DIR_ FATFS* fs;/* Pointer to the owner file system object */指向相应文件系统对象。WORDid;/*文件系统加载ID*/WORDindex;/* Current read/write index number */ 目前读写索引代
17、码DWORDsclust;/* Table start cluster (0:Static table) */文件数据区开始簇DWORDclust;/* Current cluster */目前处理的簇DWORDsect;/* Current sector */目前簇里对应的扇区BYTE*dir;/* Pointer to the current SFN entry in the win */BYTE*fn;/* Pointer to the SFN (in/out) file8,ext3,status1 */#if _USE_LFNWCHAR*lfn;/* Pointer to the LF
18、N working buffer */ 指向长文件名缓冲。WORDlfn_idx;/* Last matched LFN index number (0xFFFF:No LFN) */#endif DIR;typedef struct _FIL_ FATFS* fs;/* Pointer to the owner file system object */WORDid;/* Owner file system mount ID */BYTEflag;/* File status flags */文件状态标志BYTEcsect;/* Sector address in the cluster *
19、扇/ 区偏移DWORDfptr;/* File R/W pointer */ 读写指针DWORDfsize;/* File size */DWORDorg_clust;/* File start cluster */ 文件开始簇DWORDcurr_clust;/* Current cluster */ 当前簇DWORDdsect;/* Current data sector */ 文件当前扇区#if !_FS_READONLYDWORDdir_sect; /* Sector containing the directory entry */ 该文件目录项对应 所在的扇区 BYTE*dir_pt
20、r;/* Ponter to the directory entry in the window */#endif#if !_FS_TINYBYTEbuf_MAX_SS;/* File R/W buffer */文件读写缓冲#endif FIL;/* File status structure */typedef struct _FILINFO_ DWORDfsize;/* File size */WORDfdate;/* Last modified date */WORDftime;/* Last modified time */BYTEfattrib;/* Attribute */char
21、 fname13;/* Short file name (8.3 format) */#if _USE_LFNXCHAR*lfname;/* Pointer to the LFN buffer */intlfsize;/* Size of LFN buffer chrs */#endif FILINFO这个结构主要描述文件的状态信息,包括文件名13个字符8+.+3+0)、属性、修改时间等。接下来是函数的定义,先大概浏览一遍。FRESULT f_mount (BYTE, FATFS*加儼文件系统,BYTE参数是 ID,后一个 是文件系统定义。FRESULT f_open (FIL*, const
22、 XCHAR*, B YTE打开文件,第一个参数是文件信息结构,第二个参数是文件名,第三是文件打开模式FRESULT f_read (FIL*, void*, UINT, UINT*)文件读取函数,参数 1 为文件对 象(文件打开函数中得到),参数 2 为文件读取缓冲区,参数 3 为读取的字节 数,参数 4 意义不清晰,等读到源代码就清楚了。FRESULT f_write (FIL*, con st void*, UINT, UINT*);写文件,参数跟读差不多FRESULT f_lseek (FIL*, DWORD)移动文件的读写指针,参数 2应该是移动 的数目。FRESULT f_clos
23、e (FIL*);/* Close an open file object */FRESULT f_open dir (DIR*, con st XCHAF打开目录,返回目录对象FRESULT f_readdir (DIR*, FILINFO读取目录,获得文件信息FRESULT f_stat (const XCHAR*, FILINFO*);/* Get file status */FRESULT f_getfree (const XCHAR*, DWORD*, FATFS*);/* Get number of free clusters on thedrive */FRESULT f_tru
24、ncate (FIL*);/* Truncate file */FRESULT f_sync (FIL*);/* Flush cached data of a writing file 将*/ 缓冲区数据写回文件FRESULT f_unlink (co nst XCHAR删除目录中的一个文件FRESULTf_mkdir (const XCHAR*);/* Create a new directory */FRESULT f_chmod (const XCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */FRESULT f_uti
25、me (const XCHAR*, const FILINFO*);/* Change timestamp of the file/dir */FRESULT f_rename (const XCHAR*, const XCHAR*);/* Rename/Move a file or directory */FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream*/ 这个函数还要提供一个回调函数。FRESULT f_mkfs (BYTE, BYTE, WORD
26、);/* Create a file system on the drive */FRESULT f_chdir (const XCHAR*);/* Change current directory 改*/ 变当前目录FRESULT f_chdrive (BYTE);/* Change current drive */应该说基本能明白这些函数用于干什么。#if _USE_STRFUNCint f_putc (int, FIL*);/* Put a character to the file */int f_puts (const char*, FIL*);/* Put a string to
27、the file */int fprintf (FIL*, const char*,);/* Put a formatted stri ng to the file */char*f_gets (char*, int, FIL*);/* Get a string from the file */#define f_eof(fp) (fp)->fptr = (fp)->fsize) ? 1 : 0)#define f_error(fp) (fp)->flag & FA_ERROR) ? 1 : 0)#if _FS_REENTRAN如果定义了重入,则需要实现以下四个函数B
28、OOL ff_cre_syn cobj(B YTE, _S YNCJ创建同步对象BOOL ff_del_sy ncobj(_S YNCJ);除同步对象BOOL ff_req_gra nt(_S YNC_t);f 请同步对象void ff_rel_gra nt(_S YNC_t)释放同步对象。#endif3、diskio.h 文件typedef BYTEDSTATUS;typ edefDRESULT;/首先定义了两个变量,各个函数都有用至叽BOOL assign_drives (int argc, char *argv); /这/ 个函数不知道干吗DSTATUS disk_i ni tializ
29、e (BY TE);磁盘初始化DSTATUS disk_status (BY TE)获取磁盘状态DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);#if_READONLY = 0DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE);#endifDRESULT disk_ioctl (B YTE, B YTE, void*磁盘控制接下来还有一些常数的定义,具体用到时在看。4、diskio.c 的结构DSTATUS disk_initialize (BYTE drv/* Physical drive nmub
30、er (0.) */)DSTATUS stat;int result;switch (drv) case ATA :result = ATA_disk_initialize();/ translate the reslut code herereturn stat;case MMC :result = MMC_disk_initialize();/ translate the reslut code herereturn stat;case USB :result = USB_disk_initialize();/ translate the reslut code herereturn st
31、at;return STA_NOINIT;函数基本都像这样, drv 表示磁盘的类型。没有实现,用户必须实现这部分代码。5、ff.e文件简单浏览#inelude “ff.h ”/* FatFs eonfigurations and tdioenesla*r/a#inelude “diskio.h ”/* Deelarations of low level disk I/O funetions */#defineENTER_FF(fs) if (!loek_fs(fs) return FR_TIMEOUT; 获/取文件系统同 步对象,不成功返回超时,成功,继续执行。#defineLEAVE_FF
32、(fs, res) unloek_fs(fs, res); return res; 释/放文件系统同步 对象。StaticFATFS *FatFs_DRIVES定义一个文件系统对象指针数组,当然一般 我们也就用到一个元素。Statie WORD LfnBuf_MAX_LFN + 1;/这/ 个是与长文件名支持相关的。#defineNAMEBUF(sp,lp)BYTE sp12; WCHAR *lp = LfnBuf#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp面都是函数的定义,很多只在内部使用。Staticvoid mem_cpy (void
33、* dst, const void* src, int cnt) char *d = (char*)dst;eonst ehar *s = (eonst ehar *)sre;while (ent -*d+ = *s+; / 接下来还定义了几个内存操作的函数,这个函数实现了从一块内存到另 一块的复制,下面还有 mem_set ()对一块内存进行清0或设置操作; mem_cmp ()比较内存的多个字节是否相同,相同返回0; chk_chr ()检测字符串中是否存在某个字符,存在则返回该字符。FRESULT move_window (FATFS *fs,/* File system object
34、*/DWORD sector/* Sector number to make apperance in the fs->win */)/简单阅读了一下源代码,应该是改变文件系统的当前工作扇区,如果想 要操作的扇区就是当前扇区,什么事不做;如果不是,则将原扇区写回;如果 是FAT表,还得写入备份区。这个函数内部使用,外部无法引用。FRESULT sync (/* FR_OK: successful, FR_DISK_ERR: failed */FATFS *fs/* File system object */)/这个函数用于更新FAT32文件系统的FSI_Secto。什么含义还不太清楚。D
35、WORD get_fat (/* 0xFFFFFFFF:Disk error, 1:Interal error, Else:Cluster status */FATFS *fs,/* File system object */DWORD clst/* Cluster# to get the link information */if (move_window(fs, fsect + (clst / (SS(fs) / 4) break获取簇号码对应的 FAT 扇区 return LD_DWORD(&fs->win(WORD)clst * 4) & (SS(fs) - 1)
36、 & 0x0FFFFFFF; / 这个函数应该是获取簇的下一个连接簇。综合起来,这个函数应该是获取下一簇,感觉这个函数名起得不太好。get_nextcluster 感觉更好一点。FRESULT put_fat (FATFS *fs,/* File system object */DWORD clst,/* Cluster# to be cha nged in range of 2 to fs->max_clu */DWORD val /* New value to mark the cluster */)/ 上个函数是获取连接簇,这个是写入新的连接信息。FRESULT remov
37、e_chain (FATFS *fs,/* File system object */DWORD clst/* Cluster# to remove a chain from */)/将下一簇号写为 0,也就是该文件的簇到此为止,同时系统的自由簇增 加 1.DWORD create_chain (/* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:Newcluster# */FATFS *fs,/* File system object */DWORD clst/* Cluster# to stretch.
38、 0 means create a new chain. */)/ 跟上一个相反,在该簇的位置写入新的下一簇簇号。DWORD clust2sect (/* !=0: Sector number, 0: Failenvalid cluster# */FATFS *fs,/* File system object */DWORD clst/* Cluster# to be converted */) / 这个函数是将簇号转变为对应的扇区号。clst * fs->csize + fs->database; /这个是算法FRESULT dir_seek (DIR *dj,/* Pointe
39、r to directory object */WORD idx/* Directory index number */)/ 这个函数的最终目的是根据索引号找到目录项所在簇、所在扇区、并是 目录对象的对象指针指向文件系统对象窗口扇区的对应位置。 FRESULT dir_next (/* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and couldnot streach */DIR *dj,/* Pointer to directory object */BOOL streach/* FALSE: Do not streach
40、 table, TRUE: Streach table if needed /) / 移动当前目录项,根据索引,源代码简单看了一下,作用还不是很清晰,先放 过。接下来有 5 个函数与长文件名有关,这里先跳过。FRESULT dir_find (DIR *dj/* Pointer to the directory object linked to the file name */)/FRESULT dir_read (DIR *dj/* Pointer to the directory object that pointing the entry to be read */)FRESULT di
41、r_register (/* FR_OK:Successful, FR_DENIED:No free entry or too many SFNcollision, FR_DISK_ERR:Disk error */DIR *dj/* Target directory with object name to be created */FRESULT dir_remove (/* FR_OK: Successful, FR_DISK_ERR: A disk error */DIR *dj/* Directory object pointing the entry to be removed */ 以上这些函数都是对目录项的操作函数。FRESULT create_name (DIR *dj,/* Pointer to the directory object */const XCHAR *path/* Pointer to pointer to the segment in the path string */)/ 这个函数太长了,具体用到的时候再说吧。void get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆人文科技学院《学前教育科研方法》2022-2023学年第一学期期末试卷
- 重庆三峡学院《食品检测与分析综合实验》2023-2024学年第一学期期末试卷
- 重庆人文科技学院《程序设计》2021-2022学年期末试卷
- 重庆财经学院《证券投资技术分析》2022-2023学年第一学期期末试卷
- 重庆三峡学院《汉语修辞学》2022-2023学年第一学期期末试卷
- 2024北京二十中九年级(上)期中化学(教师版)
- 重庆三峡学院《电力系统分析》2023-2024学年期末试卷
- 重庆财经学院《数字摄像与编辑》2022-2023学年第一学期期末试卷
- 茶叶制作培训课程设计
- 茶具运输课程设计
- 防洪评价课件
- 普通地质学教材
- 2023年高校教师个人年终工作总结参考范文(二篇)
- 毛泽东思想概论
- 商务礼仪说课
- 混凝土售后服务
- GB/T 6726-2008汽车用冷弯型钢尺寸、外形、重量及允许偏差
- GA/T 850-2021城市道路路内停车位设置规范
- 2023年全面数字化的电子发票辅导培训课件PPT培训教程
- 第2课 新航路开辟后的食物物种交流 课件-高中历史统编版(2019)选择性必修二经济与社会生活
- 船舶电气设备及系统船舶照明系统管理-课件
评论
0/150
提交评论