41 #if FATFS_INC_FORMAT_SUPPORT
99 static int fatfs_erase_sectors(
struct fatfs *
fs,
uint32 lba,
int count)
106 for (i=0;i<count;i++)
107 if (!
fs->disk_io.write_media(lba + i,
fs->currentsector.sector, 1))
115 static int fatfs_create_boot_sector(
struct fatfs *
fs,
uint32 boot_sector_lba,
uint32 vol_sectors,
const char *
name,
int is_fat32)
124 fs->currentsector.sector[0] = 0xEB;
125 fs->currentsector.sector[1] = 0x3C;
126 fs->currentsector.sector[2] = 0x90;
127 fs->currentsector.sector[3] = 0x4D;
128 fs->currentsector.sector[4] = 0x53;
129 fs->currentsector.sector[5] = 0x44;
130 fs->currentsector.sector[6] = 0x4F;
131 fs->currentsector.sector[7] = 0x53;
132 fs->currentsector.sector[8] = 0x35;
133 fs->currentsector.sector[9] = 0x2E;
134 fs->currentsector.sector[10] = 0x30;
141 fs->sectors_per_cluster = fatfs_calc_cluster_size(vol_sectors, is_fat32);
142 if (!
fs->sectors_per_cluster)
146 fs->currentsector.sector[13] =
fs->sectors_per_cluster;
150 fs->reserved_sectors = 8;
152 fs->reserved_sectors = 32;
153 fs->currentsector.sector[14] = (
fs->reserved_sectors >> 0) & 0xFF;
154 fs->currentsector.sector[15] = (
fs->reserved_sectors >> 8) & 0xFF;
158 fs->currentsector.sector[16] =
fs->num_of_fats;
163 fs->root_entry_count = 512;
164 fs->currentsector.sector[17] = (
fs->root_entry_count >> 0) & 0xFF;
165 fs->currentsector.sector[18] = (
fs->root_entry_count >> 8) & 0xFF;
169 fs->root_entry_count = 0;
170 fs->currentsector.sector[17] = 0;
171 fs->currentsector.sector[18] = 0;
175 fs->currentsector.sector[19] = 0x00;
176 fs->currentsector.sector[20] = 0x00;
179 fs->currentsector.sector[21] = 0xF8;
186 total_clusters = (vol_sectors /
fs->sectors_per_cluster) + 1;
188 fs->currentsector.sector[22] = (
uint8)((
fs->fat_sectors >> 0) & 0xFF);
189 fs->currentsector.sector[23] = (
uint8)((
fs->fat_sectors >> 8) & 0xFF);
192 fs->currentsector.sector[24] = 0x00;
193 fs->currentsector.sector[25] = 0x00;
196 fs->currentsector.sector[26] = 0x00;
197 fs->currentsector.sector[27] = 0x00;
200 fs->currentsector.sector[28] = 0x20;
201 fs->currentsector.sector[29] = 0x00;
202 fs->currentsector.sector[30] = 0x00;
203 fs->currentsector.sector[31] = 0x00;
206 fs->currentsector.sector[32] = (
uint8)((vol_sectors>>0)&0xFF);
207 fs->currentsector.sector[33] = (
uint8)((vol_sectors>>8)&0xFF);
208 fs->currentsector.sector[34] = (
uint8)((vol_sectors>>16)&0xFF);
209 fs->currentsector.sector[35] = (
uint8)((vol_sectors>>24)&0xFF);
212 fs->currentsector.sector[36] = 0x00;
215 fs->currentsector.sector[37] = 0x00;
218 fs->currentsector.sector[38] = 0x29;
221 fs->currentsector.sector[39] = 0x12;
222 fs->currentsector.sector[40] = 0x34;
223 fs->currentsector.sector[41] = 0x56;
224 fs->currentsector.sector[42] = 0x78;
230 fs->currentsector.sector[i+43] =
name[i];
232 fs->currentsector.sector[i+43] =
' ';
236 fs->currentsector.sector[54] =
'F';
237 fs->currentsector.sector[55] =
'A';
238 fs->currentsector.sector[56] =
'T';
239 fs->currentsector.sector[57] =
'1';
240 fs->currentsector.sector[58] =
'6';
241 fs->currentsector.sector[59] =
' ';
242 fs->currentsector.sector[60] =
' ';
243 fs->currentsector.sector[61] =
' ';
246 fs->currentsector.sector[510] = 0x55;
247 fs->currentsector.sector[511] = 0xAA;
253 fs->currentsector.sector[22] = 0;
254 fs->currentsector.sector[23] = 0;
257 fs->currentsector.sector[24] = 0x3F;
258 fs->currentsector.sector[25] = 0x00;
261 fs->currentsector.sector[26] = 0xFF;
262 fs->currentsector.sector[27] = 0x00;
265 fs->currentsector.sector[28] = 0x00;
266 fs->currentsector.sector[29] = 0x00;
267 fs->currentsector.sector[30] = 0x00;
268 fs->currentsector.sector[31] = 0x00;
271 fs->currentsector.sector[32] = (
uint8)((vol_sectors>>0)&0xFF);
272 fs->currentsector.sector[33] = (
uint8)((vol_sectors>>8)&0xFF);
273 fs->currentsector.sector[34] = (
uint8)((vol_sectors>>16)&0xFF);
274 fs->currentsector.sector[35] = (
uint8)((vol_sectors>>24)&0xFF);
276 total_clusters = (vol_sectors /
fs->sectors_per_cluster) + 1;
280 fs->currentsector.sector[36] = (
uint8)((
fs->fat_sectors>>0)&0xFF);
281 fs->currentsector.sector[37] = (
uint8)((
fs->fat_sectors>>8)&0xFF);
282 fs->currentsector.sector[38] = (
uint8)((
fs->fat_sectors>>16)&0xFF);
283 fs->currentsector.sector[39] = (
uint8)((
fs->fat_sectors>>24)&0xFF);
286 fs->currentsector.sector[40] = 0;
287 fs->currentsector.sector[41] = 0;
290 fs->currentsector.sector[42] = 0;
291 fs->currentsector.sector[43] = 0;
294 fs->currentsector.sector[44] = (
uint8)((
fs->rootdir_first_cluster>>0)&0xFF);
295 fs->currentsector.sector[45] = (
uint8)((
fs->rootdir_first_cluster>>8)&0xFF);
296 fs->currentsector.sector[46] = (
uint8)((
fs->rootdir_first_cluster>>16)&0xFF);
297 fs->currentsector.sector[47] = (
uint8)((
fs->rootdir_first_cluster>>24)&0xFF);
300 fs->currentsector.sector[48] = (
uint8)((
fs->fs_info_sector>>0)&0xFF);
301 fs->currentsector.sector[49] = (
uint8)((
fs->fs_info_sector>>8)&0xFF);
304 fs->currentsector.sector[50] = 6;
305 fs->currentsector.sector[51] = 0;
308 fs->currentsector.sector[64] = 0x00;
311 fs->currentsector.sector[66] = 0x29;
314 fs->currentsector.sector[67] = 0x12;
315 fs->currentsector.sector[68] = 0x34;
316 fs->currentsector.sector[69] = 0x56;
317 fs->currentsector.sector[70] = 0x78;
323 fs->currentsector.sector[i+71] =
name[i];
325 fs->currentsector.sector[i+71] =
' ';
329 fs->currentsector.sector[82] =
'F';
330 fs->currentsector.sector[83] =
'A';
331 fs->currentsector.sector[84] =
'T';
332 fs->currentsector.sector[85] =
'3';
333 fs->currentsector.sector[86] =
'2';
334 fs->currentsector.sector[87] =
' ';
335 fs->currentsector.sector[88] =
' ';
336 fs->currentsector.sector[89] =
' ';
339 fs->currentsector.sector[510] = 0x55;
340 fs->currentsector.sector[511] = 0xAA;
343 if (
fs->disk_io.write_media(boot_sector_lba,
fs->currentsector.sector, 1))
351 static int fatfs_create_fsinfo_sector(
struct fatfs *
fs,
uint32 sector_lba)
357 fs->currentsector.sector[0] = 0x52;
358 fs->currentsector.sector[1] = 0x52;
359 fs->currentsector.sector[2] = 0x61;
360 fs->currentsector.sector[3] = 0x41;
363 fs->currentsector.sector[484] = 0x72;
364 fs->currentsector.sector[485] = 0x72;
365 fs->currentsector.sector[486] = 0x41;
366 fs->currentsector.sector[487] = 0x61;
369 fs->currentsector.sector[488] = 0xFF;
370 fs->currentsector.sector[489] = 0xFF;
371 fs->currentsector.sector[490] = 0xFF;
372 fs->currentsector.sector[491] = 0xFF;
375 fs->currentsector.sector[492] = 0xFF;
376 fs->currentsector.sector[493] = 0xFF;
377 fs->currentsector.sector[494] = 0xFF;
378 fs->currentsector.sector[495] = 0xFF;
381 fs->currentsector.sector[510] = 0x55;
382 fs->currentsector.sector[511] = 0xAA;
384 if (
fs->disk_io.write_media(sector_lba,
fs->currentsector.sector, 1))
392 static int fatfs_erase_fat(
struct fatfs *
fs,
int is_fat32)
412 if (!
fs->disk_io.write_media(
fs->fat_begin_lba + 0,
fs->currentsector.sector, 1))
417 for (i=1;i<
fs->fat_sectors*
fs->num_of_fats;i++)
418 if (!
fs->disk_io.write_media(
fs->fat_begin_lba + i,
fs->currentsector.sector, 1))
429 fs->currentsector.dirty = 0;
431 fs->next_free_cluster = 0;
436 if (!
fs->disk_io.read_media || !
fs->disk_io.write_media)
443 fs->fs_info_sector = 0;
444 fs->rootdir_first_cluster = 0;
449 if (!fatfs_create_boot_sector(
fs,
fs->lba_begin, volume_sectors,
name, 0))
453 fs->rootdir_first_sector =
fs->reserved_sectors + (
fs->num_of_fats *
fs->fat_sectors);
457 fs->fat_begin_lba =
fs->lba_begin +
fs->reserved_sectors;
460 fs->cluster_begin_lba =
fs->fat_begin_lba + (
fs->num_of_fats *
fs->fat_sectors);
463 if (!fatfs_erase_fat(
fs, 0))
467 if (!fatfs_erase_sectors(
fs,
fs->lba_begin +
fs->rootdir_first_sector,
fs->rootdir_sectors))
478 fs->currentsector.dirty = 0;
480 fs->next_free_cluster = 0;
485 if (!
fs->disk_io.read_media || !
fs->disk_io.write_media)
492 fs->fs_info_sector = 1;
493 fs->rootdir_first_cluster = 2;
498 if (!fatfs_create_boot_sector(
fs,
fs->lba_begin, volume_sectors,
name, 1))
502 fs->fat_begin_lba =
fs->lba_begin +
fs->reserved_sectors;
505 fs->cluster_begin_lba =
fs->fat_begin_lba + (
fs->num_of_fats *
fs->fat_sectors);
508 if (!fatfs_create_fsinfo_sector(
fs,
fs->fs_info_sector))
512 if (!fatfs_erase_fat(
fs, 1))
527 if (volume_sectors <= 4194304)