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

📄 dosfat.c

📁 一种文件系统的结构
💻 C
📖 第 1 页 / 共 2 页
字号:
	#if ((K_CARD_TYPE &0x01)== 0x01)//if nand flash is support	
	if (gc_CurrentCard == 0)
	{//nand flash must update bad lookup table(include current bank and bank 0)
		SMC_UpdateLookupTAB();
	}
	#endif

	return tc_Status;
}
//-------------------------------------------------------------------------------
//New by Roger 2004-12-31
//add function GetValidClusterCnt to shirnk duplicate code  
U32 GetValidClusterCnt()
{
	U32 tdw_ClusterCnt;
	tdw_ClusterCnt=gdw_ClusterBuffer[gc_ClusBufValidPoint++];//get a cluster content
	if(gc_ClusBufValidPoint>=8)
	{				
		gc_ClusBufValidPoint=0;//if array full,reset the point
	}
	gc_ClusBufValidSize--;//the number of valid cluster minus 1
	return 	tdw_ClusterCnt;
}
//-------------------------------------------------------------------------------
U32 DOS_GetAFreeCluster(void)
{
//	U32 tdw_ClusterCnt;
	U8  tc_FreeClusterNum;
	
	if(gc_ClusBufValidSize)//if have valid cluster
	{
		/*if(gc_ClusBufValidSize==1)
		{
			DOS_SearchFreeCluster(0);
		}*/
#if 1
		return GetValidClusterCnt();
#else
		tdw_ClusterCnt=gdw_ClusterBuffer[gc_ClusBufValidPoint++];//get a cluster content
		if(gc_ClusBufValidPoint>=8)
		{				
			gc_ClusBufValidPoint=0;//if array full,reset the point
		}
		gc_ClusBufValidSize--;//the number of valid cluster minus 1
		return tdw_ClusterCnt;
#endif
	}
	else 
	{//have no valid cluster
		
		while((gc_ClusBufValidSize == 0) && (gdw_FreeClusterNum[0] < (gdw_DOS_FatMaxCluster - 1))) 
		{//exit when find a free cluster or find end(040906 lzp add)
			tc_FreeClusterNum=DOS_SearchFreeCluster(0);//search cluster from flash fat table
		}
	
		if(!gc_ClusBufValidSize)//search no one
		{
			return 0;
		}
		else
		{

#if 1
				return GetValidClusterCnt();
#else
				tdw_ClusterCnt=gdw_ClusterBuffer[gc_ClusBufValidPoint++];
				if(gc_ClusBufValidPoint>=8)
				{
					gc_ClusBufValidPoint=0;
				}
				gc_ClusBufValidSize--;
				return tdw_ClusterCnt;
#endif
		}
	}
	

}


void MoveUSBtoUserDataBuf(U16 tw_StartAddr) //copy size: 512 bytes //Ching
{
	XBYTE[REG_DMA_SEL]=0x00;        //DMA   src: MCU Data SRAM;  dst: DSP DM
	XBYTE[REG_DMASIZE7_0]  = 0xFF;
	XBYTE[0xB303] = 0x01;
	XBYTE[REG_SRAMDMASRCIDX7_0]=0x00;
    XBYTE[REG_SRAMDMASRCIDX15_8]=tw_StartAddr>>8;

	XBYTE[REG_SRAMDMADSTIDX7_0]  = M_LoByteOfWord((unsigned int)gc_UserDataBuf);
    XBYTE[REG_SRAMDMADSTIDX15_8] = M_HiByteOfWord((unsigned int)gc_UserDataBuf);
    XBYTE[REG_DMASTART]=0x01;
    while(!(XBYTE[REG_DMACMP]&0x01));
    XBYTE[REG_DMACMP]=0x00;
   	XBYTE[REG_SRAMDMASRCIDX15_8]=0xFF;
    XBYTE[REG_SRAMDMADSTIDX15_8]=0xFF;
}


U32 DOS_GetNextCluster(U32 tdw_CurrentCLuster, U32 tdw_ClusterNumber)
{
	U32 tdw_ClusterNumCounter=0,tdw_CLusterNUM=0;
	U32 tdw_fatOffset, tdw_DOS_FatSize;
	U16 tw_WordOffset, tw_WordOffset1;//Ching
	U16 tw_XBYTEstart; //Ching
	U8 tc_SectorChang=0;
	U8 tc_DOS_FatSize1;//Ching

	gc_ReadWriteDataArea=1;
	tdw_CLusterNUM=0;
	if(tdw_CurrentCLuster<0x002)
	{//for rootdir
		return(0xffffffff);	
	}
	if (tdw_ClusterNumber == 0) return tdw_CurrentCLuster;
	if(gc_DOS_FileSystemType==0)
	{
		tdw_fatOffset = (tdw_CurrentCLuster*3)>> 1;//fat12 xyq040617
	}
	else
	{		
		tdw_fatOffset = tdw_CurrentCLuster<< gc_DOS_FileSystemType;//fat16 or fat32  xyq040617		
	}	

	for(tdw_DOS_FatSize=tdw_fatOffset/gw_DOS_SectorSize;tdw_DOS_FatSize<gdw_DOS_SectorPerFAT;tdw_DOS_FatSize++)//Ching
	{//find in fat
		if(DOS_Kernel_Read_LogicSector((gdw_DOS_Fat1Addr+tdw_DOS_FatSize),1) == 0)
		{			
			while((tdw_fatOffset/gw_DOS_SectorSize)==tdw_DOS_FatSize)//Ching
			{//while
				tw_WordOffset1=tdw_fatOffset&(gw_DOS_SectorSize-1);
				tc_DOS_FatSize1=tw_WordOffset1>>9;						
				tw_WordOffset=tw_WordOffset1&0x1FF;
				if(tc_DOS_FatSize1)
				{
					tw_XBYTEstart=HOST_BUF_SA+((U16)tc_DOS_FatSize1<<9);
					MoveUSBtoUserDataBuf(tw_XBYTEstart);
				}
				
		    	if(gc_DOS_FileSystemType!=0)
				{
					if(gc_DOS_FileSystemType==1)
					{//FAT16
						if(tdw_CurrentCLuster>=0xfff8)
						{						
							return(0xffffffff);
						}					
						tdw_CurrentCLuster=(((U32)gc_UserDataBuf[tw_WordOffset+1]<<8))|\
											(U32)gc_UserDataBuf[tw_WordOffset];								
					}
					else if(gc_DOS_FileSystemType==2)
					{//FAT32				
						if(tdw_CurrentCLuster>=0x0ffffff8)
						{			
							return(0xffffffff);
						}
						((U8 *)(&tdw_CurrentCLuster))[0]=gc_UserDataBuf[tw_WordOffset+3];
						((U8 *)(&tdw_CurrentCLuster))[1]=gc_UserDataBuf[tw_WordOffset+2];
						((U8 *)(&tdw_CurrentCLuster))[2]=gc_UserDataBuf[tw_WordOffset+1];
						((U8 *)(&tdw_CurrentCLuster))[3]=gc_UserDataBuf[tw_WordOffset];	
					}
					tdw_fatOffset = tdw_CurrentCLuster<< gc_DOS_FileSystemType;
				}
				else //(gc_DOS_FileSystemType==0)
				{//FAT12, Ching: Not consider case of SectorSize>512
					if(tdw_CurrentCLuster>=0xff8)
					{						
						return(0xffffffff);
					}				
					if(tdw_CurrentCLuster%2==0)
					{//Current CLusternum is even						
						if((tw_WordOffset+1)==gw_DOS_SectorSize)
						{
							tdw_CLusterNUM=gc_UserDataBuf[tw_WordOffset];
							tc_SectorChang=1;							
							tdw_fatOffset++;											
							break;
						}
						if(tc_SectorChang)
						{
							tc_SectorChang=0;
							tdw_CurrentCLuster=(((U32)(gc_UserDataBuf[0]&0x0f))<<8)|tdw_CLusterNUM;
						}
						else
						{
							tdw_CurrentCLuster=(((U32)(gc_UserDataBuf[tw_WordOffset+1]&0x0f))<<8)|\
												(U32)gc_UserDataBuf[tw_WordOffset];	
						}
					}
					else
					{//Current CLusternum is odd					
						if((tw_WordOffset+1)==gw_DOS_SectorSize)
						{					
							tdw_CLusterNUM=(gc_UserDataBuf[tw_WordOffset]&0xf0)>>4;
							tc_SectorChang=1;							
							tdw_fatOffset++;						
							break;
						}
						if(tc_SectorChang)
						{													
							tc_SectorChang=0;
							tdw_CurrentCLuster=((U32)(gc_UserDataBuf[0])<<4)|(U32)tdw_CLusterNUM;
						}
						else
						{						
							tdw_CurrentCLuster=((U32)gc_UserDataBuf[tw_WordOffset+1]<<4)|\
												((U32)(gc_UserDataBuf[tw_WordOffset]&0xf0)>>4);
						}						
					}
					tdw_fatOffset = (tdw_CurrentCLuster*3) >> 1;
				}
			    
				tdw_ClusterNumCounter++;
				if(tdw_ClusterNumCounter==tdw_ClusterNumber)
				{		
					return(tdw_CurrentCLuster);
				}
			}//while		
		}
		else
		{
			return(0xffffffff);
		}	
	}//for
	 
}
//-------------------------------------------------------------------------------
U8 DOS_MarkFATUpdate(U32 tdw_MarkFATAddr,U8 tc_Value)
{
	U8	tc_Status;
	
	gc_ReadWriteDataArea = 0;//select gc_PlayRecordDataBuf[]
	tc_Status = DOS_Read_LogicSector(tdw_MarkFATAddr, 1);//read sector


	if (tc_Status == DOS_SUCCESS)
	{
		gc_PlayRecordDataBuf[0] = tc_Value;//mark first byte
		tc_Status = DOS_Write_LogicSector(tdw_MarkFATAddr, 1);//write sector
			
	}

	return tc_Status;
}
//-------------------------------------------------------------------------------
U8 DOS_SearchFreeCluster(U8 tc_SearchMode)
{
	U32 tdw_FatSectorOffset;     		         
	U32 tdw_FreeClusterNum;	 	         	 
	U32 tdw_FreeClusterCounter=0;	            							             
	U32 tdw_FatValue,tdw_SectorByteOffset;
	U16 tw_BoffsetSort;	   	
	U8 tc_SectorChang=0;
	U8 tc_SectotCounter;
	U16 tw_LoopTimer;
	U16 tw_residual;        //lizhn 041217
    U32 uTemp;
	gc_ReadWriteDataArea=1;	 
	
	if(gc_DOS_Status>0x80)
	{
		return(0xff);			
	}
	tc_SearchMode = 1;
	if(gc_ClusBufValidSize<8)
	{//存储空簇的BUFF没有满
		if(gdw_FreeClusterNum[0]<(gdw_DOS_FatMaxCluster-1))
		{//指针0没有检索到最后一簇
			tc_SearchMode = 0;		
		}	
	}
	tdw_FreeClusterNum=gdw_FreeClusterNum[tc_SearchMode]+1;	      //接着上一次的地方继续检索
	if(tdw_FreeClusterNum==gdw_DOS_FatMaxCluster)
	{  		
		return 0;
	}	 	
	
	if(gc_DOS_FileSystemType==0)
	{
		tdw_SectorByteOffset = (tdw_FreeClusterNum*3)>> 1;//fat12 
	}else{		
		tdw_SectorByteOffset = tdw_FreeClusterNum<< gc_DOS_FileSystemType;//fat16 or fat32  		
	}	
	for(tdw_FatSectorOffset=(tdw_SectorByteOffset/512);tdw_FatSectorOffset<gdw_DOS_SectorPerFAT;tdw_FatSectorOffset++)
	{//find in fat1; 		
		DOS_Read_LogicSector((gdw_DOS_Fat1Addr+tdw_FatSectorOffset),1);	
		tc_SectotCounter=tdw_FatSectorOffset%3;			
		tw_residual = 512-(tdw_SectorByteOffset&0x1FF);	
		if(tdw_FatSectorOffset==(gdw_DOS_SectorPerFAT-1))
		{			
			tw_LoopTimer = (gdw_DOS_FatMaxCluster-tdw_FreeClusterNum);		
		}
		else
 	    {
			if(gc_DOS_FileSystemType==0)
			{
				tw_LoopTimer = (tw_residual<<1)/3;
				if (tc_SectotCounter != 2)
				{//如果是FAT的第3扇区就不需要加1,否则会导致录音文件在FAT12跨第3个扇区时,文会无法复制到PC,连接FAT时出现错误
					tw_LoopTimer++;						
				}		
			}
			else
			{				
				tw_LoopTimer = tw_residual>>gc_DOS_FileSystemType;
				
			}
		}	
		while(tw_LoopTimer)
		{ 		
			if(tdw_FreeClusterNum>=gdw_DOS_FatMaxCluster)
			{  		
				return 0;
			}		
			tw_BoffsetSort = tdw_SectorByteOffset&0x1FF;		//040825  			
			if(gc_DOS_FileSystemType==0)
			{//FAT12
				if(tdw_FreeClusterNum&0x01)
				{//the clusternum is odd	 										
					if(tw_BoffsetSort+1==gw_DOS_SectorSize)
					{//one sector is finish	 					
						tdw_FatValue=(gc_UserDataBuf[tw_BoffsetSort]&0xf0)>>4;
						tc_SectorChang=1;
						tdw_SectorByteOffset++;
						break;
					}				
					if(tc_SectorChang)
					{//the end of one sector
						tc_SectorChang=0;
						tdw_FatValue=((U32)(gc_UserDataBuf[0])<<4)|tdw_FatValue;	
					}
					else
					{						
						tdw_FatValue=((U32)gc_UserDataBuf[tw_BoffsetSort+1]<<4)|\
										((U32)(gc_UserDataBuf[tw_BoffsetSort]&0xf0)>>4);
					}				
				}
				else
				{//the clusternum is even				
					if(tw_BoffsetSort+1==gw_DOS_SectorSize)
					{//one sector is finish					
						tdw_FatValue=gc_UserDataBuf[tw_BoffsetSort];
						tc_SectorChang=1;
						tdw_SectorByteOffset++;
						break;
					}
					if(tc_SectorChang)
					{//the end of one sector
						tc_SectorChang=0;
						tdw_FatValue=(((U32)(gc_UserDataBuf[0]&0x0f))<<8)|tdw_FatValue;	
					}
					else
					{					
						tdw_FatValue=(((U32)(gc_UserDataBuf[tw_BoffsetSort+1]&0x0f))<<8)|\
										(U32)gc_UserDataBuf[tw_BoffsetSort];				
	 				}					
				} 			
			}//fat12
			else 
			{			
				if(gc_DOS_FileSystemType==1)
				{//FAT16 
					((U8 *)(&tdw_FatValue))[3]=gc_UserDataBuf[tw_BoffsetSort];
					((U8 *)(&tdw_FatValue))[2]=gc_UserDataBuf[tw_BoffsetSort+1]; 
					((U8 *)(&tdw_FatValue))[1]=0;
					((U8 *)(&tdw_FatValue))[0]=0; 
				}
				else if(gc_DOS_FileSystemType==2)
				{//FAT32		
					((U8 *)(&tdw_FatValue))[3]=gc_UserDataBuf[tw_BoffsetSort];
					((U8 *)(&tdw_FatValue))[2]=gc_UserDataBuf[tw_BoffsetSort+1];
					((U8 *)(&tdw_FatValue))[1]=gc_UserDataBuf[tw_BoffsetSort+2];
					((U8 *)(&tdw_FatValue))[0]=gc_UserDataBuf[tw_BoffsetSort+3];
				}
			}			
			gdw_FreeClusterNum[tc_SearchMode]= tdw_FreeClusterNum; 			
			if(tdw_FatValue==0)
			{//find free cluster					
				if(!tc_SearchMode)
				{
					uTemp=gc_ClusBufValidPoint+gc_ClusBufValidSize;								
					if(uTemp>=8)
					{
						uTemp-=8;
					}
					gdw_ClusterBuffer[uTemp]=tdw_FreeClusterNum;

					gc_ClusBufValidSize++;
					if(gc_ClusBufValidSize==8)
					{
						return 0;
					}													
				}
				else 
				{				
			
					gdw_TotalFreeClusNumber++;					
																			
				}			
			}//find free cluster 		
		
			tdw_FreeClusterNum++;
			tw_LoopTimer--;
			if(gc_DOS_FileSystemType==0)
			{				 
				tdw_SectorByteOffset = (tdw_FreeClusterNum*3)>> 1;//fat12
							 
			}else
			{						
				tdw_SectorByteOffset+= gc_DOS_FileSystemType*2;//fat16 or fat32  		
			} 		
			
		}//while
		if(tc_SectotCounter==2)
		{
			return 0; 		
		} 			  				
	}
	
    return 0;
}
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------

⌨️ 快捷键说明

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