⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.c

📁 该软件为在sunplus的61单片机上实现的mp3播放器.里面有完整的源代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
*----------------------------------------------------------------------------
* 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 + -