FatFs文件系统
目录
FatFs:http://elm-chan.org/fsw/ff/00index_e.html
1:FatFs文件系统结框架
1:底层接口:包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟,需要我们根据平台和存储介质编写移植代码
2:中间层FATFS模块:实现了FAT 文件读/写协议。FATFS模块提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
3:应用层:使用者无需理会FATFS的内部结构和复杂的FAT 协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write 和f_close等,就可以像在PC 上读/写文件那样简单。
2:FatFs文件系统包结构:
大部分的可移植的小系统或者应用,都是采用类似这种将与底层打交道的源码开发给用户编写,然后提供顶层配置文件供配置。
- diskio.c和diskio.h是硬件层。
- ff.c和ff.h是FatFs的文件系统层和文件系统的API层。
- FATFS模块在移植的时候,我们一般只需要修改2个文件,即ffconf.h和diskio.c。FATFS模块的所有配置项都是存放在ffconf.h里面,我们可以通过配置里面的一些选项,来满足自己的需求。diskio.c是硬件层,负责与底层硬件接口适配。
- ffconf.h里面有很多FATFS关键配置文件,比如说通过标志位来标志是否为只读,是否支持字符串类操作等等
3:FatFs移植步骤
1:数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数据类型,并根据编译器定义好数据类型。
2:配置:通过ffconf.h配置FATFS的相关功能,以满足你的需要。
3:函数编写:打开diskio.c,进行底层驱动编写,一般需要编写6 个接口函数
disk_initialize:初始化磁盘驱动器
The disk_initialize function is called to initializes the storage device.
DSTATUS disk_initialize ( BYTE pdrv /* [IN] Physical drive number */ );: 函数参数:指定要初始化的逻辑驱动器号,即盘符,应当取值0-9 函数会返回一个磁盘状态作为结果,对于一些细节disk_status:返回当前磁盘驱动器状态
The disk_status function is called to inquire the current drive status.
DSTATUS disk_status ( BYTE pdrv /* [IN] Physical drive number */ //指定要确认的逻辑驱动器号,即盘符,应当取值0-9 );disk_read:从磁盘驱动器上读取扇区
The disk_read function is called to read data from the sector(s) of storage device.
DRESULT disk_read ( BYTE pdrv, /* [IN] Physical drive number */ //指定逻辑驱动器号即盘符0-9 BYTE* buff, /* [OUT] Pointer to the read data buffer */ //指向存储读取数据字节数组的指针,需要为所读取字节数的大指向存储读取数据字节数组的指针,需要为所读取字节数的大小,扇区统计的扇区大小是需要的 LBA_t sector, /* [IN] Start sector number */ //指定起始扇区的逻辑块(LBA)上的地址 UINT count /* [IN] Number of sectros to read */ //指定要读取的扇区数,取值1~128 );disk_write:向磁盘写入一个或多个扇区
The disk_write function is called to write data to the sector(s) of storage device.
DRESULT disk_write ( BYTE pdrv, /* [IN] Physical drive number */ //指定逻辑驱动器号即盘符0-9 const BYTE* buff, /* [IN] Pointer to the data to be written */ //指向要写入字节数组的指针,注:FatFs指定的内存地址并不总是字对齐的,如果硬件不支持不对齐的数据传输,函数里需要进行处理 LBA_t sector, /* [IN] Sector number to write from */ //指定起始扇区的逻辑块(LBA)上的地址 UINT count /* [IN] Number of sectors to write */ //指定要读取的扇区数,取值1~128 );disk_ioctl:控制设备指定特性和除了读/写外的杂项功能
The disk_ioctl function is called to control device specific features and miscellaneous functions other than generic read/write.
DRESULT disk_ioctl ( BYTE pdrv, /* [IN] Drive number */ //指定逻辑驱动器号即盘符0-9 BYTE cmd, /* [IN] Control command code */ //指定命令代码 void* buff /* [I/O] Parameter and data buffer */ //指向参数缓冲区的指针,取决于命令代码,不使用时,指定一个NULL指针 );get_fattime:获取当前时间
The get_fattime function is called to get the current time.
DWORD get_fattime (void);以上函数都在ff.c文件中
4:Fatfs开放函数:
f_mount - 注册/注销一个工作区域(Work Area)
f_open - 打开/创建一个文件
f_close - 关闭一个文件
f_read - 读文件
f_write - 写文件
f_lseek - 移动文件读/写指针
f_truncate -截断文件
f_sync - 冲洗缓冲数据 Flush Cached Data
f_forward - 直接转移文件数据到一个数据流
f_stat - 获取文件状态
f_opendir - 打开一个目录
f_closedir -关闭一个已经打开的目录
f_readdir - 读取目录条目
f_mkdir - 创建一个目录
f_unlink -删除一个文件或目录
f_chmod - 改变属性(Attribute)
f_utime -改变时间戳(Timestamp)
f_rename - 重命名/移动一个文件或文件夹
f_chdir - 改变当前目录
f_chdrive - 改变当前驱动器
f_getcwd - 获取当前工作目录
f_getfree - 获取空闲簇 Get Free Clusters
f_getlabel - Get volume label
f_setlabel - Set volume label
f_mkfs - 在驱动器上创建一个文件系统
f_fdisk - Divide a physical drive
f_gets - 读一个字符串
f_putc - 写一个字符
f_puts - 写一个字符串
f_printf - 写一个格式化的字符串
f_tell - 获取当前读/写指针
f_eof - 测试文件结束
f_size - 获取文件大小
f_error - 测试文件上的错误