📄 dosfat.c
字号:
#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 + -