FatFs的官网源码结构及已知问题以及解决方法或补丁——瑞萨RA系列FSP库开发实战指南(87)

24.4
FatFs文件系统移植实验
24.4.1
硬件设计及FSP
FatFs属于软件组件,不需要附带其他硬件电路。我们使用串行Flash芯片作为物理存储设备,其硬件电路在上一章已经做了分析,这里就直接使用。
24.4.2
FatFs移植步骤概述
基本步骤:
-
实现底层驱动接口
-
修改配置文件
移植FatFs之前我们先通过FatFs的程序结构图了解FatFs在程序中的关系网络,见图FatFs程序结构图。

用户应用程序需要由用户编写,想实现什么功能就编写什么的程序,一般我们只用到f_mount()、f_open()、f_write()、f_read()就可以实现文件的读写操作。
FatFs组件是FatFs的主体,文件都在源码src文件夹中,其中ff.c、ff.h、ffsystem.c以及ffunicode.c4个文件我们不需要改动,只需要修改ffconf.h和diskio.c/.h3个文件。
底层设备输入输出要求实现存储设备的读写操作函数、存储设备信息获取函数等等。我们使用串行Flash芯片作为物理设备,在上一章节已经编写好了串行Flash芯片的驱动程序,这里我们就直接使用。
24.4.2.1
实现底层驱动接口
FatFs文件系统与底层介质的驱动分离开来,对底层介质的操作都要交给用户去实现,它仅仅是提供了一个函数接口而已。表FatFs移植需要用户支持函数为FatFs移植时用户必须支持的函数。
通过表FatFs移植需要用户支持函数我们可以清晰知道很多函数是在一定条件下才需要添加的,只有前三个函数是必须添加的。我们完全可以根据实际需求选择所需用到的函数。
前三个函数是实现读文件最基本需求。接下来三个函数是实现创建文件、修改文件需要的。为实现格式化功能,需要在disk_ioctl添加两个获取物理设备信息选项。我们一般只要实现前面六个函数就可以了,已经足够满足大部分功能。
为支持简体中文长文件名称需要添加ff_uni2oem、ff_oem2uni和ff_wtoupper 函数,实际这三个已经在ffunicode.c文件中实现,我们只要直接把ffunicode.c文件添加到工程中就可以。

底层设备驱动函数是存放在diskio.c文件,我们的目的就是把diskio.c中的函数接口与串行Flash芯片驱动连接起来。总共有五个函数,分别为设备状态获取(disk_status)、设备初始化(disk_initialize)、扇区读取(disk_read)、扇区写入(disk_write)、其他控制(disk_ioctl)。
接下来,我们对每个函数结合串行Flash芯片驱动做详细讲解。
24.4.2.2
修改配置文件
ffconf.h文件是FatFs的配置文件。
下面是ffconf.h文件中,需要修改的部分,只把需要修改的部分放出来:
列表1:
代码清单24‑1 FatFs的配置文件:ffconf.h
左右滑动查看完整内容
/********************//* 下面是经过修改部分*//********************/#define FF_USE_MKFS 1 //此选项切换是否启用f_mkfs() 函数,用于格式化␣,→Flash、SD 卡等/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */#define FF_CODE_PAGE 936 //此选项指定使用的OEM 代码页/* This option specifies the OEM code page to be used on the target system./ Incorrect code page setting can cause a file open failure.// 437 - U.S./ 720 - Arabic/ 737 - Greek/ 771 - KBL/ 775 - Baltic/ 850 - Latin 1/ 852 - Latin 2/ 855 - Cyrillic/ 857 - Turkish/ 860 - Portuguese/ 861 - Icelandic/ 862 - Hebrew/ 863 - Canadian French/ 864 - Arabic/ 865 - Nordic/ 866 - Russian/ 869 - Greek 2/ 932 - Japanese (DBCS)/ 936 - Simplified Chinese (DBCS)/ 949 - Korean (DBCS)/ 950 - Traditional Chinese (DBCS)/ 0 - Include all code pages above and configured by f_setcp()*/#define FF_USE_LFN 2 //此选项切换对长文件名的支持#define FF_MAX_LFN 255 //设置长文件名的最长长度/* The FF_USE_LFN switches the support for LFN (long file name).// 0: Disable LFN. FF_MAX_LFN has no effect./ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-,→safe./ 2: Enable LFN with dynamic working buffer on the STACK./ 3: Enable LFN with dynamic working buffer on the HEAP.#define FF_LFN_UNICODE 2 //此选项设置是否启用Unicode 字符编码/* This option switches the character encoding on the API when LFN is␣,→enabled.// 0: ANSI/OEM in current CP (TCHAR = char)/ 1: Unicode in UTF-16 (TCHAR = WCHAR)/ 2: Unicode in UTF-8 (TCHAR = char)/ 3: Unicode in UTF-32 (TCHAR = DWORD)// Also behavior of string I/O functions will be affected by this option./ When LFN is not enabled, this option has no effect. */#define FF_VOLUMES 2 //要使用的卷(逻辑驱动器)的数量。范围(1-10)/* Number of volumes (logical drives) to be used. (1-10) */#define FF_MIN_SS 512#define FF_MAX_SS 4096 //这组选项配置支持的扇区大小范围/* This set of options configures the range of sector size to be supported.␣,→(512,/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory␣,→card and/ harddisk, but a larger value may be required for on-board flash memory␣,→and some/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is␣,→configured/ for variable sector size mode and disk_ioctl() function needs to␣,→implement/ GET_SECTOR_SIZE command. *//* 若FF_MIN_SS != FF_MAX_SS。则需要在disk_ioctl() 中指定所需操作的设备的扇区大小* 在case GET_SECTOR_SIZE 项中指定*/#define FF_FS_NORTC 1 //设置为1 关闭时间戳启用时间戳功能需要RTC#define FF_NORTC_MON 1#define FF_NORTC_MDAY 1#define FF_NORTC_YEAR 2022/* The option FF_FS_NORTC switches timestamp feature. If the system does␣,→not have
更加详细的部分可以扫描下方二维码或复制链接到浏览器查看参考:
ffconf.h文件
https://elm-chan.org/fsw/ff/doc/config.html#use_mkfs


需要技术支持?
如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨MCU/MPU官方技术论坛寻找答案或获取在线技术支持。

https://bbs.21ic.com/renesas
未完待续
推荐阅读





夜雨聆风