Как эмулировать FatFS? - PullRequest
       54

Как эмулировать FatFS?

2 голосов
/ 30 сентября 2019

Я хотел бы представить некоторые данные на микроконтроллере (STM32L4xx), чтобы они выглядели так, как если бы это был один файл в файловой системе, смонтированный через USB на главном ПК. У меня есть функции, которые могут производить данные с любым запрошенным смещением в (эмулированном) файле. Файл может быть только для чтения, нет оснований для записи в него;и он может иметь фиксированное имя и размер.

Это в значительной степени противоположный случай использования Чана FatFS и подобных библиотек: у меня нет настоящей файловой системы, и я нея не хочу получать доступ к файловой системе, я просто хочу сделать все необходимое, чтобы представить эмулированную (поддельную) файловую систему (с одним файлом) на USB-хосте.

Я думаю, что загрузчики выглядят как запоминающее устройство(например, Mbed) должен делать нечто подобное, поскольку данные программы (вероятно) не записываются в настоящую файловую систему, когда вы перетаскиваете шестнадцатеричный файл на то, что выглядит как устройство хранения Mbed;Я полагаю, что он хранится где-то, но не в реальной файловой системе, как видимая.

Может ли кто-нибудь указать мне пример кода по этим строкам?

1 Ответ

3 голосов
/ 30 сентября 2019

Поскольку существует только один файл фиксированной длины, вам не нужно сильно беспокоиться о структуре файловой системы, но создайте его один раз на ПК и рассматривайте как фиксированный заголовок. Устройство вообще не нуждается в коде 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.

...