📄 fat.c
字号:
if(!(FileData.wCurFDBNo & 0x0F))
flag = 0;
}
}
else
{
FileData.wCurFDBNo++;
if(!(FileData.wCurFDBNo & 0x0F))
flag = 0;
}
}
FileData.wCurFDBNo = 0;
FileData.dwCurCluNo++;
}
//return KO;
}
else
{
//FAT16
FileData.wCurFDBNo = 0;
for(;FileData.wCurFDBNo < (U16)FileData.RootDirNum;)
{
if(!flag)
{
DMA_load_sector(CFatData.dwRootStartlba + (FileData.wCurFDBNo / CFatData.bFDBNumInSec), 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(0xB6);
return;
}
else
{
FileData.wCurFDBNo++;
if(!(FileData.wCurFDBNo & 0x0F))
flag = 0;
}
}
else
{
FileData.wCurFDBNo++;
if(!(FileData.wCurFDBNo & 0x0F))
flag = 0;
}
}
}
SendChar(0xB7);
//在FAT中搜索未分配的簇
varAl.TmpLong = 2;
flag = 0;
for(;;)
{
if(!flag)
{
p = (varAl.TmpLong << FATTab.bShiftBits)/ (U32)CFatData.wBytesPerSec;
p += CFatData.dwFatTabStartlba;
position = p;
DMA_load_sector(p, 0x06);
flag = 1;
}
p = CharToLong((U8 xdata *)(0xF000 +((U16)(varAl.TmpLong << FATTab.bShiftBits)&(U16)0x01FF)))& CFatData.dwMask;
if(!p)
{
if(CFatData.fFAT32)
LongToChar((U8 xdata *)(0xF000 +((U16)(varAl.TmpLong << FATTab.bShiftBits)&(U16)0x01FF)), CFatData.dwMask);
else
IntToChar((U8 xdata *)(0xF000 +((U16)(varAl.TmpLong << FATTab.bShiftBits)&(U16)0x01FF)), CFatData.dwMask);
DMA_write_sector(position, 0x06);
break;
}
else
{
varAl.TmpLong++;
if(varAl.TmpLong > (0xFFFFFFFE & CFatData.dwMask))
{
SendChar(0xA5);
return;
}
else
{
if(!((U16)(varAl.TmpLong << FATTab.bShiftBits)&(U16)0x01FF))
flag = 0;
}
}
}
SendChar(0xA6);
//在根目录中创建新的文件夹
flag = 0;
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)
{
position = p + FileData.wCurFDBNo * DIREntrySize / CFatData.wBytesPerSec;
DMA_load_sector(position, 0x06);
flag = 1;
}
if((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] == (S8)DIR_Unused)
||(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] == (S8)DIR_Deleted))
{
//在根目录中写入文件夹名
((_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)' ';
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute = ARCHIVE_DIR;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[0] = 0x08;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[1] = 0x2A;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[2] = 0x2E;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[3] = 0x5A;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[4] = 0x2D;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[5] = 0x35;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[6] = 0x39;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[7] = 0x35;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FSClusHI = LE16((U16)(varAl.TmpLong >> 16));
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Time = 0x5A2E;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Date = 0x352D;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FSClusLO = LE16((U16)varAl.TmpLong);
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileSize = 0;
DMA_write_sector(position, 0x06);
//写子目录父目录索引, 并至少清除一簇
p = CFatData.dwClu2Startlba + (varAl.TmpLong - 2)* (U32)CFatData.bSectorsPerClu;
//DMA_load_sector(p, 0x06);
for(index = 0; index < CFatData.bSectorsPerClu; index++)
{
clear_DMA((U8 xdata *)0xF000);
if(!index)
{
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Extension[0] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Extension[1] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Extension[2] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[0] = (S8)'.';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[1] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[2] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[3] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[4] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[5] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[6] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[7] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Attribute = ARCHIVE_DIR;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[0] = 0x08;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[1] = 0x2A;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[2] = 0x2E;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[3] = 0x5A;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[4] = 0x2D;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[5] = 0x35;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[6] = 0x39;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[7] = 0x35;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FSClusHI = LE16((U16)(varAl.TmpLong >> 16));
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Time = 0x5A2E;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Date = 0x352D;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FSClusLO = LE16((U16)varAl.TmpLong);
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileSize = 0;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Extension[0] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Extension[1] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Extension[2] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FileName[0] = (S8)'.';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FileName[1] = (S8)'.';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FileName[2] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FileName[3] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FileName[4] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FileName[5] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FileName[6] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FileName[7] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Attribute = ARCHIVE_DIR;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Reserved[0] = 0x08;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Reserved[1] = 0x2A;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Reserved[2] = 0x2E;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Reserved[3] = 0x5A;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Reserved[4] = 0x2D;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Reserved[5] = 0x35;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Reserved[6] = 0x39;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Reserved[7] = 0x35;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FSClusHI = 0;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Time = 0x5A2E;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Date = 0x352D;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FSClusLO = 0;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->FileSize = 0;
}
DMA_write_sector(p++, 0x06);
}
SendChar(0xC5);
return;
}
else
{
FileData.wCurFDBNo++;
if(!(FileData.wCurFDBNo & 0x0F))
flag = 0;
}
}
FileData.wCurFDBNo = 0;
FileData.dwCurCluNo++;
}
//return KO;
}
else
{
//FAT16
FileData.wCurFDBNo = 0;
for(;FileData.wCurFDBNo < (U16)FileData.RootDirNum;)
{
if(!flag)
{
position = CFatData.dwRootStartlba + (FileData.wCurFDBNo / CFatData.bFDBNumInSec);
DMA_load_sector(position, 0x06);
flag = 1;
}
if((((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] == (S8)DIR_Unused)
||(((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileName[0] == (S8)DIR_Deleted))
{
//在根目录中写入文件夹名
((_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)' ';
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Attribute = ARCHIVE_DIR;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[0] = 0x08;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[1] = 0x2A;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[2] = 0x2E;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[3] = 0x5A;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[4] = 0x2D;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[5] = 0x35;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[6] = 0x39;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->Reserved[7] = 0x35;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FSClusHI = LE16((U16)(varAl.TmpLong >> 16));
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Time = 0x5A2E;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Date = 0x352D;
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FSClusLO = LE16((U16)varAl.TmpLong);
((_DIR *)(sbuf2 + (FileData.wCurFDBNo & 0x0F)* DIREntrySize))->FileSize = 0;
DMA_write_sector(position, 0x06);
//写子目录父目录索引, 并至少清除一簇
p = CFatData.dwClu2Startlba + (varAl.TmpLong - 2)* (U32)CFatData.bSectorsPerClu;
//DMA_load_sector(p, 0x06);
for(index = 0; index < CFatData.bSectorsPerClu; index++)
{
clear_DMA((U8 xdata *)0xF000);;
if(!index)
{
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Extension[0] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Extension[1] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Extension[2] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[0] = (S8)'.';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[1] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[2] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[3] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[4] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[5] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[6] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileName[7] = (S8)' ';
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Attribute = ARCHIVE_DIR;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[0] = 0x08;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[1] = 0x2A;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[2] = 0x2E;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[3] = 0x5A;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[4] = 0x2D;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[5] = 0x35;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[6] = 0x39;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->Reserved[7] = 0x35;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FSClusHI = LE16((U16)(varAl.TmpLong >> 16));
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Time = 0x5A2E;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Date = 0x352D;
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FSClusLO = LE16((U16)varAl.TmpLong);
((_DIR *)(sbuf2 + (0 & 0x0F)* DIREntrySize))->FileSize = 0;
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Extension[0] = (S8)' ';
((_DIR *)(sbuf2 + (1 & 0x0F)* DIREntrySize))->Extension[1] = (S8)' ';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -