6.7. FatFs(SD/UDISK) 启动

FatFs 启动包括从 SD 卡 FatFs(FAT32/exFAT)启动和 U盘(FAT32/exFAT)启动。

SD 卡启动的整体流程中,首先尝试从分区读取第一级引导程序程序,如果从分区读取和验证失败,则尝试从 FatFs 文件系统启动。

../../_images/sdfatfs_flow.png

U盘启动的情况,则直接尝试从 FatFs 文件系统启动。

从 FatFs 文件系统启动的一些前置条件:

  1. SD 卡、U盘不分区,或者使用 MBR、GPT 的格式进行分区

  2. 如果进行了分区,则应该使用第一个分区

  3. 只支持 FAT32 和 exFAT 文件系统,簇大小建议8KB以上

  4. 升级文件只能放在文件系统根目录

6.7.1. FatFs 中的内容

对于执行升级的使用场景,文件系统中存放的文件如下。

文件

是否必要

说明

bootcfg.txt

必要

启动镜像配置文件,名字固定

xxx_v1.0.0.img

必要

Bootloader 读取的升级镜像文件。根据具体项目的设计来决定是否出现。

其中 BROM 只关心 FatFs 文件系统根目录是否出现 bootcfg.txt 以及第一级引导程序,其他文件 BROM 不关心。

使用 bootcfg.txt 配置而不是直接读取镜像文件的原因:

  • 固定名字的配置文件,简化 BROM 寻找启动镜像的逻辑

  • 统一配置入口,BROM 和后续的 Bootloader 可以方便的找到对应的镜像文件

  • 可以根据不同项目的需要,对具体镜像进行命名

bootcfg.txt 内容示例:

# Boot configuration file
# Used in SD Card FAT32 boot and USB Disk upgrade.
# Format:
# boot0=size@offset
#   boot0 size and location offset in 'image' file, boot rom read it.
# boot0=example.bin
#   boot0 image is file example.bin, boot rom read it.
# boot1=size@offset
#   boot1 size and location offset in 'image' file, boot0 read it.
# boot1=example.bin
#   boot1 image is file example.bin, boot0 read it.
# image=example.img
#   Packed image file is example.img, boot1 use it.

# u-boot-spl-updater.aic
boot0=0x7d80@0x1c00

# u-boot-updater.aic
boot1=0x81d80@0xdc00

image=xxx_v1.0.0.img

使用限制:

  • 文件名必须是 ASCII 字符,不能为 UNICODE 或者其他字符

  • 文件名长度必须是小于128字符

  • 删除所有分区后,对 SD 卡进行深度格式化

  • U-boot-spl.aic 放在 image 中的 offset 位置,必须是 512字节对齐

6.7.2. 启动和升级流程

../../_images/fatfs_boot_flow.png

图 6.9 FatFs 启动流程

BROM 寻找和启动 FatFs 文件系统中的第一级引导程序的流程如上图所示。

FatFs 启动的设计目的是进行裸机的系统升级,但是 BROM 阶段仅完成找到第一级引导程序并且运行的功能, 后续的升级功能需要在 Bootloader 中进行实现。

../../_images/fatfs_boot_to_bootloader.png