📄 fat.c
字号:
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
* - Single partition
* - Cluster size is 4 or 8 Kbytes
* - Sector size is 512 bytes
* - 2 fats management
* - 512 entries in the root directory
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void FormatFAT16(void)
{
unsigned int i, j, *pBuf;
unsigned long int nb_total_sectors;
unsigned int nb_sector_fat;
//may is global val
unsigned int fat_cluster_size;
unsigned int fat_is_fat16;
//s_format *tab;
NF_EraseAllBlock(); //Nf_Format Command
// return;
// tab = Hard_format();
pBuf=g_RWBuf;
fat_cluster_size = FORMAT_NB_SECTOR_PER_CLUSTER;
nb_total_sectors = (unsigned long int)FORMAT_NB_CYLINDER * FORMAT_NB_HEAD * FORMAT_NB_SECTOR;
/* FAT type caculation */
fat_is_fat16 = ((nb_total_sectors / fat_cluster_size) > MAX_CLUSTERS12);
// fat_is_fat16=1;//debug
/* -- MASTER BOOT RECORD -- */
for (i = 0; i < 446; i++) /* Boot Code */
{
*pBuf++ = 0x00;
}
/* First Partition entry */
*pBuf++ = 0x80; /* Default Boot Partition */
*pBuf++ = (FORMAT_NB_HIDDEN_SECTOR / FORMAT_NB_SECTOR); /* Start head */
*pBuf++ = (FORMAT_NB_HIDDEN_SECTOR % FORMAT_NB_SECTOR) + 1; /* Start Sector */
*pBuf++ = 0x00; /* Start Cylinder */
if (fat_is_fat16)
{
if (nb_total_sectors > 0xFFFF) /* Total Sectors */
{
*pBuf++ = (FAT16_SUP32M); /* FAT16 > 32 Mbytes */
}
else
{
*pBuf++ = (FAT16_INF32M); /* FAT16 < 32 Mbytes */
}
}
else
{
*pBuf++ = (FAT12); /* FAT12 */
}//end if(fat_is_fat16)
*pBuf++ = (FORMAT_NB_HEAD - 1); /* Endhead-Zero-based(0) head number */
*pBuf++ = ((((FORMAT_NB_CYLINDER - 1) / 0x04) & 0xC0) + FORMAT_NB_SECTOR);
/* EndSector-Zero-based(1) sector number */
*pBuf++ = ((FORMAT_NB_CYLINDER - 1) & 0xFF); /* EndCylinder */
*pBuf++ = (FORMAT_NB_HIDDEN_SECTOR); /* Start sector */
*pBuf++ = 0x00;
*pBuf++ = 0x00;
*pBuf++ = 0x00;
*pBuf++ =((nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR));
*pBuf++ =((nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR)>>8);
*pBuf++ =((nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR)>>16);
*pBuf++ =((nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR)>>24);
/* Second Partition entry */
for(i=0; i<16; i++)
*pBuf++ = 0x00;
/* Third Partition entry */
for(i=0; i<16; i++)
*pBuf++ = 0x00;
/* Fourth Partition entry */
for(i=0; i<16; i++)
*pBuf++ = 0x00;
*pBuf++ = 0x55; /* Signature Word */
*pBuf++ = 0xAA;
NF_PageProgram(0x0000,(MBR_ADDR>>9), g_RWBuf);
pBuf=g_RWBuf;
/* -- HIDDEN SECTORS -- FORMAT_NB_HIDDEN_SECTOR */
for (j=1; j<FORMAT_NB_HIDDEN_SECTOR ; j++)
{
for (i = (SECTOR_SIZE); i != 0; i--)
{
*pBuf++ = 0x0000;
}
NF_PageProgram(0x0000,j, g_RWBuf);
pBuf=g_RWBuf;
}
/* -- PARTITION BOOT RECORD -- */
*pBuf++ = 0xEB; /* JMP inst to PBR boot code */
*pBuf++ = 0x3C;
*pBuf++ = 0x90;
*pBuf++ = 'O'; /* OEM name */
*pBuf++ = 'E';
*pBuf++ = 'M';
*pBuf++ = ' ';
*pBuf++ = 'N';
*pBuf++ = 'A';
*pBuf++ = 'M';
*pBuf++ = 'E';
*pBuf++ = (SECTOR_SIZE); /* number of bytes per sector */
*pBuf++ = (SECTOR_SIZE >> 8);
*pBuf++ = (fat_cluster_size); /* Number of sector per cluster */
*pBuf++ = (NB_RESERVED); /* number of reserved sector */
*pBuf++ = (NB_RESERVED >> 8);
*pBuf++ = (NB_FATS); /* Number of FAT */
*pBuf++ = (NB_ROOT_ENTRY); /* number of root directory entries */
*pBuf++ = (NB_ROOT_ENTRY >> 8);
if (nb_total_sectors > 0xFFFF) /* Total Sectors */
{
*pBuf++ = 0x00;
*pBuf++ = 0x00;
}
else
{
*pBuf++ = (nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR);
*pBuf++ = ((nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR) >> 8);
}
*pBuf++ = HARD_DISK; /* Media Byte */
/* Number of sector in each FAT */
if (fat_is_fat16)
nb_sector_fat = (((nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR) / fat_cluster_size) * 2 / SECTOR_SIZE) + 1;
else
nb_sector_fat = (((nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR) / fat_cluster_size) * 3 / 1024) + 1;
*pBuf++ = (nb_sector_fat);
*pBuf++ = (nb_sector_fat >> 8);
*pBuf++ = (FORMAT_NB_SECTOR); /* Number of sectors on a track */
*pBuf++ = (FORMAT_NB_SECTOR >> 8);
*pBuf++ = (FORMAT_NB_HEAD); /* Number of heads */
*pBuf++ = (FORMAT_NB_HEAD >> 8);
*pBuf++ = (FORMAT_NB_HIDDEN_SECTOR); /* Number of hidden sectors */
*pBuf++ = (FORMAT_NB_HIDDEN_SECTOR >> 8);
*pBuf++ = (FORMAT_NB_HIDDEN_SECTOR >> 16);
*pBuf++ = (FORMAT_NB_HIDDEN_SECTOR >> 24);
if (nb_total_sectors > 0xFFFF)
{ /* number of sectors > 65535 */
*pBuf++ = (nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR);
*pBuf++ = (nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR) >> 8;
*pBuf++ = (nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR) >> 16;
*pBuf++ = (nb_total_sectors - FORMAT_NB_HIDDEN_SECTOR) >> 24;
}
else
{ /* number of sectors < 65535 */
*pBuf++ = 0x00;
*pBuf++ = 0x00;
*pBuf++ = 0x00;
*pBuf++ = 0x00;
}
*pBuf++ = FAT_DRIVE_NUMBER; /* Driver number */
*pBuf++ = 0x00; /* not used */
*pBuf++ = FAT_EXT_SIGN; /* extended boot signature */
*pBuf++ = 0x00; /* volume ID */
*pBuf++ = 0x00;
*pBuf++ = 0x00;
*pBuf++ = 0x00;
*pBuf++ = 'N'; /* Volume Label */
*pBuf++ = 'O';
*pBuf++ = ' ';
*pBuf++ = 'N';
*pBuf++ = 'A';
*pBuf++ = 'M';
*pBuf++ = 'E';
*pBuf++ = ' ';
*pBuf++ = ' ';
*pBuf++ = ' ';
*pBuf++ = ' ';
*pBuf++ = 'F'; /* File System Type in ASCII */
*pBuf++ = 'A';
*pBuf++ = 'T';
*pBuf++ = '1';
if (fat_is_fat16)
{
*pBuf++ = '6';
}
else
{
*pBuf++ = '2';
}
*pBuf++ = ' ';
*pBuf++ = ' ';
*pBuf++ = ' ';
for (i = 448; i != 0; i--) /* Boot Code */
{
*pBuf++ = 0x00;
}
*pBuf++ = 0x55; /* Signature word */
*pBuf++ = 0xAA;
NF_PageProgram(0x0000,(DBR_ADDR>>9),g_RWBuf);//DBR_ADDR
pBuf=g_RWBuf;
/* -- FATS -- */
/* -- FAT 1 -- */
*pBuf++ = 0xF8; /* reserved clusters 0 & 1 */
*pBuf++ = 0xFF;
*pBuf++ = 0xFF;
if (fat_is_fat16)
{ /* FAT16 */
*pBuf++ = 0xFF;
}
else
{ /* FAT12 */
*pBuf++ = 0x00;
}
/* free clusters in first FAT sector */
for (i = (SECTOR_SIZE - 4) / 2; i != 0; i--)
{
*pBuf++ = 0x00;
*pBuf++ = 0x00;
}
NF_PageProgram(0x0000,(FAT1_ADDR>>9), g_RWBuf);
pBuf=g_RWBuf;
/* free clusters in other FAT sectors */
for (j=1; j<nb_sector_fat; j ++)
{
for (i = SECTOR_SIZE ; i != 0; i--)
{
*pBuf++ = 0x00;
}
NF_PageProgram(0x0000,(FAT1_ADDR>>9)+j, g_RWBuf);
pBuf=g_RWBuf;
}
/* -- FAT 2 -- */
*pBuf++ = 0xF8; /* reserved clusters 0 & 1 */
*pBuf++ = 0xFF;
*pBuf++ = 0xFF;
if (fat_is_fat16)
{ /* FAT16 */
*pBuf++ = 0xFF;
}
else
{ /* FAT12 */
*pBuf++ = 0x00;
}
/* free clusters in first FAT sector */
for (i = (SECTOR_SIZE - 4) / 2; i != 0; i--)
{
*pBuf++ = 0x00;
*pBuf++ = 0x00;
}
NF_PageProgram(0x0000,FAT2_ADDR>>9,g_RWBuf);
pBuf=g_RWBuf;
/* free clusters in other FAT sectors */
for (j=1; j< nb_sector_fat; j++)
{
for (i = SECTOR_SIZE; i != 0; i--)
{
*pBuf++ = 0x00;
}
NF_PageProgram(0x0000,(FAT2_ADDR>>9)+j, g_RWBuf);
pBuf=g_RWBuf;
}
/* -- ROOT DIRECTORY ENTRIES -- */
for (j=0; j<DIR_SIZE; j++)
{
for (i=0; i<NB_ROOT_ENTRY; i++)
{
*pBuf++ = 0x00;
}
NF_PageProgram(0x0000,(ROOT_DIR_ADDR>>9)+j, g_RWBuf);
pBuf=g_RWBuf;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -