Спокойно. Во-первых, похоже что `2' в коде - не константа, а root_cluster. Далее, хм, чем больше читаю, тем больше кажется что смешались в кучу кластеры и сектора. Мде, до этого момента статья довольно чётко была написана.
Собственно, сегодня ковырял
https://raw.githubusercontent.com/jncro ... ster/fat.c , нашёл там одну ошибку, сверился со статьёй, поправил ошибку в локальной копии и дальше всё заработало.
Код:
uint32_t get_sector(struct fat_fs *fs, uint32_t rel_cluster)
{
#ifdef FAT_DEBUG
printf("FAT: get_sector rel_cluster %i, sector %i\n",
rel_cluster,
fs->first_non_root_sector + (rel_cluster - 2) * fs->sectors_per_cluster);
#endif
rel_cluster -= 2;
return fs->first_non_root_sector + rel_cluster * fs->sectors_per_cluster;
}
Где для FAT32:
Код:
ret->first_data_sector = bs->reserved_sector_count + (bs->table_count *
bs->ext.fat32.table_size_32);
ret->first_fat_sector = bs->reserved_sector_count;
ret->first_non_root_sector = ret->first_data_sector;
ret->sectors_per_fat = bs->ext.fat32.table_size_32;
А для 12/16:
Код:
ret->first_data_sector = bs->reserved_sector_count + (bs->table_count *
bs->table_size_16);
ret->first_fat_sector = bs->reserved_sector_count;
ret->sectors_per_fat = bs->table_size_16;
ret->first_non_root_sector = ret->first_data_sector + ret->root_dir_sectors;
ret->root_dir_cluster = 2;