📄 f_fat.c
字号:
}
u8 F_FAT_CreateShortName(FAT_HANDLE *pHandle, c8 *filename, c8 *shortname, u8 ftype)
{
u8 i =0,j =0, namelen = strlen(filename);
c8 extname[4], tmpname[13] = {0}, tmpfilename[250] = {0};
F_BrowsingCursor cursor;
F_direntry de;
u16 namenum = 0;
strcpy(tmpfilename, filename);
memset((u8 *)shortname, 0, 13);
memset((u8 *)extname, 0, 4);
strupr(tmpfilename);
for(i = 0;i<8;i++)
{
if(tmpfilename[i] == '.')
break;
shortname[i] = tmpfilename[i];
}
if(i==8)
{
shortname[6] = '~';
shortname[7] = '1';
}
else
{
for(;i<8;i++)
shortname[i] = 0x20;
}
shortname[i++] = '.';
if(F_FAT_GetExtName(tmpfilename, extname) == ERR_NONE)
{
for(j=0;j<3;j++)
shortname[i++] = extname[j];
}
else
{
for(j=0;j<3;j++)
shortname[i++] = 0x20;
}
shortname[i] = '\0';
F_FAT_BrowsingReset(pHandle, &cursor);
for(;F_FAT_GetNextDirEntry(pHandle, &de, &cursor, 0, 0)==ERR_NONE;)
{
for(i=0;i<8;i++)
tmpname[i] = de.deName[i];
tmpname[i] = '.';
for(i=0;i<3;i++)
tmpname[i+9] = de.deExtension[i];
tmpname[i+9] = '\0';
if(!strcmp(tmpname, shortname))
{
if(shortname[7]<'4')
shortname[7]++;
else
{
for(i = 2;i<namelen;i++)
namenum += filename[i];
for(i = 2;i<6;i++)
shortname[i] = Intnum2Char((namenum>>((i-2)*4))&0x0f);
shortname[6] = '~';
shortname[7] = '1';
}
}
}
return ERR_NONE;
}
u8 F_FAT_GetExtName(c8 * filename, c8 * ExtName)
{
u8 i = 0,j = 0, namelen = strlen(filename);
for(i = 0; i<namelen;i++)
{
if(filename[i] == '.')
break;
}
if(i== namelen)
return ERR_NO_EXTNAME;
i++;
for(j=0;j<3;j++,i++)
{
if(filename[i] != '\0')
ExtName[j] = filename[i];
else
break;
}
ExtName[j] = '\0';
return ERR_NONE;
}
u8 F_FAT_LfnCheckSum(c8 *shortname)
{
u8 Sum = 0, i;
for (i = 0; i < 11; i++)
{
Sum = (((Sum & 1) << 7) | ((Sum & 0xFE) >> 1)) + shortname[i];
}
return Sum;
}
u8 F_FAT_CreateSFNFDB(F_direntry *pde, c8 *shortname, u8 ftype)
{
u8 i = 0, chrflg = 0,namelen = strlen(shortname);
//time_t t;
struct tm *CurrentTime;
u32 tmpdate = 0, tmptime = 0;
c8 extname[4] = {0};
u32 freeCluster = 0;
FAT_HANDLE *pHandle = F_FAT_GetCurrentFolder();
{// get deName and deExtension
F_FAT_GetExtName(shortname, extname);
for(i=0;i<8;i++)
{
if((shortname[i] == '.')||(shortname[i] == 0))
break;
if(shortname[i]>0x60&&shortname[i]<0x7B)
chrflg |= 0x08;
pde->deName[i] = shortname[i];
}
while(i<8)
pde->deName[i++] = 0x20;
for(i=0;i<3;i++)
{
if((extname[i] == '.')||(extname[i] == 0))
break;
if(extname[i]>0x60&&extname[i]<0x7B)
chrflg |= 0x10;
pde->deExtension[i] = extname[i];
}
while(i<3)
pde->deExtension[i++] = 0x20;
strupr((char *)pde->deName);
strupr((char *)pde->deExtension);
}
#if 1
{// get create, modify and access time
//t=time(NULL);
//CurrentTime=localtime(&t);
//printf("%d/%d/%d\n",CurrentTime->tm_mon+1,CurrentTime->tm_mday,CurrentTime->tm_year+1900);
//printf("%d:%d:%d\n",CurrentTime->tm_hour,CurrentTime->tm_min,CurrentTime->tm_sec);
tmpdate = (2008-1980)*512+(8*32)+8;
tmptime = 8*2048+8*32+8/2;
pde->deCTime[0] =(u8)(tmptime&0xff);pde->deCTime[1] = (u8)((tmptime>>8)&0xff);
pde->deCDate[0] =(u8)(tmpdate&0xff);pde->deCDate[1] = (u8)((tmpdate>>8)&0xff);
pde->deMTime[0] =(u8)(tmptime&0xff);pde->deMTime[1] = (u8)((tmptime>>8)&0xff);
pde->deMDate[0] =(u8)(tmpdate&0xff);pde->deMDate[1] = (u8)((tmpdate>>8)&0xff);
pde->deADate[0] =(u8)(tmpdate&0xff);pde->deADate[1] = (u8)((tmpdate>>8)&0xff);
}
#endif
{// get other informations
if(ftype)
pde->deAttributes = 0x20;
else
pde->deAttributes = 0x10;
pde->deLowerCase = chrflg;
pde->deCHundredth = 0x00;
pde->deStartCluster = 0x00;
pde->deHighClust = 0x00;
pde->deFileSize = 0x00;
}
{// get free cluster
freeCluster = F_FAT_GetNewFreeCluster(pHandle, 0);
if(freeCluster == 0)
return 1;
else
{
pde->deStartCluster =(u16)(freeCluster & 0xFFFF);
pde->deHighClust =(u16)((freeCluster>>16) & 0xFFFF);
}
}
return 0;
}
u8 F_FAT_CreateLFNFDB(c8 *filename,c8 *shortname, u8 *buffer, u8 fdbnum)
{
u8 i = 0,j =0,k =0,endflg = 0;
u16 unicode[MAX_LFN_BUF] = {0};
u8 checksum = 0;
c8 tmpname[13] ={0};
strcpy(tmpname, shortname);
F_FAT_NormalizeName(tmpname, shortname);
checksum = F_FAT_LfnCheckSum(tmpname);
F_GB2312StrToUniStr((u8 *)filename, unicode);
for(i=1;i<=fdbnum;i++)
{
j=0;k=0;
if(i == fdbnum)
buffer[(fdbnum-i)*32 +j++] = i | 0x40;
else
buffer[(fdbnum-i)*32 +j++] = i;
for(k = 0;k<5;k++)
{
if(endflg)
{
buffer[(fdbnum-i)*32 +j++] = 0xFF;buffer[(fdbnum-i)*32 +j++] = 0xFF;
}
else
{
buffer[(fdbnum-i)*32 +j++] = unicode[(i-1)*13+k]&0xFF;
buffer[(fdbnum-i)*32 +j++] = (unicode[(i-1)*13+k]>>8)&0xFF;
if(unicode[(i-1)*13+k] == 0)
endflg =1;
}
}
buffer[(fdbnum-i)*32 +j++] = ATTR_LONG_FILENAME;
buffer[(fdbnum-i)*32 +j++] = 0x00;
buffer[(fdbnum-i)*32 +j++] = checksum;
for(k = 5;k<11;k++)
{
if(endflg)
{
buffer[(fdbnum-i)*32 +j++] = 0xFF;buffer[(fdbnum-i)*32 +j++] = 0xFF;
}
else
{
buffer[(fdbnum-i)*32 +j++] = unicode[(i-1)*13+k]&0xFF;
buffer[(fdbnum-i)*32 +j++] = (unicode[(i-1)*13+k]>>8)&0xFF;
if(unicode[(i-1)*13+k] == 0)
endflg =1;
}
}
buffer[(fdbnum-i)*32 +j++] = 0x00;
buffer[(fdbnum-i)*32 +j++] = 0x00;
for(k = 11;k<13;k++)
{
if(endflg)
{
buffer[(fdbnum-i)*32 +j++] = 0xFF;buffer[(fdbnum-i)*32 +j++] = 0xFF;
}
else
{
buffer[(fdbnum-i)*32 +j++] = unicode[(i-1)*13+k]&0xFF;
buffer[(fdbnum-i)*32 +j++] = (unicode[(i-1)*13+k]>>8)&0xFF;
if(unicode[(i-1)*13+k] == 0)
endflg =1;
}
}
}
return 0;
}
u8 F_FAT_CreateFDB(FAT_HANDLE *pHandle, u8 *buffer, F_BrowsingCursor *Cursor, u8 fdbnum)
{
u8 tmp = 0;
u32 nextcluster = 0, nextsector = 0;
u32 lastcluster;
//DataPrint(fdbnum*32, 16, buffer);
F_ReadSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
if((Cursor->DirEntryIndex+fdbnum)<(pHandle->BytesPerSector/DIRENTRY_SIZE))
{
memcpy((prSectorBuf+Cursor->DirEntryIndex*32), buffer, fdbnum*32);
F_WriteSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
}
else
{
tmp = (pHandle->BytesPerSector/DIRENTRY_SIZE) - Cursor->DirEntryIndex;
memcpy((prSectorBuf+Cursor->DirEntryIndex*32), buffer, tmp*32);
F_WriteSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
if((Cursor->CurrentSectorAddr -pHandle->FirstDataSector +1)%pHandle->SectorsPerCluster!=0)
{
Cursor->CurrentSectorAddr ++;
}
else
{
lastcluster = F_FAT_SectorToCluster(pHandle, Cursor->CurrentSectorAddr);
nextcluster = F_FAT_GetNextCluster(pHandle, lastcluster);
nextsector = F_FAT_ClusterToSector(pHandle, nextcluster);
Cursor->CurrentSectorAddr = nextsector;
}
F_ReadSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
memcpy(prSectorBuf, (buffer+tmp*32), (fdbnum-tmp)*32);
F_WriteSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
}
return ERR_NONE;
}
u8 F_FAT_ModifyFDB(FAT_HANDLE *pHandle, F_direntry *de, c8 *shortname)
{
F_BrowsingCursor cursor;
c8 tmpname[MAX_LFN_BUF] = {0};
c8 tmpname1[MAX_LFN_BUF] = {0};
F_FileInfo fileInfo;
F_direntry rde, *pde = (F_direntry *)prSectorBuf;
strcpy(tmpname, shortname);
strupr(tmpname);
F_FAT_BrowsingReset(pHandle, &cursor);
for(;F_FAT_GetNextDirEntry(pHandle, &rde, &cursor, 0, NULL) == 0;)
{
if(rde.deAttributes == ATTR_ARCHIVE)
{
F_FAT_DirEntryToSFN(&rde, fileInfo.fileINF_Name, 13);
strcpy(tmpname1, fileInfo.fileINF_Name);
strupr(tmpname1);
if(!strcmp(tmpname, tmpname1))
{
pde += (cursor.DirEntryIndex-1);
pde->deFileSize = de->deFileSize;
F_WriteSector(hFile, cursor.CurrentSectorAddr, 1, prSectorBuf);
return ERR_NONE;
}
}
}
return F_ERR_FILE_NOT_EXIST;
}
u8 F_FAT_CreateSubFolderFDB(FAT_HANDLE *pHandle, F_direntry *de, u32 curClust, u32 LastClust)
{
u8 buffer[512] = {0};
u8 i = 0;
u32 curSect = F_FAT_ClusterToSector(pHandle, curClust);
F_direntry rde;
for(i=1;i<pHandle->SectorsPerCluster;i++)
F_WriteSector(hFile, curSect+i, 1, buffer);
memcpy((u8 *)&rde, (u8*)de, 32);
strcpy(rde.deName,". ");
memset(rde.deExtension,0x20,3);
memcpy((u8 *)buffer, (u8*)&rde, 32);
strcpy(rde.deName,".. ");
memset(rde.deExtension,0x20,3);
if(LastClust == 2)
{
rde.deHighClust = 0;
rde.deStartCluster = 0;
}
else
{
rde.deHighClust = (u16)((LastClust>>16)&0xFFFF);
rde.deStartCluster = (u16)(LastClust&0xFFFF);
}
memcpy((u8 *)buffer+32, (u8*)&rde, 32);
F_WriteSector(hFile, curSect, 1, buffer);
}
void F_FAT_NormalizeName(c8 *oriname, c8 *tarname)
{
u8 i =0, len = strlen(tarname);
c8 extname[4] = {0};
for(;i<len;i++)
{
if(tarname[i]!='.')
oriname[i] = tarname[i];
else
{
F_FAT_GetExtName(tarname, extname);
break;
}
}
while(i<8)
oriname[i] = 0x20;
if(extname[0] != 0)
{
for(i = 8;i<11;i++)
oriname[i] = extname[i-8];
}
else
{
for(i = 8;i<11;i++)
{
if(tarname[i]!='\0')
oriname[i] = tarname[i];
else
break;
}
}
oriname[i] = '\0';
strupr(oriname);
}
u8 F_FAT_FAT2Refresh(u32 sector, u8 sectornum, u8 *buffer)
{
F_WriteSector(hFile, sector, sectornum, buffer);
return 0;
}
void F_FAT_DirInit(FAT_HANDLE *pHandle)
{
pHandle->currentDirCluster = pHandle->FirstDirCluster;
}
u8 F_FAT_GetDirLayer(c8 *Direntry, u8 *Layer)
{
u8 i = 0, layer = 0, j= 0;
if(Direntry[0]!= g_CurrentDir[0])
return ERR_DIRENTRY;
memset((u8 *)g_direntry, 0, MAX_DIR_LEN*MAX_LAYER);
for(layer = 0; layer<MAX_LAYER;layer++)
{
for(i=0;i<MAX_DIR_LEN;i++)
{
if(Direntry[j] == '\\' || Direntry[j] == '\0')
break;
g_direntry[layer][i] = Direntry[j];
j++;
}
if(Direntry[j] == '\0')
break;
j++;
}
if(Direntry[j]!='\0')
return ERR_DIRENTRY;
*Layer = layer+1;
return ERR_NONE;
}
#endif /* _READ_SD_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -