Поскольку существует только один файл фиксированной длины, вам не нужно сильно беспокоиться о структуре файловой системы, но создайте его один раз на ПК и рассматривайте как фиксированный заголовок. Устройство вообще не нуждается в коде FatFS. Файл в пустой файловой системе FAT в противном случае будет храниться непрерывно от первого свободного сектора и далее.
Сначала давайте создадим минимальный образ файловой системы FAT, например, используя пакет mtools в linux.
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 МБ.
$ 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 вы можете начать с демонстрации Applications/USB_Device/MSC_Standalone
в STM32CubeL4, котораяпревращает STM32 в устройство чтения карт SD. Выбросьте код, связанный с SD-картой, и просто предоставьте данные фиксированного изображения для первых четырех секторов и данные вашего файла для остальных.
Я сам не пробовал, поэтому возможно, что некоторые операционные системызахлестнет этот крошечный образ диска, в этом случае попробуйте создать стандартный образ дискеты с mformat
.