📄 fat.h
字号:
{
if(((uint32*)&FAT1)[i] == 0)
{
cluster = FAT1num*128+i;
for(k=0;k<MAXFILENUM;k++)
{
if(RWFileStatus[k] == 0) continue;
for(j=0;j<MAXFILECHAINLEN;j++) if(RWFileClusterChain[k][j] == cluster) goto FindCluster0_;
}
return cluster;
}
FindCluster0_:
NOP();
}
first = 0;
temp++;
}while(1);
}
else if(FAT_ID == 0x01)
{
return FAT12FindNextUnusedCluster(StartCluster);
}
else
{
temp = StartCluster/256;
first = StartCluster%256;
do{
if( (temp+FAT1Start) >= FAT2Start) return 0xFFFFFFFF;
if( temp != FAT1num)
{
UFI_Read10(FAT1Start + temp);
FAT1num = temp;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
}
for(i=first;i<256;i++)
{
if(FAT1[i] == 0)
{
cluster = FAT1num*256+i;
for(k=0;k<MAXFILENUM;k++)
{
if(RWFileStatus[k] == 0) continue;
for(j=0;j<MAXFILECHAINLEN;j++) if(RWFileClusterChain[k][j] == cluster) goto FindClusterLoop_;
}
return cluster;
}
FindClusterLoop_:
NOP();
}
first = 0;
temp++;
}while(1);
} // end of if(FAT_ID == 0x01)
return 0xFFFFFFFF;
}
// pBuffer 内存放文件顺次占用的各个簇号
uint8 WriteFAT1FileAllocate(uint32* pBuffer, uint16 num)
{
uint8 first = 1;
uint16 temp;
uint16 i,len;
uint8 tag;
uint16 number;
if( num == 0) return 0;
if(FAT_ID == 0x0B)
{
for(i=0;i<num;i++)
{
if(pBuffer[i] < 2 || pBuffer[i] > 0xFFFFFFEF) return 0x20;
temp = pBuffer[i]/128;
if( (temp+FAT1Start) >= FAT2Start) return 0x30;
}
}
else if(FAT_ID == 0x01)
{
for(i=0;i<num;i++)
{
if(pBuffer[i] < 2 || pBuffer[i] > 0xFEF) return 0x21;
temp = (pBuffer[i]*3)>>10;
if( (temp+FAT1Start) >= FAT2Start) return 0x31;
}
}
else
{
for(i=0;i<num;i++)
{
if(pBuffer[i] < 2 || pBuffer[i] > 0xFFEF) return 0x22;
temp = pBuffer[i]/256;
if( (temp+FAT1Start) >= FAT2Start) return 0x32;
}
}// end of if(FAT_TAG == 0x01)
if(FAT_ID == 0x0B)
{
for(i=0;i<num;i++)
{
temp = pBuffer[i]/128;
if( temp != FAT1num)
{
if(first == 0)
{
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
}
UFI_Read10(FAT1Start + temp);
FAT1num = temp;
for(len=0;len<512;len++) ((uint8*)&FAT1)[len] = ReadBlockData[len];
first = 0;
}
((uint32*)&FAT1)[pBuffer[i]%128] = pBuffer[i+1];
if( (i+1) == num ) ((uint32*)&FAT1)[pBuffer[i]%128] = 0xFFFFFFFF;
}
}
else if(FAT_ID == 0x01)
{
for(i=0;i<num;i++)
{
number = pBuffer[i]*3>>1;
if(number<<1 == pBuffer[i]*3) tag = 0;
else tag = 1;
temp = number>>9;
if( temp != FAT1num)
{
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
UFI_Read10(FAT1Start + temp);
FAT1num = temp;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
}// end of if( temp != FAT1num)
if(tag == 0)
{
((uint8*)&FAT1)[number%512] = pBuffer[i+1];
if( i == num-1 ) ((uint8*)&FAT1)[number%512] = 0xFF;
if(number%512 == 511)
{
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
UFI_Read10(FAT1Start + temp + 1);
FAT1num = temp+1;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
((uint8*)&FAT1)[0] = (((uint8*)&FAT1)[0]& 0xF0) + pBuffer[i+1]>>8;
if( i == (num-1) ) ((uint8*)&FAT1)[0] = (((uint8*)&FAT1)[0]& 0xF0) | 0x0F;
}
else
{
((uint8*)&FAT1)[number%512 + 1] = (((uint8*)&FAT1)[number%512 + 1]& 0xF0) + pBuffer[i+1]>>8;
}
}
else
{
((uint8*)&FAT1)[number%512] = (((uint8*)&FAT1)[number%512]& 0x0F) | (pBuffer[i+1] & 0x00F)<<4;
if( i == num-1 ) ((uint8*)&FAT1)[number%512] = (((uint8*)&FAT1)[number%512]& 0x0F) | 0xF0;
if(number%512 == 511)
{
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
UFI_Read10(FAT1Start + temp + 1);
FAT1num = temp+1;
for(i=0;i<512;i++) ((uint8*)&FAT1)[i] = ReadBlockData[i];
((uint8*)&FAT1)[0] = pBuffer[i+1]>>4;
if( i == num-1 ) ((uint8*)&FAT1)[0] = 0xFF;
}
else
{
((uint8*)&FAT1)[number%512 + 1] = 0xFF;
}
}// end of if(tag == 0)
}// end of for(i=0;i<num;i++)
}
else
{
for(i=0;i<num;i++)
{
temp = pBuffer[i]/256;
if( temp != FAT1num)
{
if(first == 0)
{
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
}
UFI_Read10(FAT1Start + temp);
FAT1num = temp;
for(len=0;len<512;len++) ((uint8*)&FAT1)[len] = ReadBlockData[len];
first = 0;
}
FAT1[pBuffer[i]%256] = pBuffer[i+1];
if( (i+1) == num ) FAT1[pBuffer[i]%256] = 0xFFFF;
}
}// end of if(FAT_TAG == 0x01)
for(len=0;len<512;len++) WriteBlockData[len] = ((uint8*)&FAT1)[len];
UFI_Write10(FAT1Start + FAT1num);
return 0;
}
uint8 CreatFile(FILE_INFO* pfileinfo, uint8 Delete)
{
uint8 filenum;
uint8 i;
uint32 StartCluster = 2;
if( DetectFile((uint8*)pfileinfo) )
{
if(Delete) DeleteFile((uint8*)pfileinfo);
else return 0xFF;
}
StartCluster = FindNextUnusedCluster(StartCluster);
if(StartCluster == 0xFFFFFFFF) return 0xFF;
filenum = FindUnusedFileNum(0);
if(filenum == 0xFF) return 0xFF;
RWFileStatus[filenum] = 0x02;
if( ((uint8*)pfileinfo)[0] == 0xE5 ) ((uint8*)pfileinfo)[0] = 0x05;
for(i = 0; i < sizeof(FILE_INFO); i++) ((uint8*)&RWFileInfo[filenum])[i] = ((uint8*)pfileinfo)[i];
RWFileClusterChain[filenum][0] = StartCluster;
FileInfoRW[filenum].StartClusterNum = 0;
FileInfoRW[filenum].StartAddress = (RWFileClusterChain[filenum][0]-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
FileInfoRW[filenum].NowSectorInCluster = 0;
FileInfoRW[filenum].NowDataInSector = 0;
return filenum;
}
uint8 CloseFile(uint8 filenum)
{
uint8 i,j,temp;
uint16 len;
uint32 SectorAddress;
if( filenum >= MAXFILENUM) return 0x10;
if( RWFileStatus[filenum] == 0) return 0x20; //filenum not used
if( RWFileStatus[filenum] == 0x01) //filenum opend for read
{
RWFileStatus[filenum] = 0;
return 0;
}
RWFileStatus[filenum] = 0;
RWFileInfo[filenum].High16 = RWFileClusterChain[filenum][0] / 65536;
RWFileInfo[filenum].Low16 = RWFileClusterChain[filenum][0] & 0xFFFF;
RWFileInfo[filenum].FileLength = FileInfoRW[filenum].StartClusterNum*Bpb_Fat16.SectorBytes*Bpb_Fat16.SectorsPerCluster + \
FileInfoRW[filenum].NowSectorInCluster*Bpb_Fat16.SectorBytes + \
FileInfoRW[filenum].NowDataInSector;
for(SectorAddress=DIRStart;SectorAddress <= DIREnd;SectorAddress++)
{
UFI_Read10(SectorAddress);
for(i=0;i<16;i++)
{
if(ReadBlockData[i*32] != 0 && ReadBlockData[i*32] != 0xE5) continue;
if(FileInfoRW[filenum].NowDataInSector)
{
for(len=0;len<FileInfoRW[filenum].NowDataInSector;len++)
WriteBlockData[len] = RWFileTempBuffer[filenum][len];
UFI_Write10(FileInfoRW[filenum].StartAddress+FileInfoRW[filenum].NowSectorInCluster);
} // end of if(FileInfoRW[filenum].NowDataInSector)
for(j=0;j<32;j++) ReadBlockData[i*32 + j] = ((uint8*)&(RWFileInfo[filenum]))[j];
for(len=0;len<512;len++) WriteBlockData[len] = ReadBlockData[len];
UFI_Write10(SectorAddress);
temp = WriteFAT1FileAllocate(RWFileClusterChain[filenum],FileInfoRW[filenum].StartClusterNum+1);
if(temp == 0)return 0;
else return 0x40;
} // end of for(i=0;i<16;i++)
} // end of for(SectorAddress=DIRStart;SectorAddress <= DIREnd;SectorAddress++)
return 0x50;
}
uint8 WriteFile(uint8 filenum,uint8* pBuffer,uint32 length)
{
uint8 Sectors,datas;
uint32 i,j,len,TempCluster;
uint32 TotalLength;
if( filenum >= MAXFILENUM) return 0x10;
if( RWFileStatus[filenum] == 0) return 0x20; //filenum not used
if( RWFileStatus[filenum] == 0x01) return 0x30; //filenum opend for read
TotalLength = length + FileInfoRW[filenum].NowDataInSector;
datas = TotalLength % Bpb_Fat16.SectorBytes;
Sectors = TotalLength / Bpb_Fat16.SectorBytes;
if(Sectors == 0)
{
for(i=FileInfoRW[filenum].NowDataInSector;i<datas;i++)
{
RWFileTempBuffer[filenum][i] = *pBuffer++;
}
FileInfoRW[filenum].NowDataInSector = datas;
return 0;
}
for(i=0;i<FileInfoRW[filenum].NowDataInSector;i++)
{
WriteBlockData[i] = RWFileTempBuffer[filenum][i];
}
for(j=0;j<Sectors;j++)
{
for(i=FileInfoRW[filenum].NowDataInSector;i<512;i++)
{
WriteBlockData[i] = *pBuffer++;
}
UFI_Write10(FileInfoRW[filenum].StartAddress+FileInfoRW[filenum].NowSectorInCluster);
if(FileInfoRW[filenum].NowSectorInCluster >= (Bpb_Fat16.SectorsPerCluster-1))
{
TempCluster = FindNextUnusedCluster(RWFileClusterChain[filenum][FileInfoRW[filenum].StartClusterNum]);
if( TempCluster == 0xFFFFFFFF) return 0x40;
FileInfoRW[filenum].StartClusterNum++;
RWFileClusterChain[filenum][FileInfoRW[filenum].StartClusterNum] = TempCluster;
FileInfoRW[filenum].StartAddress = (TempCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
FileInfoRW[filenum].NowSectorInCluster = 0;
}
else FileInfoRW[filenum].NowSectorInCluster++;
FileInfoRW[filenum].NowDataInSector = 0;
}
for(j=0;j<datas;j++)
{
RWFileTempBuffer[filenum][i] = *pBuffer++;
}
FileInfoRW[filenum].NowDataInSector = datas;
return 0;
}
uint8 WriteFileDirectly(FILE_INFO* pfileinfo, uint8 Delete, uint8* pBuffer, uint32 length)
{
uint8 filenum;
filenum = CreatFile(pfileinfo,Delete);
if( filenum == 0xFF) return 0x10;
if( WriteFile(filenum,pBuffer,length) != 0 )
{
DiscardFile(filenum);
return 0x20;
}
if(CloseFile(filenum) != 0) return 0x30;
return 0;
}
#define readfile(n) ReadFileAll(&Fat_data[n*32])
uint8 ReadFileAll(uint8* FileName)
{
uint8 i,j,k,z;
uint32 StartCluster,StartAddress;
uint32 SectorAddress,m;
uint16 len,temp;
for(SectorAddress=DIRStart;SectorAddress <=DIREnd ;SectorAddress++)
{
UFI_Read10(SectorAddress);
for(i=0;i<16;i++)//最多16个文件判断
{
for(j=0;j<32;j++) ((uint8*)&File_Information)[j] = ReadBlockData[i*32 + j];//Fat
if(File_Information.FileName[0] == 0) return 0x10;//判断空文件结束
if(File_Information.FileName[0] == 0xE5) continue;
if(File_Information.FileName[0] == 0x2E) continue;
if(File_Information.FileName[0] == 0x05) File_Information.FileName[0] = 0xE5;
for(k=0;k<11;k++) if(FileName[k] != File_Information.FileName[k]) break;
//判断文件名是否符合
if(k==11)
{
//**********************************************************
StartCluster = File_Information.High16*65536 + File_Information.Low16;
StartAddress = (StartCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart;
if (UFI_Read10(StartAddress)!=0) return 0xff;
m = File_Information.FileLength;
z=0;
temp=0;
for(len = 0; len < File_Information.FileLength; len++)
{
if(len == 512)
{
StartCluster = NextCluster(StartCluster);
if (UFI_Read10((StartCluster-2)*Bpb_Fat16.SectorsPerCluster+SecondClusterStart)!=0) return 0xff;
len = 0;
File_Information.FileLength -= 512;
}
put_u1(ReadBlockData[len]);
// putchar(ReadBlockData[len]);
//显示数据
/* usb_data[z++]=ReadBlockData[len];
if (z==240) {ram_cpl
clear_screen();
USB_display(temp);
//ram_cpl
//clear_screen();
//USB_display(temp);
delayms(3000);
for (z=0;z<240;z++) usb_data[z]=0;
z=0;
temp+=240;
}*/
}
return 0;//成功读取所选文件
//*********************************************************
}//end of if(k==11)
}//endo of for(i=0;i<16;i++)
}// end of for(SectorAddress=DIRStart;SectorAddress <=DIREnd ;SectorAddress++)
return 0x20;
}// End of readfileAll
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -