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

📄 f_fat.c

📁 S3C2410 USB Mass storage 源码.
💻 C
📖 第 1 页 / 共 3 页
字号:
      	{
            	sector = (Cluster>>8) + pHandle->FirstFATSector;// 256(>>8) FATEntries(2 bytes) pre Sector
            	index = (u16)(Cluster%(pHandle->BytesPerSector/2)); //the startentry should be found
      	}

      	do
      	{
            	if(F_ReadSector(hFile, sector, 1, prFATBuffer))
            	{
                  	//return CLUST_BAD if HAL_ReadSector failed .
                  	if(pHandle->PartType == PART_TYPE_FAT32)
                        	return (CLUST_BAD&FAT32_MASK);
                  	else
                        	return (CLUST_BAD&FAT16_MASK);

            	}

            	if (pHandle->PartType == PART_TYPE_FAT32)
            	{
                 	for (; index < (pHandle->BytesPerSector/4); index++)//Read all Clusters in a sector
                  	{
                        	if ((fat32Buffer[index]&FAT32_MASK) == 0x00000000)
                        	{
                              	FreeClusterNo =  (index + ((sector -pHandle->FirstFATSector)*(pHandle->BytesPerSector/4)));
                              	//Check for MAX Cluster No.
                              	if(FreeClusterNo < (pHandle->NumClusters + 2))
                                   {
						fat32Buffer[index] = FAT32_MASK;	
						F_WriteSector(hFile, sector, 1, prFATBuffer);
						F_FAT_FAT2Refresh(sector+ pHandle->FirstFAT2Sector-pHandle->FirstFATSector, 1 ,prFATBuffer);

						freesector = F_FAT_ClusterToSector(pHandle, FreeClusterNo);
						for(;i<pHandle->SectorsPerCluster;i++)
						{
							F_ReadSector(hFile, freesector, 1, prSectorBuf);
							memset(prSectorBuf,0,pHandle->BytesPerSector);
							F_WriteSector(hFile, freesector, 1, prSectorBuf);
							freesector++;
						}
                                   	return FreeClusterNo;
                              	}
                              	else
                                    	return 0;
				}

                  	}
            	}
            	else if(pHandle->PartType == PART_TYPE_FAT16)
            	{
                  	for (; index < (pHandle->BytesPerSector/2); index++)//Read all Clusters in a sector
                  	{
                        	if ((fat16Buffer[index]&FAT16_MASK) == 0x0000)
                        	{
                              	FreeClusterNo = (index + ((sector -pHandle->FirstFATSector)*(pHandle->BytesPerSector/2)));
                              	//Check for MAX Cluster No.
                              	if(FreeClusterNo < (pHandle->NumClusters + 2))
                                   {
						fat16Buffer[index] = FAT16_MASK;	
						F_WriteSector(hFile, sector, 1, prFATBuffer);
						F_FAT_FAT2Refresh(sector+ pHandle->FirstFAT2Sector-pHandle->FirstFATSector, 1 ,prFATBuffer);

						freesector = F_FAT_ClusterToSector(pHandle, FreeClusterNo);
						for(;i<pHandle->SectorsPerCluster;i++)
						{
							F_ReadSector(hFile, freesector, 1, prSectorBuf);
							memset(prSectorBuf,0,pHandle->BytesPerSector);
							F_WriteSector(hFile, freesector, 1, prSectorBuf);
							freesector++;
						}
                                   	return FreeClusterNo;
                              	}
                              	else
                                    	return 0;
                        	}

                  	}
            	}


            	sector++;
            	index = 0;//the start entry should be found
      	}while  (sector < pHandle->FirstFATSector+pHandle->FatSectors); // endof Fat entries

      	return 0;
}

u32 F_FAT_GetNextFreeCluster(FAT_HANDLE *pHandle, u32 Cluster)
{
	u8 i = 0;
	u16 index;
      	u32 sector;
      	u32 *fat32Buffer;
      	u16 *fat16Buffer;
      	u32 FreeClusterNo, freesector;

      	fat32Buffer= (u32 *)prFATBuffer;
      	fat16Buffer= (u16 *)prFATBuffer;

      	//Calculate the FAT LBA of this cluster no.
      	if (pHandle->PartType == PART_TYPE_FAT32)
      	{
            	sector = (Cluster>>7) + pHandle->FirstFATSector;// 128(>>7) FATEntries(4 bytes) pre Sector
            	index = (u16)(Cluster%(pHandle->BytesPerSector/4)); //the startentry should be found
      	}
      	else if(pHandle->PartType == PART_TYPE_FAT16)
      	{
            	sector = (Cluster>>8) + pHandle->FirstFATSector;// 256(>>8) FATEntries(2 bytes) pre Sector
            	index = (u16)(Cluster%(pHandle->BytesPerSector/2)); //the startentry should be found
      	}

      	do
      	{
            	if(F_ReadSector(hFile, sector, 1, prFATBuffer))
            	{
                  	//return CLUST_BAD if HAL_ReadSector failed .
                  	if(pHandle->PartType == PART_TYPE_FAT32)
                        	return (CLUST_BAD&FAT32_MASK);
                  	else
                        	return (CLUST_BAD&FAT16_MASK);

            	}

            	if (pHandle->PartType == PART_TYPE_FAT32)
            	{
                 	for (; index < (pHandle->BytesPerSector/4); index++)//Read all Clusters in a sector
                  	{
                        	if ((fat32Buffer[index]&FAT32_MASK) == 0x00000000)
                        	{
                              	FreeClusterNo =  (index + ((sector -pHandle->FirstFATSector)*(pHandle->BytesPerSector/4)));
                              	//Check for MAX Cluster No.
                              	if(FreeClusterNo < (pHandle->NumClusters + 2))
                                   {
                                   	fat32Buffer[index-1] = FreeClusterNo;
						fat32Buffer[index] = FAT32_MASK;	
						F_WriteSector(hFile, sector, 1, prFATBuffer);
						F_FAT_FAT2Refresh(sector+ pHandle->FirstFAT2Sector-pHandle->FirstFATSector, 1 ,prFATBuffer);

						freesector = F_FAT_ClusterToSector(pHandle, FreeClusterNo);
						for(;i<pHandle->SectorsPerCluster;i++)
						{
							F_ReadSector(hFile, freesector, 1, prSectorBuf);
							memset(prSectorBuf,0,pHandle->BytesPerSector);
							F_WriteSector(hFile, freesector, 1, prSectorBuf);
							freesector++;
						}
                                   	return FreeClusterNo;
                              	}
                              	else
                                    	return 0;
				}

                  	}
            	}
            	else if(pHandle->PartType == PART_TYPE_FAT16)
            	{
                  	for (; index < (pHandle->BytesPerSector/2); index++)//Read all Clusters in a sector
                  	{
                        	if ((fat16Buffer[index]&FAT16_MASK) == 0x0000)
                        	{
                              	FreeClusterNo = (index + ((sector -pHandle->FirstFATSector)*(pHandle->BytesPerSector/2)));
                              	//Check for MAX Cluster No.
                              	if(FreeClusterNo < (pHandle->NumClusters + 2))
                                   {
                                   	fat16Buffer[index-1] = FreeClusterNo;
						fat16Buffer[index] = FAT16_MASK;	
						F_WriteSector(hFile, sector, 1, prFATBuffer);
						F_FAT_FAT2Refresh(sector+ pHandle->FirstFAT2Sector-pHandle->FirstFATSector, 1 ,prFATBuffer);

						freesector = F_FAT_ClusterToSector(pHandle, FreeClusterNo);
						for(;i<pHandle->SectorsPerCluster;i++)
						{
							F_ReadSector(hFile, freesector, 1, prSectorBuf);
							memset(prSectorBuf,0,pHandle->BytesPerSector);
							F_WriteSector(hFile, freesector, 1, prSectorBuf);
							freesector++;
						}
                                   	return FreeClusterNo;
                              	}
                              	else
                                    	return 0;
                        	}

                  	}
            	}


            	sector++;
            	index = 0;//the start entry should be found
      	}while  (sector < pHandle->FirstFATSector+pHandle->FatSectors); // endof Fat entries

      	return 0;
}

void F_FAT_BrowsingReset(FAT_HANDLE *pHandle, F_BrowsingCursor *Cursor)
{
	Cursor->CurrentEntryIndex = 0;
	Cursor->CurrentSectorAddr = F_FAT_ClusterToSector(pHandle, pHandle->currentDirCluster);
	Cursor->DirEntryIndex = 0;
	Cursor->SectorOffset = 0;
}

void F_FAT_GetLFN(u8 *debuf, u16 *LFN)
{
	u8 i = 0, LfnCounter = 0, j = 0;

	LfnCounter = debuf[i++]&0x0F;
	for(j = 0;j<5;j++,i +=2)
		LFN[(LfnCounter-1)*13 + j] = debuf[i] + (debuf[i+1]<<8);
	i += 3;
	for(j = 5;j<11;j++,i+=2)
		LFN[(LfnCounter-1)*13 + j] = debuf[i] + (debuf[i+1]<<8);
	i += 2;
	for(j = 11;j<13;j++,i+=2)
		LFN[(LfnCounter-1)*13 + j] = debuf[i] + (debuf[i+1]<<8);	
}

u8 F_FAT_DirEntryToSFN(F_direntry *pde, c8 *SFNBuf, u8 SFNlen)
{
	u8 i,j = 0;

	if(SFNlen < 13)
		return 1;

	memset(SFNBuf,0,SFNlen);

	for(i=0;i<8;i++)
	{
		if(pde->deName[i] == 0x20)
			break;
		else
			SFNBuf[i] = (c8)(pde->deName[i]);
	}
		
	if((pde->deLowerCase & LCASE_BASE) == LCASE_BASE)
		strlwr(SFNBuf);
	
	if(pde->deExtension[0] != 0x20)
	{
		SFNBuf[strlen(SFNBuf)] = '.';
		i = strlen(SFNBuf);

		for(j=0;j<3;j++)
		{
			if(pde->deExtension[j] == 0x20)
				break;
			else
				SFNBuf[i+j] = (c8)(pde->deExtension[j]);
		}
		if((pde->deLowerCase & LCASE_EXT) == LCASE_EXT)
			strlwr(&SFNBuf[i]);
	}

	return 0;
}	

u8 F_FAT_GetFileInfo(F_direntry *pde, F_FileInfo *fileInfo)
{
	u16 date, time;

	fileInfo->fileINF_size = pde->deFileSize;
	fileInfo->fileINF_start_cluster = pde->deStartCluster + (pde->deHighClust<<16);

	return 0;
}


//This function need to return current sector address and direntry index.
u8 F_FAT_GetFreeFDBEntry(FAT_HANDLE *pHandle, u8 num, F_BrowsingCursor *Cursor)
{
	u8 Error = ERR_NONE, i = 0, tmpnum = 0, tmp = 0xFF;
	u32 u32currnetsector = 0, nextCluster = 0, nextSector = 0;
	F_direntry *de;
	u32 lastsector = 0, lastindex = 0;
	
	for(;;Cursor->SectorOffset++)
	{
		if((Cursor->SectorOffset%pHandle->SectorsPerCluster == 0)&&(Cursor->DirEntryIndex == 0))
		{
			if(Cursor->SectorOffset == 0 && Cursor->CurrentSectorAddr == F_FAT_ClusterToSector(pHandle, pHandle->currentDirCluster))
			{
				F_ReadSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
				de = (F_direntry *)prSectorBuf;
			}			
			else
			{
				Cursor->SectorOffset = 0;
				nextCluster = F_FAT_GetNextCluster(pHandle, F_FAT_SectorToCluster(pHandle, Cursor->CurrentSectorAddr));
				if(nextCluster == 0)
				{
					nextCluster = F_FAT_GetNextFreeCluster(pHandle, F_FAT_SectorToCluster(pHandle, Cursor->CurrentSectorAddr));
					if(nextCluster == 0)
						return EOF_CLUSTER;
				}
				nextSector = F_FAT_ClusterToSector(pHandle, nextCluster);
				Cursor->CurrentSectorAddr = nextSector;
				F_ReadSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
				de = (F_direntry *)prSectorBuf;
			}	
		}
		else
		{
			if(Cursor->DirEntryIndex == 0)
			{
				Cursor->CurrentSectorAddr += Cursor->SectorOffset;
				F_ReadSector(hFile, Cursor->CurrentSectorAddr, 1, prSectorBuf);
			}
			de = (F_direntry *)prSectorBuf;
		}
		
		if(de == NULL)
			return EOF_CLUSTER;
		for(de += Cursor->DirEntryIndex;Cursor->DirEntryIndex<(pHandle->BytesPerSector/DIRENTRY_SIZE); Cursor->DirEntryIndex++)	
		{
			if(*de->deName!=tmp)
			{
				tmp = *de->deName;
				tmpnum = 0;
			}
			if(*de->deName == SLOT_EMPTY)
			{
				tmpnum++;
				if(tmpnum == 1)
				{
					lastsector = Cursor->CurrentSectorAddr;
					lastindex = Cursor->DirEntryIndex;
				}
				if(tmpnum == num)
				{
					if(Cursor->CurrentSectorAddr != lastsector)
					{
						Cursor->CurrentSectorAddr = lastsector;
					}
					Cursor->DirEntryIndex = lastindex;
					return ERR_NONE;
				}
			}
			else if(*de->deName == SLOT_DELETED)
			{
				tmpnum++;
				if(tmpnum == 1)
				{
					lastsector = Cursor->CurrentSectorAddr;
					lastindex = Cursor->DirEntryIndex;
				}
				if(tmpnum == num)
				{
					if(Cursor->CurrentSectorAddr != lastsector)
					{
						Cursor->CurrentSectorAddr = lastsector;
					}
					Cursor->DirEntryIndex = lastindex;
					return ERR_NONE;
				}
			}
			else
			{
				tmpnum = 0;
				de++;
			}
		}
		Cursor->DirEntryIndex = 0;
	}
	return EOF_FATCHAIN;
}

u8 F_FAT_CheckIfLFN(c8 *filename, u8 *fdbnum)
{
	u16 i = 0;
	
	c8 *ePtr;
	u16 eNameLen,eNameOff=0;
	c8 c;

	u16 FirstSpacePos=0;
	u8	SpaceCount=0;
	
	u16 FirstDotPos=0;
	u8 DotNum=0;
	
	u16 ExtPos=0;
	u8	ExtFlag=0;

	u8 SpecialCharExist=0;
	u16 unicode[MAX_LFN_BUF] = {0};

	eNameLen = strlen(filename);
	ePtr = filename;

	eNameOff=i;
	ePtr+=i;

	for(i=eNameOff;i<eNameLen;i++)
	{
		c=ePtr[i];
		
		if(ExtFlag == 1&&c!='.')
		{
			ExtPos++;
		}
		if(c=='.')
		{
			ExtFlag = 1;
			ExtPos = 0;
			
			if(FirstDotPos==0)
				FirstDotPos = i;
			DotNum++;
		}
		else if(c==' ')
		{
			if(FirstSpacePos==0)
				FirstSpacePos = i;
			
			SpaceCount++;
		}
		else if(c== '+'||c== ','||c==';'||c== '='||c=='['||c==']')
		{
			SpecialCharExist=1;
		}
	}
	if((eNameLen-eNameOff > 12)
		||(ExtPos>3)||(DotNum>1)
		||(((FirstSpacePos+SpaceCount)<(eNameLen-eNameOff))&&(SpaceCount>0))
		||(SpecialCharExist)
		|| ((FirstDotPos==0)&&(eNameLen-eNameOff > 8)))
	{
		eNameLen = F_GB2312StrToUniStr((u8 *)filename, unicode);
		*fdbnum += eNameLen/13;
		if(eNameLen%13 !=0)
			*fdbnum +=1;
		return 1;
	}else
	{
		return 0;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -