目录
一、需要实现多分区的原因
二、Fatfs多分区的实现
三、多分区的读写
Fatfs版本:R0.12c
Fatfs下载地址:http://elm-chan.org/fsw/ff/00index_e.html
一、需要实现多分区的原因
因工作项目需要,需要读写U盘启动盘,而启动盘一般最少会被划分成2个分区,一个是装放镜像的磁盘,另一个是EFI分区用于引导程序用于引导安装镜像文件。并且启动盘的分区形式主要有GPT、与MBR的分区形式,目前主流启动盘分区形式为GPT形式,但是由于当前版本的Fatfs仅支持MBR分区格式(解决问题后才发现,目前最新的Fatfs的版本为0.14a,从0.14版本开始起已经支持了GPT形式的分区了......)。所以不得不将原来GPT形式的启动盘改成MBR格式的启动盘。
更改启动盘分区格式方法:
- 使用DiskGenius 直接将GPT分区形式转换成MBR形式(暂时未测试过转化后EFI是否能够正常运行)
- 使用Ventoy制作MBR形式的启动盘,然后将VTOYEFI盘中的文件替换成自定义的EFI(经测试,可以正常运行引导程序)
二、Fatfs多分区的实现
(1)这是官网文档中的卷管理的解释:
(2) Fatfs配置多分区步骤 (仅说明FatfsR0.12c版本,最新的Fatfs版本配置方面有较大的改动,但可以提供借鉴)
ffconf.h文件中:
- _VOLUMES 分区数量默认是1,修改成你想要的逻辑分区的数量(卷数)
- _MULTI_PARTITION 默认是0,设置成1。(开启多分区)
- _FS_RPATH 默认是0,需要设置成 >= 1 (使能相对路径函数)
注:最好将 Fatfs的 _FS_EXFAT 也使能了,因为由Ventoy创建的第一个分区为Exfat格式,根据个人需求进行更改
在自定的C文件中添加:(根据需求更改,上图说明的十分清楚)
PARTITION VolToPart[_VOLUMES] = {
{0, 1}, /* "0:" ==> 1st partition on physical drive 0 */
{0, 2}, /* "1:" ==> 2nd partition on physical drive 0 */
};
三、多分区的读写
由上面的内容可以得知,我们将一个物理驱动盘分了两个逻辑分区,而多分区的读写,可以用以下两种方式:
- 使用一个FATFS 对象,然后要对不同分区进行读写操作的时候,直接重新挂载就行了
FATFS SDFatFS; /* File system object for SD logical drive */
/* 挂载分区0 */
f_mount(&SDFatFS, "0: ", 1);
//......对分区0进行读写操作
/* 挂载分区1 */
f_mount(&SDFatFS, "1: ", 1);
//......对分区1进行读写操作
- 使用多个Fatfs对象,对不同分区操作时,直接对不同Fatfs对象进行读写
FATFS SDFatFS[2]; /* File system object for SD logical drive */
f_mount(&SDFatFS[0], "0: ", 1);
f_mount(&SDFatFS[1], "1: ", 1);