53 #define PRINTF(...) printf(__VA_ARGS__)
62 #define FAT_ERASE_DIV 2
69 static uint8_t mkfs_calc_cluster_size(uint16_t sec_size, uint16_t bytes);
70 static uint16_t mkfs_determine_fat_type_and_SPC(uint32_t total_sec_count, uint16_t bytes_per_sec);
71 static uint32_t mkfs_compute_fat_size(
struct FAT_Info *fi);
80 PRINTF(
"\nWriting boot sector ... ");
82 memset(buffer, 0, 512);
83 ret = mkfs_write_boot_sector(buffer, dev, &fi);
86 PRINTF(
"Error(%d).", ret);
92 PRINTF(
"\nWriting FATs ... ");
93 mkfs_write_fats(buffer, dev, &fi);
95 if (fi.type == FAT32) {
96 PRINTF(
"done.\nWriting FSINFO ... ");
97 mkfs_write_fsinfo(buffer, dev, &fi);
101 PRINTF(
"Writing root directory ... ");
102 mkfs_write_root_directory(buffer, dev, &fi);
116 mkfs_calc_cluster_size(uint16_t sec_size, uint16_t bytes)
118 uint8_t SecPerCluster = 0;
120 SecPerCluster = (uint8_t) (bytes / sec_size);
122 if (SecPerCluster == 0) {
130 if (SecPerCluster > 128 || SecPerCluster * sec_size > 32 * ((uint32_t) 1024)) {
134 return SecPerCluster;
149 mkfs_determine_fat_type_and_SPC(uint32_t total_sec_count, uint16_t bytes_per_sec)
151 uint64_t vol_size = (total_sec_count * bytes_per_sec) / 512;
153 if (vol_size < ((uint32_t) 8400)) {
154 return (FAT16 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 512);
155 }
else if (vol_size < 32680) {
156 return (FAT16 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 1024);
157 }
else if (vol_size < 262144) {
158 return (FAT16 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 2048);
159 }
else if (vol_size < 524288) {
160 return (FAT16 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 4096);
161 }
else if (vol_size < 1048576) {
162 return (FAT16 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 8192);
163 }
else if (vol_size < 2097152) {
164 return (FAT16 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 16384);
165 }
else if (vol_size < 4194304L) {
166 return (FAT32 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 2048);
169 if (vol_size < 16777216) {
170 return (FAT32 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 4096);
171 }
else if (vol_size < 33554432) {
172 return (FAT32 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 8192);
173 }
else if (vol_size < 67108864) {
174 return (FAT32 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 16384);
175 }
else if (vol_size < 0xFFFFFFFF) {
176 return (FAT32 << 8) +mkfs_calc_cluster_size(bytes_per_sec, 32768);
178 return (FAT_INVALID << 8) + 0;
189 mkfs_compute_fat_size(
struct FAT_Info *fi)
193 uint32_t TmpVal1 = fi->BPB_TotSec - (fi->BPB_RsvdSecCnt + RootDirSectors);
194 uint32_t TmpVal2 = (256UL * fi->BPB_SecPerClus) + fi->BPB_NumFATs;
196 if (fi->type == FAT32) {
200 FATSz = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2;
202 PRINTF(
"\nFat size: %ld", FATSz);
211 uint8_t sectors_per_cluster = (uint8_t) type_SPC;
214 fi->type = (uint8_t) (type_SPC >> 8);
216 PRINTF(
"\nA: SPC = %u; type = %u; dev->num_sectors = %lu", sectors_per_cluster, fi->type, dev->
num_sectors);
217 if (fi->type == FAT12 || fi->type == FAT_INVALID) {
222 buffer[0x000] = 0x00;
223 buffer[0x001] = 0x00;
224 buffer[0x002] = 0x00;
227 memcpy(&(buffer[0x03]),
"cfs-mkfs", 8);
235 buffer[0x00D] = sectors_per_cluster;
236 fi->BPB_SecPerClus = sectors_per_cluster;
239 if (fi->type == FAT16) {
242 fi->BPB_RsvdSecCnt = 1;
243 }
else if (fi->type == FAT32) {
246 fi->BPB_RsvdSecCnt = 32;
254 if (fi->type == FAT16) {
255 buffer[0x011] = (uint8_t) 512;
256 buffer[0x012] = (uint8_t) (512 >> 8);
257 fi->BPB_RootEntCnt = 512;
258 }
else if (fi->type == FAT32) {
261 fi->BPB_RootEntCnt = 0;
275 buffer[0x015] = 0xF8;
276 fi->BPB_Media = 0xF8;
279 fi->
BPB_FATSz = mkfs_compute_fat_size(fi);
281 if (fi->type == FAT16 && fi->
BPB_FATSz < 0x10000) {
283 buffer[0x017] = (uint8_t) (fi->
BPB_FATSz >> 8);
284 }
else if (fi->type == FAT16) {
314 buffer[0x020] = (uint8_t) fi->BPB_TotSec;
315 buffer[0x021] = (uint8_t) (fi->BPB_TotSec >> 8);
316 buffer[0x022] = (uint8_t) (fi->BPB_TotSec >> 16);
317 buffer[0x023] = (uint8_t) (fi->BPB_TotSec >> 24);
320 if (fi->type == FAT16) {
322 buffer[0x024] = 0x80;
328 buffer[0x026] = 0x29;
337 memcpy(&(buffer[0x02B]),
"NO NAME ", 11);
340 memcpy(&(buffer[0x036]),
"FAT16 ", 8);
341 }
else if (fi->type == FAT32) {
344 buffer[0x025] = (uint8_t) (fi->
BPB_FATSz >> 8);
345 buffer[0x026] = (uint8_t) (fi->
BPB_FATSz >> 16);
346 buffer[0x027] = (uint8_t) (fi->
BPB_FATSz >> 24);
368 buffer[0x032] = 0x00;
369 buffer[0x033] = 0x00;
372 memset(&(buffer[0x034]), 0, 12);
375 buffer[0x040] = 0x80;
381 buffer[0x042] = 0x29;
390 memcpy(&(buffer[0x047]),
"NO NAME ", 11);
393 memcpy(&(buffer[0x052]),
"FAT32 ", 8);
397 buffer[0x1FE] = 0x55;
398 buffer[0x1FF] = 0xAA;
414 uint32_t *fat32_buf = (uint32_t *) buffer;
415 uint16_t *fat16_buf = (uint16_t *) buffer;
421 memset(buffer, 0x00, 512);
422 if (fi->type == FAT32) {
424 fat32_buf[0] = 0x0FFFFF00 + fi->BPB_Media;
426 fat32_buf[1] = 0x0FFFFFFF;
428 fat32_buf[2] = 0x0FFFFFF8;
431 fat16_buf[0] = 0xFF00 + fi->BPB_Media;
433 fat16_buf[1] = 0xFFF8;
440 for (j = 1; j < fi->BPB_NumFATs; ++j) {
446 memset(buffer, 0x00, 12);
450 for (i = 1; i < fi->
BPB_FATSz / FAT_ERASE_DIV; ++i) {
459 for (j = 1; j < fi->BPB_NumFATs; ++j) {
470 uint32_t fsi_free_count = 0;
471 uint32_t fsi_nxt_free = 0;
473 memset(buffer, 0, 512);
489 fsi_free_count = (fi->BPB_TotSec - ((fi->
BPB_FATSz * fi->BPB_NumFATs) + fi->BPB_RsvdSecCnt)) / fi->BPB_SecPerClus;
490 buffer[488] = (uint8_t) fsi_free_count;
491 buffer[489] = (uint8_t) (fsi_free_count >> 8);
492 buffer[490] = (uint8_t) (fsi_free_count >> 16);
493 buffer[491] = (uint8_t) (fsi_free_count >> 24);
496 fsi_nxt_free = (fi->BPB_RsvdSecCnt + (fi->BPB_NumFATs * fi->
BPB_FATSz));
497 if (fsi_nxt_free % fi->BPB_SecPerClus) {
498 fsi_nxt_free = (fsi_nxt_free / fi->BPB_SecPerClus) + 1;
500 fsi_nxt_free = (fsi_nxt_free / fi->BPB_SecPerClus);
502 buffer[492] = (uint8_t) fsi_nxt_free;
503 buffer[493] = (uint8_t) (fsi_nxt_free >> 8);
504 buffer[494] = (uint8_t) (fsi_nxt_free >> 16);
505 buffer[495] = (uint8_t) (fsi_nxt_free >> 24);
523 uint32_t firstDataSector = fi->BPB_RsvdSecCnt + (fi->BPB_NumFATs * fi->
BPB_FATSz);
524 memset(buffer, 0x00, 512);
527 for (i = 0; i < fi->BPB_SecPerClus; i++) {