📄 fat.c
字号:
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 + -