fdt.c

来自「Atmega64单片机程序(完整工程)」· C语言 代码 · 共 763 行 · 第 1/2 页

C
763
字号
#define   IN_FDT 

#include "SYS_Config.h" 
#include "fat.h" 

/*********************************************************************************************************
** 函数名称: ClearClus
** 功能描述: 将指定簇所有数据清零
** 输   入: Disk:逻辑盘信息
**           Index:簇号
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,OpenSec,WriteSec,CloseSec
********************************************************************************************************/
INT8U ClearClus(INT8U Drive,INT32U Index)
{
    INT8U i,temp ;
    INT32U SecIndex ;
    Disk_Info *Disk ;
    
    Disk=GetDiskInfo(Drive);
    if(Disk!=NULL)
    {
        if(Index<Disk->ClusPerData)
        {
            temp=Disk->SecPerClus ;
            Index-=2 ;
            SecIndex=Disk->DataStartSec+Index*temp ;/* 2:保留簇数 */
            for(i=0;i<temp;i++)
            {
                OpenSec(Drive,SecIndex);
                WriteSec(Drive,SecIndex);
                CloseSec(Drive,SecIndex);
                SecIndex++;
            }
            return RETURN_OK ;
        }
        else 
        {
            return CLUSTER_NOT_IN_DISK ;
        }
    }
    else 
    {
        return NOT_FIND_DISK ;
    }
}

/*********************************************************************************************************
** 函数名称: ReadFDTInfo
** 功能描述: 读取FDT信息
** 输   入: Rt:存储返回信息的指针
**           Drive:驱动器号
**           SecIndex:扇区号
**           ByteIndex:偏移量
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: OpenSec,ReadSec,CloseSec
********************************************************************************************************/
INT8U ReadFDTInfo(FDT *Rt,INT8U Drive,INT32U SecIndex,INT16U ByteIndex)
{
    INT8U *Buf ;
    INT8U temp ;
    
    Buf=OpenSec(Drive,SecIndex);
    temp=NOT_EMPTY_CACHE ;
    if(Buf!=NULL)
    {
        temp=ReadSec(Drive,SecIndex);
        if(temp==RETURN_OK)
        {
            Buf=Buf+ByteIndex ;
            Rt->Name[0]=*Buf++;
            Rt->Name[1]=*Buf++;
            Rt->Name[2]=*Buf++;
            Rt->Name[3]=*Buf++;
            Rt->Name[4]=*Buf++;
            Rt->Name[5]=*Buf++;
            Rt->Name[6]=*Buf++;
            Rt->Name[7]=*Buf++;
            Rt->Name[8]=*Buf++;
            Rt->Name[9]=*Buf++;
            Rt->Name[10]=*Buf++;
            Rt->Attr=*Buf++;
            Rt->NTRes=*Buf++;
            Rt->CrtTimeTenth=*Buf++;
            Rt->CrtTime=Buf[0]|( (INT16U)Buf[1]<<8 );
            Rt->CrtDate=Buf[2]|( (INT16U)Buf[3]<<8 );
            Rt->LstAccDate=Buf[4]|( (INT16U)Buf[5]<<8 );
            Rt->FstClusHI=Buf[6]|( (INT16U)Buf[7]<<8 );
            Rt->WrtTime=Buf[8]|( (INT16U)Buf[9]<<8 );
            Rt->WrtDate=Buf[10]|( (INT16U)Buf[11]<<8 );
            Rt->FstClusLO=Buf[12]|( (INT16U)Buf[13]<<8 );
	    
            Rt->FileSize=Buf[14]|( (INT32U)Buf[15]<<8 );
            Rt->FileSize|=(( (INT32U)Buf[16]<<16 )|( (INT32U)Buf[17]<<24) );
            temp=RETURN_OK ;
        }
        CloseSec(Drive,SecIndex);
    }
    return temp ;
}

/*********************************************************************************************************
** 函数名称: WriteFDTInfo
** 功能描述: 写FDT信息
** 输   入: Drive:驱动器号
**           SecIndex:扇区号
**           ByteIndex:偏移量
**           FDT *FDTData:数据
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: OpenSec,ReadSec,CloseSec
********************************************************************************************************/
INT8U WriteFDTInfo(INT8U Drive,INT32U SecIndex,INT16U ByteIndex,FDT *FDTData)
{
    INT8U *Buf ;
    INT8U temp ;
    
    temp=NOT_EMPTY_CACHE ;
    Buf=OpenSec(Drive,SecIndex);
    if(Buf!=NULL)
    {
        temp=ReadSec(Drive,SecIndex);
        if(temp==RETURN_OK)
        {
             Buf=Buf+ByteIndex ;
            *Buf++=FDTData->Name[0];
            *Buf++=FDTData->Name[1];
            *Buf++=FDTData->Name[2];
            *Buf++=FDTData->Name[3];
            *Buf++=FDTData->Name[4];
            *Buf++=FDTData->Name[5];
            *Buf++=FDTData->Name[6];
            *Buf++=FDTData->Name[7];
            *Buf++=FDTData->Name[8];
            *Buf++=FDTData->Name[9];
            *Buf++=FDTData->Name[10];
            *Buf++=FDTData->Attr ;
            *Buf++=FDTData->NTRes ;
            *Buf++=FDTData->CrtTimeTenth ;
            *Buf++=FDTData->CrtTime ;
            *Buf++=(FDTData->CrtTime)>>8 ;
            *Buf++=FDTData->CrtDate ;
            *Buf++=(FDTData->CrtDate)>>8 ;
            *Buf++=FDTData->LstAccDate ;
            *Buf++=(FDTData->LstAccDate)>>8 ;
            *Buf++=FDTData->FstClusHI ;
            *Buf++=(FDTData->FstClusHI)>>8 ;
            *Buf++=FDTData->WrtTime ;
            *Buf++=(FDTData->WrtTime)>>8 ;
            *Buf++=FDTData->WrtDate ;
            *Buf++=(FDTData->WrtDate)>>8 ;
            *Buf++=FDTData->FstClusLO ;
            *Buf++=(FDTData->FstClusLO)>>8 ;
            *Buf++=(FDTData->FileSize);
            *Buf++=(FDTData->FileSize)>>8 ;
            *Buf++=(FDTData->FileSize)>>16 ;
            *Buf=(FDTData->FileSize)>>24 ;
            WriteSec(Drive,SecIndex);
        }
        CloseSec(Drive,SecIndex);
    }
    return temp ;
}

/*********************************************************************************************************
** 函数名称: GetRootFDTInfo
** 功能描述: 获取根目录指定文件(目录)信息
** 输   入: Rt:存储返回信息的指针
**           Drive:驱动器号
**           Index:文件(目录)在FDT中的位置
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,GetFDTInfo,ReadFDTInfo
********************************************************************************************************/
INT8U GetRootFDTInfo(FDT *Rt,INT8U Drive,INT32U Index)
{
    Disk_Info *Disk ;
    INT16U ByteIndex ;
    INT32U SecIndex ;
    INT8U  temp ;
    
    temp=NOT_FIND_DISK ;
    Disk=GetDiskInfo(Drive);
    if(Disk!=NULL)
    {
        temp=NOT_FAT_DISK ;
        Index=Index*32 ;/* 32:sizeof(FDT ) */
        
        if(Disk->FATType==FAT12||Disk->FATType==FAT16)
        {
            temp=FDT_OVER ;
            if(Index<(Disk->RootSecCnt*Disk->BytsPerSec))
            {
                ByteIndex=Index%Disk->BytsPerSec ;
                SecIndex=Index/Disk->BytsPerSec+Disk->RootDirTable ;
                temp=ReadFDTInfo(Rt,Drive,SecIndex,ByteIndex);
            }
        }
    }
    return temp ;
}

/*********************************************************************************************************
** 函数名称: GetFDTInfo
** 功能描述: 获取指定目录指定文件(目录)信息
** 输   入: Rt:存储返回信息的指针
**           Drive:驱动器号
**           ClusIndex:目录首簇号
**           Index:文件(目录)在FDT中的位置
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,ReadFDTInfo
********************************************************************************************************/
INT8U GetFDTInfo(FDT *Rt,INT8U Drive,INT32U ClusIndex,INT32U Index)
{
    Disk_Info *Disk ;
    INT16U ByteIndex ;
    INT32U SecIndex,i ;
    
    Disk=GetDiskInfo(Drive);
    if(Disk==NULL)
    {
        return NOT_FIND_DISK ;
    }
    
    if(ClusIndex==EMPTY_CLUS)
    {
        if(Disk->FATType==FAT32)
        {
            ClusIndex=Disk->RootDirTable ;
        }
        else 
        {
            return GetRootFDTInfo(Rt,Drive,Index);
        }
    }
    
    if((Disk->FATType==FAT12)||(Disk->FATType==FAT16)||(Disk->FATType==FAT32))
    {
        Index=Index*32 ;
        ByteIndex=Index%Disk->BytsPerSec ;
        SecIndex=Index/Disk->BytsPerSec ;
        /* 计算目录项所在扇区 */
        i=Disk->SecPerClus ;
        while(SecIndex>=i)
        {
            ClusIndex=FATGetNextClus(Drive,ClusIndex);
            if(ClusIndex<=EMPTY_CLUS_1||ClusIndex>=BAD_CLUS)
            {
                return FDT_OVER ;
            }
            SecIndex-=i ;
        }
        SecIndex=(ClusIndex-2)*i+SecIndex+Disk->DataStartSec ;
        return ReadFDTInfo(Rt,Drive,SecIndex,ByteIndex);
    }
    return NOT_FAT_DISK ;
}

/*********************************************************************************************************
** 函数名称: SetRootFDTInfo
** 功能描述: 设置根目录指定文件(目录)信息
** 输   入: FDTData:要写入的信息
**           Drive:驱动器号
**           Index:文件(目录)在FDT中的位置
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,SetFDTInfo,WriteFDTInfo
********************************************************************************************************/
INT8U SetRootFDTInfo(INT8U Drive,INT32U Index,FDT *FDTData)
{
    Disk_Info *Disk ;
    INT16U ByteIndex ;
    INT32U SecIndex ;
    INT8U Rt ;
    
    Rt=NOT_FIND_DISK ;
    Disk=GetDiskInfo(Drive);
    if(Disk!=NULL)
    {
        Index=Index*32 ;
        /* 32:sizeof(FDT ) */
        if(Disk->FATType==FAT12||Disk->FATType==FAT16)
        {
            Rt=FDT_OVER ;
            if(Index<(Disk->RootSecCnt*Disk->BytsPerSec))
            {
                ByteIndex=Index%Disk->BytsPerSec ;
                SecIndex=Index/Disk->BytsPerSec+Disk->RootDirTable ;
                Rt=WriteFDTInfo(Drive,SecIndex,ByteIndex,FDTData);
            }
        }
    }
    return Rt ;
}

/*********************************************************************************************************
** 函数名称: SetFDTInfo
** 功能描述: 设置指定目录指定文件(目录)信息
** 输   入: FDTData:要写入的信息
**           Drive:驱动器号
**           ClusIndex:目录首簇号
**           Index:文件(目录)在FDT中的位置
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,WriteFDTInfo
********************************************************************************************************/
INT8U SetFDTInfo(INT8U Drive,INT32U ClusIndex,INT32U Index,FDT *FDTData)
{
    Disk_Info *Disk ;
    INT16U ByteIndex ;
    INT32U SecIndex ;
    INT8U i ;
    
    Disk=GetDiskInfo(Drive);
    if(Disk==NULL)
    {
        return NOT_FIND_DISK ;
    }
    
    if(ClusIndex==EMPTY_CLUS)
    {
        if(Disk->FATType==FAT32)
        {
            ClusIndex=Disk->RootDirTable ;
        }
        else 
        {
            return SetRootFDTInfo(Drive,Index,FDTData);
        }
    }
    
    if(Disk->FATType==FAT12||Disk->FATType==FAT16||Disk->FATType==FAT32)
    {
        Index=Index*32 ;
        ByteIndex=Index%Disk->BytsPerSec ;
        SecIndex=Index/Disk->BytsPerSec ;
        /* 计算目录项所在扇区 */
        i=Disk->SecPerClus ;
        while(SecIndex>=i)
        {
            ClusIndex=FATGetNextClus(Drive,ClusIndex);
            if(ClusIndex<=EMPTY_CLUS_1||ClusIndex>=BAD_CLUS)
            {
                return FDT_OVER ;
            }
            SecIndex-=i ;
        }
        SecIndex=(ClusIndex-2)*i+SecIndex+Disk->DataStartSec ;
        
        return WriteFDTInfo(Drive,SecIndex,ByteIndex,FDTData);
    }
    return NOT_FAT_DISK ;
}

/*********************************************************************************************************
** 函数名称: FindFDTInfo
** 功能描述: 在指定目录查找指定文件(目录)
** 输   入: Rt:存储返回信息的指针
**           Drive:驱动器号
**           ClusIndex:目录首簇号
**           FileName:文件(目录)名
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: GetDiskInfo,GetFDTInfo
********************************************************************************************************/
INT8U FindFDTInfo(FDT *Rt,INT8U Drive,INT32U ClusIndex,char FileName[])
{
    INT32U i ;
    INT8U temp ;
    
    i=0 ;

⌨️ 快捷键说明

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