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)