衡山派Luban-Lite系统SPI NOR驱动与文件系统配置详解
衡山派Luban-Lite系统SPI NOR驱动与文件系统配置详解最近在衡山派开发板上做项目需要把一些UI资源、配置文件存到板载的SPI NOR Flash里并挂载成文件系统。很多刚开始接触Luban-Lite系统的朋友可能会觉得配置驱动和文件系统有点复杂菜单选项多不知道从何下手。别担心今天我就以“衡山派”硬件平台为例手把手带你走一遍SPI NOR Flash的驱动配置和FatFS、LittleFS文件系统的集成过程。无论你是用裸机Baremetal还是RT-Thread这篇教程都能帮你搞定。咱们的目标很明确让开发板能识别并访问板载的SPI NOR Flash然后把它格式化成文件系统最后还能把你电脑上的文件打包成镜像烧录进去。整个过程我会结合我实际踩过的坑把关键步骤和注意事项都讲清楚。1. 准备工作与环境理解在开始配置之前咱们先快速了解一下背景。衡山派开发板上的SPI NOR Flash是一种通过SPI串行外设接口总线访问的存储芯片容量不大但速度快适合存放系统固件、字体图片等资源。Luban-Lite系统提供了灵活的配置工具menuconfig来管理这些底层驱动。核心工具menuconfig这是咱们配置系统的“控制面板”。在Luban-Lite系统的根目录下打开终端输入scons --menuconfig命令就能进入一个图形化的配置界面。所有的驱动、组件、参数都在这里开关和设置。后面的所有操作都围绕它展开。两种运行模式Baremetal裸机没有操作系统直接操作硬件。配置相对简单直接。RT-Thread实时操作系统运行了RT-Thread内核提供了更丰富的设备驱动框架和组件。配置选项会多一些但功能也更强大。你需要根据自己项目实际使用的模式选择对应的配置章节。2. SPI NOR Flash驱动配置驱动是硬件工作的基础。只有正确配置了SPI NOR的驱动系统才能和Flash芯片“对话”。2.1 Baremetal裸机模式配置如果你在裸机环境下开发按照以下步骤配置在Luban-Lite根目录执行scons --menuconfig进入配置界面。按照下面的路径和选项进行选择[*]表示选中[ ]表示不选Board options --- [*] Using Qspi0 # 启用QSPI0控制器 [ ] Using Qspi1 # 根据硬件连接通常只用QSPI0 [ ] Using Qspi2 [ ] Using Qspi3 Qspi0 Parameter --- (100000000) Max frequency(Hz) # QSPI控制器最大频率默认100MHz [*] Qspi0 Devices: SPINOR --- # 在QSPI0总线上挂载SPI NOR设备 (100000000) SPINOR bus frequency(Hz) # SPI NOR通信频率默认100MHz Drivers options --- AIC Bare Driver --- [*] Enable AIC MTD Bare Driver # 启用裸机下的MTD内存技术设备驱动框架 Peripheral --- -*- SPINOR Driver SFUD: Serial Flash Universal Driver # 必须选中这是通用的SPI Flash驱动提示为了简化配置当你选中AIC_QSPI0_DEVICE_SPINOR即启用QSPI0上的SPI NOR设备后系统通常会自动帮你选中AIC_SPINOR_DRV、LPKG_USING_SFUD和AIC_MTD_BARE_DRV这几个依赖项。你检查一下确保它们被选上就行。关键点解释SFUDSerial Flash Universal Driver这是一个非常棒的通用SPI Flash驱动库。它能够自动探测Flash的型号和容量通过JEDEC ID省去了我们手动编写不同Flash芯片驱动代码的麻烦。所以这个选项必须选中。MTD驱动MTD层是Linux中用于管理内存类设备如NOR Flash, NAND Flash的抽象层在这里被引入用于统一访问接口。启用它方便后续文件系统挂载。2.2 RT-ThreadRTOS模式配置如果你使用的是RT-Thread系统配置会更丰富一些因为要对接RT-Thread的设备驱动模型。同样执行scons --menuconfig。按如下路径配置Board options --- [*] Using Qspi0 [ ] Using Qspi1 [ ] Using Qspi2 [ ] Using Qspi3 Qspi0 Parameter --- (100000000) Max frequency(Hz) [*] Qspi0 Devices: SPINOR --- (100000000) SPINOR bus frequency(Hz) Drivers options --- Peripheral --- -*- SPINOR Driver SFUD: Serial Flash Universal Driver # 同样需要SFUD Rt-Thread options --- RT-Thread Components --- Device Drivers --- -*- Using MTD Nor Flash device drivers # RT-Thread的MTD NOR驱动 -*- Using SPI Bus/Device device drivers # SPI设备驱动框架 -*- Enable QSPI mode # 启用QSPI模式 -*- Using SFUD(Serial Flash Universal Driver) # 在RT-Thread下使用SFUD [*] Using auto probe flash JEDEC SFDP parameter # 自动探测Flash参数推荐 [*] Using defined supported flash chip information table # 使用预定义的Flash芯片信息表 [*] Using QSPI mode support # 支持QSPI模式 (50000000) Default spi maximum speed(HZ) # 默认SPI最高速度设为50MHz提示和裸机模式类似使能AIC_QSPI0_DEVICE_SPINOR后通常会自动选中AIC_SPINOR_DRV、RT_USING_SFUD、LPKG_USING_SFUD和RT_USING_MTD_NOR。请确认它们已被启用。RT-Thread配置要点这里多了一个SPI设备驱动框架的选项这是RT-Thread统一管理SPI设备所必需的。默认SPI速度设置为50MHz这是一个比较保守且稳定的值。如果你的Flash芯片质量好可以尝试提高但建议先以稳定为主。配置完成后保存并退出menuconfig。执行scons命令编译系统驱动部分就准备好了。3. 文件系统配置驱动搞定后我们就能把Flash当成一个块设备来访问了。接下来就是在这个块设备上创建文件系统这样我们就能以“文件”和“文件夹”的形式来管理数据了。Luban-Lite支持FatFS和LittleFS两种常用的嵌入式文件系统。3.1 Baremetal下FatFS配置FatFS是一个兼容FAT格式的轻量级文件系统通用性好。在menuconfig中进入以下路径Local packages options --- Third-party packages options --- [*] DFS: device virtual file system for baremetal mode --- # 启用裸机模式下的虚拟文件系统 [*] Using posix-like functions, open/read/write/close # 启用类POSIX的文件操作API (8) The maximal number of mounted file system # 最大挂载文件系统数量默认8 (4) The maximal number of file system type # 支持的文件系统类型数默认4 (16) The maximal number of opened files # 同时打开的最大文件数默认16 [ ] Using mount table for file system # 裸机下通常不用自动挂载表 [*] Enable elm-chan fatfs # 启用FatFS elm-chans FatFs, Generic FAT Filesystem Module --- # 进入FatFS子菜单 [*] Enable ReadOnly file system on flash # 在Flash上启用只读文件系统关键 [ ] Enable RAM file system # 按需启用RAM文件系统关键选项说明Enable ReadOnly file system on flash这个一定要选上。对于SPI NOR Flash由于其擦写寿命和块大小特性在裸机下默认配置为只读是最简单稳定的方式。这意味着你无法在运行时通过f_write向Flash保存文件但可以读取预先烧录好的内容。POSIX函数选中后你可以使用标准的open,read,write,close等函数来操作文件代码可移植性更好。3.2 RT-Thread下FatFS配置在RT-Thread下配置FatFS选项位置有所不同。在menuconfig中进入以下路径Rt-Thread options --- RT-Thread Components --- [*] DFS: device virtual file system --- # 启用RT-Thread的DFS [*] Using posix-like functions, open/read/write/close [*] Using working directory # 使用工作目录概念 (4) The maximal number of mounted file system (4) The maximal number of file system type (16) The maximal number of opened files [*] Using mount table for file system # 启用自动挂载表重要 [*] Enable elm-chan fatfs elm-chans FatFs, Generic FAT Filesystem Module --- (4096) Maximum sector size to be handled. # 最大扇区大小设为4096以匹配Flash块大小 [ ] Using devfs for device objects [*] Enable ReadOnly file system on flash # 同样默认启用Flash只读文件系统 [ ] Enable RAM file systemRT-Thread FatFS特殊配置Using mount table for file system这个选项建议打开。打开后系统启动时会自动根据一个预定义的“挂载表”来挂载文件系统无需在代码中手动调用挂载函数非常方便。挂载表在哪里这个表定义在board.c文件中。配置了上述选项后你可以在board.c里找到类似下面的代码段#ifdef RT_USING_DFS_MNTTABLE #include dfs_fs.h const struct dfs_mount_tbl mount_table[] { #if (defined(AIC_USING_FS_IMAGE_TYPE_FATFS_FOR_0) || defined(AIC_USING_FS_IMAGE_TYPE_FATFS_FOR_1)) {blk_rodata, /rodata, elm, 0, 0, 0}, // 将名为blk_rodata的块设备以elm(FatFS)格式挂载到/rodata目录 #endif {0} }; #endif这行配置的意思是系统启动后会自动把blk_rodata这个就是我们的SPI NOR Flash在系统内的设备名以FatFS格式挂载到根目录下的/rodata路径。你之后访问/rodata目录就能看到Flash里的文件了。3.3 启用FatFS写功能谨慎使用默认配置下Flash上的FatFS是只读的。如果你确实需要在运行时向Flash写入文件请注意这会显著缩短Flash寿命且速度慢可以进行额外配置。无论是Baremetal还是RT-Thread都需要通过make m命令进入一个专门的应用配置菜单注意不是scons --menuconfig。在Luban-Lite根目录执行make m。找到以下路径并选中Application options --- [*] FATFS enable write func in spinor # 在SPI NOR上启用FatFS写功能重要警告原文特别指出因为SPI NOR Flash的物理擦除块大小通常是4KB而FatFS的扇区大小是512字节。为了实现写功能驱动层做了兼容处理但这会导致写速度非常慢。在实际产品中极不推荐开启此功能。通常的做法是把需要动态修改的数据存放在外置的SD卡或专门的EEPROM中SPI NOR只存放固件和静态资源。3.4 RT-Thread下LittleFS配置LittleFS是专为嵌入式系统设计的文件系统具有掉电安全、磨损均衡等优点比FatFS更适合在Flash上进行频繁的小文件读写。在scons --menuconfig中配置Local packages options --- Third-party packages options --- [*] Littlefs: A high-integrity embedded file system --- # 启用LittleFS软件包 (256) disk read size # 磁盘读取缓存大小影响内存占用和性能 (256) disk write size # 磁盘写入缓存大小 (4096) disk block size # 必须与Flash物理擦除块大小一致通常是4KB (256) lfs r/w cache size # LittleFS内部读写缓存大小 (128) lfs lookahead size # 前瞻缓冲区大小用于磨损均衡挂载配置和FatFS一样如果启用了Using mount table for file system需要在board.c中查看挂载表。对于LittleFS条目可能是这样的#ifdef RT_USING_DFS_MNTTABLE #include dfs_fs.h const struct dfs_mount_tbl mount_table[] { #ifdef LPKG_USING_LITTLEFS {data, /data, lfs, 0, 0, 0}, // 将名为data的块设备以lfs格式挂载到/data目录 #endif {0} }; #endif这里把data设备可能是Flash的另一分区以LittleFS格式挂载到了/data目录。LittleFS参数调优建议disk block size必须设置正确要查询你板载SPI NOR Flash的数据手册找到其“扇区擦除大小”Sector Erase Size常见的是4KB4096字节。填错会导致文件系统损坏。其他缓存大小参数可以根据可用内存和性能需求微调256字节是常用值。4. 文件系统镜像制作与烧录我们通常会在PC上准备好要放入Flash的文件如图片、字体、配置文件然后打包成一个文件系统镜像最后一次性烧录到Flash的指定区域。Luban-Lite的构建系统提供了自动化工具。4.1 FatFS镜像制作通过make m进入应用配置菜单。找到文件系统镜像配置项Application options --- [*] Using File System Image 0 --- # 启用第一个文件系统镜像 Select File System Type (FATFS) --- # 选择镜像类型为FATFS (packages/artinchip/lvgl-ui/aic_demo/meter_demo/lvgl_src/) Data Directory # 源数据目录路径 (rodata.fatfs) Image Name # 生成的镜像文件名 [*] auto calcuate image size # 自动计算镜像所需大小 (8) size of cluster in fatfs image # FATFS簇大小扇区倍数默认8*512B4KB配置解释Data Directory这是你电脑上的一个文件夹路径里面放着你所有想打包进Flash的文件。构建时系统会把这个文件夹整个打包进镜像。Image Name最终生成的镜像文件名字比如rodata.fatfs。auto calcuate image size强烈建议选中让工具自动根据数据目录大小计算镜像尺寸。cluster sizeFAT文件系统的簇大小。设置为8表示8个扇区即4KB是为了对齐Flash的擦除块大小能提升访问效率。配置好后执行编译命令如scons或make构建系统会自动调用工具将指定目录打包成rodata.fatfs镜像文件。这个文件会和其他固件如uboot, kernel一起在后续的烧录步骤中被写入Flash的对应分区。4.2 LittleFS镜像制作LittleFS镜像的配置过程类似但有一些特有的参数。在make m菜单中配置通常使用另一个镜像索引如Image 1Application options --- [*] Using File System Image 1 --- # 启用第二个文件系统镜像 Select File System Type (LittleFS) --- # 选择镜像类型为LittleFS (packages/artinchip/lvgl-ui/aic_demo/meter_demo/lvgl_src/) Data Directory (data.lfs) Image Name # LittleFS镜像文件名 (4096) Erase block size # 擦除块大小必须与Flash物理块大小一致 (256) Page size # 页大小通常为256字节关键参数Erase block size必须与Flash的物理擦除块大小一致同样是4KB4096字节。这个值必须和前面LittleFS驱动配置中的disk block size保持一致。Page sizeFlash的页编程大小需要查芯片手册常见的SPI NOR Flash是256字节。同样配置完成后编译就会生成data.lfs镜像文件。烧录镜像文件生成后你需要使用衡山派平台提供的烧录工具如aicupgrade、PhoenixSuit或通过fastboot等将包含文件系统镜像的完整固件包烧录到开发板。具体的烧录操作步骤取决于你使用的工具链一般会在板子的用户手册中有详细说明。到这里整个SPI NOR Flash的驱动配置、文件系统集成和镜像制作流程就完成了。总结一下核心思路先通过menuconfig配通硬件驱动SFUDMTD再选择并配置合适的文件系统FatFS只读存放静态资源/LittleFS进行安全读写最后在PC上打包资源成镜像并烧录。在实际操作中最需要注意的就是Flash的块大小参数一定要配置正确以及谨慎评估是否真的需要在NOR Flash上进行写操作。希望这篇教程能帮你顺利搞定衡山派上的存储系统