【问题标题】:How to emulate FatFS?如何模拟 FatFS?
【发布时间】:2020-01-29 07:28:37
【问题描述】:

我想在微控制器 (STM32L4xx) 上显示一些数据,使其看起来像是通过 USB 安装到主机 PC 的文件系统上的单个文件。我有可以在(模拟)文件中的任何请求偏移处生成数据的函数。该文件可以只读,没有理由对其进行写入;它可以有一个固定的名称和大小。

这与Chan's FatFS 和类似库的用例完全相反:我没有真正的文件系统,我不想访问文件系统,我只想做任何必要的事情来呈现一个模拟(假)文件系统(带有单个文件)到 USB 主机。

我认为显示为大容量存储设备(例如 Mbed)的引导加载程序必须执行类似的操作,因为当您将 hex 文件拖放到看起来像mbed存储设备;我想它存储在某个地方,但不是在实际文件系统中,因为它是可见的。

谁能指点我这些方面的一些示例代码?

【问题讨论】:

  • 大约有多少数据?千字节,兆字节?
  • 我自己曾经写过一次这个确切的东西,但我是手工完成的 - 在 MSC 上模拟 FAT32。我不知道有任何适合微控制器的轻量级库。如果您想自己编写一个,您通常需要能够检测主机刚刚请求的区域(启动、fsinfo、保留页面、fat、文件数据..)并通过动态构建“页面”内容来做出相应的响应。这种方法的一种替代方法是使用 MTP USB 类,如果您的应用程序可能的话,该类对于此类用例具有更方便的 API。
  • @berendi 这是数百兆字节
  • @AlexI 相应地更新了答案

标签: filesystems emulation microcontroller stm32 fatfs


【解决方案1】:

因为只有一个固定长度的文件,所以你不必在文件系统结构上费太多心思,只要在PC上创建一次,就可以把它当作一个固定的头文件。该设备根本不需要 FatFS 代码。其他为空的 FAT 文件系统上的文件将从第一个空闲扇区开始连续存储。

首先,让我们创建一个最小的 FAT 文件系统映像,例如在 linux 上使用 mtools 包。

mformat -v "EMBEDDED FS" -t 1 -h 1 -s 5 -S 2 -C -i fs.img -c 1 -r 1 -L 1

这将创建一个具有一侧、一个磁道和五个 512 字节长扇区的磁盘映像。前四个扇区是引导扇区、两个 FAT 和根目录,第五个扇区可以容纳一个 512 字节长的文件。

$ mdir -i fs.img 
 Volume in drive : is EMBEDDED FS
 Volume Serial Number is 061F-DA50
Directory for ::/

No files
                                512 bytes free

如果您需要更多空间,请增加扇区数。


更新

我发现我的mformat 无法创建更大的文件系统(或者我无法找出正确的参数)。还有另一个名为 mkdosfs 的实用程序,它对我来说效果更好,例如

/sbin/mkdosfs -f 1 -n "EMBEDDED FS" -r 16 -s 64 -S 512 -v -C big.img 524256

创建一个 512 MB 的文件系统。

$ mdir -i big.img
 Volume in drive : is EMBEDDED FS
 Volume Serial Number is 5457-0DF4
Directory for ::/

No files
                        536 739 840 bytes free

更大的文件系统当然会包含更多的开销,但您会发现其中大部分只是一个运行数字(FAT 中的簇链),也可以动态生成,只要图像仅包含一个大文件。


现在创建一个具有所需长度的文件并将其复制到图像中

echo 'hello world' > testfile.txt
mcopy -i fs.img testfile.txt ::/

并用hd转储结果(*表示重复上一行)

$ hd fs.img
00000000  eb 3c 90 4d 54 4f 4f 34  30 31 38 00 02 01 01 00  |.<.MTOO4018.....|
00000010  02 10 00 05 00 f0 01 00  05 00 01 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 29 65  83 db 06 45 4d 42 45 44  |......)e...EMBED|
00000030  44 45 44 20 46 53 46 41  54 31 32 20 20 20 fa 31  |DED FSFAT12   .1|
00000040  c0 8e d8 8e c0 fc b9 00  01 be 00 7c bf 00 80 f3  |...........|....|
00000050  a5 ea 56 00 00 08 b8 01  02 bb 00 7c ba 80 00 b9  |..V........|....|
00000060  01 00 cd 13 72 05 ea 00  7c 00 00 cd 19 00 00 00  |....r...|.......|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 00  |................|
000001c0  01 00 01 00 05 00 00 00  00 00 05 00 00 00 00 00  |................|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200  f0 ff ff ff 0f 00 00 00  00 00 00 00 00 00 00 00  |................|
00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000400  f0 ff ff ff 0f 00 00 00  00 00 00 00 00 00 00 00  |................|
00000410  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000600  45 4d 42 45 44 44 45 44  20 46 53 08 00 00 33 80  |EMBEDDED FS...3.|
00000610  3e 4f 3e 4f 00 00 33 80  3e 4f 00 00 00 00 00 00  |>O>O..3.>O......|
00000620  54 45 53 54 46 49 4c 45  54 58 54 20 18 00 a7 80  |TESTFILETXT ....|
00000630  3e 4f 3e 4f 00 00 a7 80  3e 4f 02 00 0c 00 00 00  |>O>O....>O......|
00000640  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000800  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 00 00 00 00  |hello world.....|
00000810  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000a00

正如预期的那样,文件内容存储在偏移量0x0800 处,紧随四个保留扇区之​​后。您现在可以获取映像的前 2048 个字节,并将其放入您的程序中以初始化虚拟磁盘映像。

USB设备代码可以从STM32CubeL4中的Applications/USB_Device/MSC_Standalonedemo开始,将STM32变成SD读卡器。扔掉SD卡相关代码,只传递前四个扇区的固定图像数据,剩下的你的文件数据。

我自己没有尝试过,所以有可能某些操作系统会卡在这个小磁盘映像上,在这种情况下,请尝试使用mformat 创建标准软盘映像。

【讨论】:

  • 谢谢你,一个很好的综合回答。
猜你喜欢
  • 2018-12-31
  • 1970-01-01
  • 2016-10-20
  • 2019-06-03
  • 1970-01-01
  • 2016-07-14
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多