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

📄 f_fat.c

📁 S3C2410 USB Mass storage 源码.
💻 C
📖 第 1 页 / 共 3 页
字号:
}

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 + -