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

📄 fat.c

📁 mp3播放器
💻 C
📖 第 1 页 / 共 4 页
字号:
        if((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute != 0x0F)
          &&((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute & ARCHIVE_DIR) != ARCHIVE_DIR))
	    {
		  if((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[0] == (S8)'M')
		    &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[1] == (S8)'P')
		    &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[2] == (S8)'3')
		    &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] != (S8)DIR_Unused)
		    &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] != (S8)DIR_Deleted))
		  {
		    ENDIAN_ASSIGN_4(&FileData.dwFileDataSize,&((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileSize);
			FileData.dwFileStartCluNo = CFatData.dwMask &((U32)LE16(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FSClusLO));
            FileData.dwFileStartCluNo += CFatData.dwMask &(((U32)LE16(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FSClusHI)) << 16);
            ReadFileFAT();
            return OK;
		  }
		  else
		  {
		    FileData.wCurFDBNo--;
		    if((FileData.wCurFDBNo & 0x0F)== 0x0F)
		      flag = 0;
			if((FileData.dwCurCluNo == varAl.TmpLong)&&(FileData.wCurFDBNo == varAl.TmpShort))
			  return KO;
		  }
	    }
		else
		{
		  FileData.wCurFDBNo--;
		  if((FileData.wCurFDBNo & 0x0F)== 0x0F)
		    flag = 0;
		  if((FileData.dwCurCluNo == varAl.TmpLong)&&(FileData.wCurFDBNo == varAl.TmpShort))
			return KO;
		}
	  }
      FileData.wCurFDBNo = (U16)CFatData.bSectorsPerClu * CFatData.wBytesPerSec / DIREntrySize - 1;
	  if(FileData.dwCurCluNo)
	    FileData.dwCurCluNo--;
	  else
	    FileData.dwCurCluNo = FileData.RootDirNum - 1;
	}
  }
  else
  {
    //FAT16
	varAl.TmpShort = FileData.wCurFDBNo;
    if(--FileData.wCurFDBNo >= (U16)FileData.RootDirNum)
	  FileData.wCurFDBNo = (U16)FileData.RootDirNum - 1;
	for(;FileData.wCurFDBNo != varAl.TmpShort;)
	{
	  if(!flag)
	  {
	    DMA_load_sector(CFatData.dwRootStartlba +(FileData.wCurFDBNo / CFatData.bFDBNumInSec),0x05);
		flag = 1;
	  }
	  if((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute != 0x0F)
	    &&((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute & ARCHIVE_DIR) != ARCHIVE_DIR))
	  {
	    if((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[0] == (S8)'M')
		  &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[1] == (S8)'P')
		  &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[2] == (S8)'3')
		  &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] != (S8)DIR_Unused)
		  &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] != (S8)DIR_Deleted))
		{
		  //varAl.WAVE_Flg = 0;
		  ENDIAN_ASSIGN_4(&FileData.dwFileDataSize,&((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileSize);
		  FileData.dwFileStartCluNo = CFatData.dwMask &((U32)LE16(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FSClusLO));

		  ReadFileFAT();
		  return OK;
		}
		/*else if((((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[0] == 'W')
		       &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[1] == 'A')
		       &&(((_DIR *)(sbuf1 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[2] == 'V'))
		{
		  //CFatData.fRet = FATERR_NO_ERROR;
		  if( FileData.wCurFDBNo >= FileData.RootDirNum)
		    FileData.wCurFDBNo = FileData.RootDirNum - 1;
		  varAl.WAVE_Flg = 1;
		  return(1);
		}*/
		else
		{
		  if( --FileData.wCurFDBNo >= (U16)FileData.RootDirNum)
		    FileData.wCurFDBNo = (U16)FileData.RootDirNum - 1;
		  if((FileData.wCurFDBNo & 0x0F) == 0x0F)
		    flag = 0;
		}
	  }
	  else
	  {
		if( --FileData.wCurFDBNo >= (U16)FileData.RootDirNum)
		  FileData.wCurFDBNo = (U16)FileData.RootDirNum - 1;
		if((FileData.wCurFDBNo & 0x0F) == 0x0F)
		  flag = 0;
	  }
    }
	//CFatData.fRet = FATERR_NO_FILE;
	return KO;
  }
}
/************************************************
函 数 名: ReadRootCluster()
功    能:读FAT32根目录簇链表
说    明:
调    用:
全局变量:
入口参数:无
出口参数:无
返 回 值:
************************************************/
void ReadRootCluster(void)
{
  bit flag = 0;
  U8 index = 0;
  U32 p;
  //U32 p1;

  FileData.RootDirNum = 1;
  rootclusters[index].cluster = CFatData.dwRootStartCluNo;
  rootclusters[index].number = 1; 

  /*FATTab.dwCurCluNo*/varAl.TmpLong = CFatData.dwRootStartCluNo;

  while(1)
  {
    if(!flag)
	{
      /*FileData.Temp*/p = (/*FATTab.dwCurCluNo*/varAl.TmpLong << FATTab.bShiftBits)/ (U32)CFatData.wBytesPerSec;
      /*FileData.Temp*/p += CFatData.dwFatTabStartlba;
      DMA_load_sector(/*FileData.Temp*/p, 0x05);
	  flag = 1;
	}
	p = CharToLong((U8 xdata *)(0xE000 + ((U16)(/*FATTab.dwCurCluNo*/varAl.TmpLong << FATTab.bShiftBits) & (U16)0x01FF))) & CFatData.dwMask;
	if(p == CFatData.dwMask)
	  break;
    if(p == /*FATTab.dwCurCluNo*/varAl.TmpLong + 1)
	{
	  rootclusters[index].number++;
	  FileData.RootDirNum++;
	}
	else
	{
	  index++;
	  if(index >= MAX_FILE_FRAGMENT_NUMBER)
	    break;
	  rootclusters[index].cluster = p;
      rootclusters[index].number = 1;
	  FileData.RootDirNum++;
	}

	if((p & (~(((U32)CFatData.wBytesPerSec >> FATTab.bShiftBits) - 1)))
      != (/*FATTab.dwCurCluNo*/varAl.TmpLong & (~(((U32)CFatData.wBytesPerSec >> FATTab.bShiftBits) - 1))))
	  flag = 0;
    /*FATTab.dwCurCluNo*/varAl.TmpLong = p;
  }
}
/************************************************
函 数 名: ReadFileFAT()
功    能:读文件簇链表
说    明:
调    用:
全局变量:
入口参数:无
出口参数:无
返 回 值:
************************************************/
void ReadFileFAT(void)
{
  bit flag = 0;
  U8 index = 0;
  U32 p;
//  U32 p1;

  fclusters[index].cluster = FileData.dwFileStartCluNo;
  fclusters[index].number = 1; 

  /*FATTab.dwCurCluNo*/varAl.TmpLong = FileData.dwFileStartCluNo;

  while(1)
  {
    if(!flag)
	{
      /*FileData.Temp*/p = (/*FATTab.dwCurCluNo*/varAl.TmpLong << FATTab.bShiftBits)/ (U32)CFatData.wBytesPerSec;
      /*FileData.Temp*/p += CFatData.dwFatTabStartlba;
      DMA_load_sector(/*FileData.Temp*/p, 0x05);
	  flag = 1;
	}
	p = CharToLong((U8 xdata *)(0xE000 + ((U16)(/*FATTab.dwCurCluNo*/varAl.TmpLong << FATTab.bShiftBits) & (U16)0x01FF))) & CFatData.dwMask;
	if(p == CFatData.dwMask)
	  break;
    if(p == /*FATTab.dwCurCluNo*/varAl.TmpLong + 1)
	  fclusters[index].number++;
	else
	{
	  index++;
	  if(index >= MAX_FILE_FRAGMENT_NUMBER)
	    break;
	  fclusters[index].cluster = p;
      fclusters[index].number = 1;
	}

	if((p & (~(((U32)CFatData.wBytesPerSec >> FATTab.bShiftBits) - 1)))
      != (/*FATTab.dwCurCluNo*/varAl.TmpLong & (~(((U32)CFatData.wBytesPerSec >> FATTab.bShiftBits) - 1))))
	  flag = 0;
    /*FATTab.dwCurCluNo*/varAl.TmpLong = p;
  }
}
/************************************************
函 数 名: ReadSector()
功    能:
说    明:
调    用:
全局变量:
入口参数:无
出口参数:无
返 回 值:
************************************************/
void ReadSector(U32 logic_position,U8 DMA_CS)
{
  U8 index;
  U32 p;
  /*if(CFatData.fFAT32)
  {
    //FAT32
#if TX_DEBUG
	//SendChar(0xC2);
#endif

  }
  else*/
  {
    //FAT16
	/*FileData.Temp*/p = logic_position % CFatData.bSectorsPerClu;
    logic_position /= CFatData.bSectorsPerClu;

	for(index = 0; index  < MAX_FILE_FRAGMENT_NUMBER; index++)
	{
	  if(logic_position < fclusters[index].number)
	  {
	    logic_position = fclusters[index].cluster + logic_position;
		break;
	  }
	  else
	  {
	    logic_position -= fclusters[index].number;
	  }
	}

	logic_position = CFatData.dwClu2Startlba + (logic_position - 2)* (U32)CFatData.bSectorsPerClu + /*FileData.Temp*/p;
	if(!DMA_load_sector(logic_position, DMA_CS))
	  DMA_load_sector(logic_position, DMA_CS);
  }
}
/************************************************
函 数 名: CreateFile()
功    能:
说    明:
调    用:
全局变量:
入口参数:无
出口参数:无
返 回 值:
************************************************/
#if TX_DEBUG
void CreateFile(void)
{
  bit flag = 0;
  U8 index;
  U32 p;
  U32 position;

  //在根目录中搜索是否已存在该文件夹
  if(CFatData.fFAT32)
  {
    //FAT32
	FileData.dwCurCluNo = 0;
    FileData.wCurFDBNo = 0;
    for(;FileData.dwCurCluNo < FileData.RootDirNum;)
	{
      p = FileData.dwCurCluNo;
	  for(index = 0; index  < MAX_FILE_FRAGMENT_NUMBER; index++)
	  {
	    if(p < rootclusters[index].number)
	    {
	      p = rootclusters[index].cluster + p;
	      break;
		}
		else
		{
		  p -= rootclusters[index].number;
		}
	  }
	  p = CFatData.dwClu2Startlba + (p - 2)* (U32)CFatData.bSectorsPerClu;
      
	  for(;FileData.wCurFDBNo < (U16)CFatData.bSectorsPerClu * CFatData.wBytesPerSec / DIREntrySize;)
	  {
		if(!flag)
		{
		  DMA_load_sector(p + FileData.wCurFDBNo * DIREntrySize / CFatData.wBytesPerSec, 0x06);
          flag = 1;
		}
        if((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute != 0x0F)
          &&((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute & ARCHIVE_DIR) == ARCHIVE_DIR))
	    {
		  if((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[0] == (S8)' ')
		    &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[1] == (S8)' ')
		    &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Extension[2] == (S8)' ')
		    &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] == (S8)'F')
		    &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[1] == (S8)'J')
			&&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[2] == (S8)' ')
            &&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[3] == (S8)' ')
			&&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[4] == (S8)' ')
			&&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[5] == (S8)' ')
			&&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[6] == (S8)' ')
			&&(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[7] == (S8)' '))
		  {
		    SendChar(0xB5);
            return;
		  }
		  else
		  {
		    FileData.wCurFDBNo++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -