如何模拟FatFS?
How to emulate FatFS?
我想在微控制器 (STM32L4xx) 上显示一些数据,使其看起来像是通过 USB 安装到主机 PC 的文件系统上的单个文件。我有一些函数可以在(模拟)文件中的任何请求的偏移量处生成数据。该文件是只读的,没有理由写入它;它可以有一个固定的名称和大小。
这几乎是 Chan's FatFS 和类似库的相反用例:我没有真正的文件系统,我不想访问文件系统,我只想做任何事情有必要向 USB 主机提供模拟(假)文件系统(带有单个文件)。
我认为作为大容量存储设备(例如 Mbed)出现的引导加载程序必须做类似的事情,因为当您将十六进制文件拖放到看起来像的东西上时,程序数据(可能)不会写入真实的文件系统像 Mbed 存储设备;我想它存储在某个地方,但不是在可见的实际文件系统中。
任何人都可以根据这些内容向我指出一些示例代码吗?
因为只有一个定长文件,所以不用太在意文件系统结构,在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
如果需要更多,请增加扇区数 space。
更新
我发现我的 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_Standalone
demo入手,将STM32变成SD卡reader。丢掉SD卡相关的代码,只提供前四个扇区的固定图像数据,其余的是你的文件数据。
我自己还没有尝试过,所以有些操作系统可能会卡在这个小磁盘映像上,在这种情况下,请尝试使用 mformat
.
创建标准软盘映像
我想在微控制器 (STM32L4xx) 上显示一些数据,使其看起来像是通过 USB 安装到主机 PC 的文件系统上的单个文件。我有一些函数可以在(模拟)文件中的任何请求的偏移量处生成数据。该文件是只读的,没有理由写入它;它可以有一个固定的名称和大小。
这几乎是 Chan's FatFS 和类似库的相反用例:我没有真正的文件系统,我不想访问文件系统,我只想做任何事情有必要向 USB 主机提供模拟(假)文件系统(带有单个文件)。
我认为作为大容量存储设备(例如 Mbed)出现的引导加载程序必须做类似的事情,因为当您将十六进制文件拖放到看起来像的东西上时,程序数据(可能)不会写入真实的文件系统像 Mbed 存储设备;我想它存储在某个地方,但不是在可见的实际文件系统中。
任何人都可以根据这些内容向我指出一些示例代码吗?
因为只有一个定长文件,所以不用太在意文件系统结构,在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
如果需要更多,请增加扇区数 space。
更新
我发现我的 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_Standalone
demo入手,将STM32变成SD卡reader。丢掉SD卡相关的代码,只提供前四个扇区的固定图像数据,其余的是你的文件数据。
我自己还没有尝试过,所以有些操作系统可能会卡在这个小磁盘映像上,在这种情况下,请尝试使用 mformat
.