Свежие обсуждения
Микроконтроллеры

FAT16, и работа с ней

Пытаюсь написать библиотеку функций для работыс FAT16 устройствами, на базе разработок Элм Чена, но затык случается при попытке найти на просторах накопителя место расположения каталога с файлами...Может кто подскажет ?

 

Так у FAT12 и FAT16 место корневого каталога строго зафиксировано: сразу после FAT. Размер его тоже фиксирован и указан в Boot секторе (Root directory entries).
Остальные каталоги описываются также как обычные файлы и их размер может меняться.
Если необходимо могу подробно описать структуру FAT12/16.

 

И так - интерисует строго FAT16, задача вычислить адрес (в секторах) начала списка файлов корневого каталога и начало области данных по информации от PBR и MBR.

В оригинальном беруться 2 байта начиная со смещения в &0Eh в PBR, умножается на 2 и прибавляется к номеру сектора PBR и еще +1. Но на этом месте обычно одни нули.

Например у меня в ячейке &06h а PBR лежит в &20h секторе, итого &C0h, а фактически нужен аддрес &00042000h или сектор &210h

 

Здесь идет речь про MMC и фат на ней? Я подключал карту через картридер к компу и смотрел погой WinHex - всё сходилось.
Посмотрите http://piclist.ru/S-FAT-MMC-RUS/S-FAT-MMC-RUS.html и комменты от QuickWitted здесь http://pic.forum24.ru/?1-1-0-00000005-000-0-0-1198171427

 

Ну в общем там всё описано, но от себя добавлю, что не следует надеяться на абсолютные значения принятые как стандартные. Например, число сектров на кластер, по указанной ссылке определяется размером диска, но фактически может быть другим. Правильное значение надо считывать из загрузчика. Все смещения в PBR не абсолютные, а указываются относительно самого PBR.
Между FAT12 и FAT16 разница только в размере элемента таблицы FAT.

Wladimir_TS: задача вычислить адрес (в секторах) начала списка файлов корневого каталога и начало области данных
Из MBR находим начало логического диска и читаем оттуда загрузчик. Далее сектор PBR считается нулевым и все смещения отсчитываются от него.
По смещению 0Eh указано количество зарезервированных секторов. По сути это номер сектора начала FAT относительно PBR.
Количество секторов в FAT указано по смещению 16h в PBR (2 байта), а количество копий по смещению 10h.
Получается что для нахождения корневого каталога надо умножить количество копий FAT (10h) на число секторов в нём (16h) и прибавить к полученному значению число зарезервированных секторов (0Eh).
Далее находим размер корневого каталога. По смещению 11h в PBR (2 байта) указано количество записей в корневом каталоге. Размер каждой записи 32 байта, следовательно количество секторов получим делением заначения по смещению 11h на 16. (Если быть совсем правильным, то надо умножить на 32 и разделить на размер сектора (2 байта по смещению 0Bh)).
Т.е. смещение области данных найдём прибавляя к вычисленному ранее адресу корневого каталога его размер ({11h}/16).
Область данных начинается сразу со второго кластера (первого не существует). Нулевая и первая ячейки таблицы FAT используются для записи идентификатора типа диска.

 

Я посчитал так Сектор(PBR)+(0Eh)+(16h)*2=адрес начала каталога, а еще +((11h)+15)/16

Удается читать файлы из корневого каталога и длиной не более сектора. Разбираюсь дальше.

Спасибо за информацию. Сделаю чтение еще и из ячейки 10h