📄 fatfunction.c
字号:
Cluster = ( ( ProcessSector - FAT.RsvdSecCnt ) << ( FAT.shift - 1 ) ) + ( ( POINT0 - DISKBUF ) >> 1 ) ;
else
Cluster = 0x00 ;
return( Cluster ) ;
}
/*********************************************************************************************************
** 函数名称: xProcessDirectory
** 功能描述: 处理目录/文件名
**
** 输 入: wr: 指向文件信息结构FILE的指针
** Attribute: 目录/文件操作模式
** A.模式ModeX1: 创建新文件
** B.模式ModeX2: 创建新目录
** C.模式ModeX3: 对打开的文件截0
** D.模式ModeX4: 删除文件/目录
** 输 出: 根据模式选择完成相应的操作
** A.返回ERR_Directory 报告异常传输错误
** B.返回DirectorySuccess表示操作成功完成
**
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, FAT.FirstSectofClu
** 调用模块: mReadSector, mWriteSector, x16CheckClus, x16List
** 调试码: 无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 xProcessDirectory( FILE * wr, UINT8 Attribute )
{
UINT8 s ;
UINT16 i ;
UINT8 TransNum ;
UINT8 *POINT0 ;
UINT8 *POINT1 ;
UINT8 Directory[ 32 ] = { 0x2E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,
0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00 } ;
UINT16 time ;
UINT16 date ;
UINT16 Cluster ;
UINT32 ProcessSector ;
//计算系统日期、时间
time = sysclock.time.hour << 11 + sysclock.time.min << 5 + sysclock.time.sec >> 1 ;
date = sysclock.date.year >> 9 + sysclock.date.month << 5 + sysclock.date.day ;
if ( Attribute == ModeX2 )
{
Cluster = x16CheckClus( ) ;
if ( Cluster == 0x00 )
return( ERR_FullDisk ) ;
else if ( Cluster == ERR_CheckClus )
return( ERR_CheckClus ) ;
s = x16List( Cluster, 0xFFFF, ModeZ1 ) ; //更新FAT表中簇信息
if( s != ListSuccess )
return( s ) ;
FAT.FirstSectofClu = ( ( Cluster - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ; //计算该簇号对应的起始扇区数
//为新目录分配簇后,须将该簇初始化
for ( i = 0; i < FAT.BytesPerSec; i ++ )
DISKBUF[ i ] = 0 ;
for ( ProcessSector = FAT.FirstSectofClu; ProcessSector < FAT.FirstSectofClu + FAT.SecPerClus ; ProcessSector ++ )
{
s = mWriteSector( ProcessSector, 0x01, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Write ) ;
}
Directory[ 14 ] = ( UINT8 )time ;
Directory[ 15 ] = ( UINT8 )( time >> 8 ) ;
Directory[ 16 ] = ( UINT8 )date ;
Directory[ 17 ] = ( UINT8 )( date >> 8 ) ;
Directory[ 18 ] = ( UINT8 )date ;
Directory[ 19 ] = ( UINT8 )( date >> 8 ) ;
Directory[ 22 ] = ( UINT8 )time ;
Directory[ 23 ] = ( UINT8 )( time >> 8 ) ;
Directory[ 24 ] = ( UINT8 )date ;
Directory[ 25 ] = ( UINT8 )( date >> 8 ) ;
Directory[ 26 ] = ( UINT8 )Cluster ;
Directory[ 27 ] = ( UINT8 )( Cluster >> 8 ) ;
memcpy ( DISKBUF, Directory, 32 ) ;
Directory[ 1 ] = 0x2E ;
Directory[ 26 ] = ( UINT8 )wr -> clus.fat16.LastClus ;
Directory[ 27 ] = ( UINT8 )( wr -> clus.fat16.LastClus >> 8 ) ;
memcpy ( DISKBUF+32, Directory, 32 ) ;
s = mWriteSector( FAT.FirstSectofClu, 0x01, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Write ) ;
TransNum = wr -> find.TransNum ;
ProcessSector = wr -> find.Sector ;
s = mReadSector( ProcessSector, TransNum ,DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Check ) ;
}
POINT0 = wr -> find.Offset ;
TransNum = wr -> find.TransNum ;
ProcessSector = wr -> find.Sector ;
//DISK_BUF内操作
POINT1 = wr -> Name ;
if ( Attribute == ModeX4 )
( ( PUSB_FDT )POINT0 ) -> FileName [ 0 ] = 0xE5 ;
else
( ( PUSB_FDT )POINT0 ) -> FileName [ 0 ] = * POINT1 ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 1 ] = *( POINT1 + 1 ) ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 2 ] = *( POINT1 + 2 ) ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 3 ] = *( POINT1 + 3 ) ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 4 ] = *( POINT1 + 4 ) ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 5 ] = *( POINT1 + 5 ) ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 6 ] = *( POINT1 + 6 ) ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 7 ] = *( POINT1 + 7 ) ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 8 ] = *( POINT1 + 8 ) ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 9 ] = *( POINT1 + 9 ) ;
( ( PUSB_FDT )POINT0 ) -> FileName [ 10 ]= *( POINT1 + 10 ) ;
if ( Attribute == ModeX2 )
( ( PUSB_FDT )POINT0 ) -> Attribute = 0x10 ;
else
( ( PUSB_FDT )POINT0 ) -> Attribute = 0x00 ;
( ( PUSB_FDT )POINT0 ) -> Reserved_NT = 0x00 ;
( ( PUSB_FDT )POINT0 ) -> CtrlTimeTeenth = 0x00 ;
( ( PUSB_FDT )POINT0 ) -> CrtTime [ 0 ] = ( UINT8 )time ;
( ( PUSB_FDT )POINT0 ) -> CrtTime [ 1 ] = ( UINT8 )( time >> 8 ) ;
( ( PUSB_FDT )POINT0 ) -> CrtDate [ 0 ] = ( UINT8 )date ;
( ( PUSB_FDT )POINT0 ) -> CrtDate [ 1 ] = ( UINT8 )( date >> 8 ) ;
( ( PUSB_FDT )POINT0 ) -> LastAccDate [ 0 ] = ( UINT8 )date;
( ( PUSB_FDT )POINT0 ) -> LastAccDate [ 1 ] = ( UINT8 )( date >> 8 ) ;
( ( PUSB_FDT )POINT0 ) -> Reserved [ 0 ] = 0x00 ;
( ( PUSB_FDT )POINT0 ) -> Reserved [ 1 ] = 0x00 ;
( ( PUSB_FDT )POINT0 ) -> WrtTime [ 0 ] = ( UINT8 )time ;
( ( PUSB_FDT )POINT0 ) -> WrtTime [ 1 ] = ( UINT8 )( time >> 8 ) ;
( ( PUSB_FDT )POINT0 ) -> WrtDate [ 0 ] = ( UINT8 )date ;
( ( PUSB_FDT )POINT0 ) -> WrtDate [ 1 ] = ( UINT8 )( date >> 8 ) ;
if ( Attribute == ModeX2 )
{
( ( PUSB_FDT )POINT0 ) -> StartClus [ 0 ] = ( UINT8 )Cluster ;
( ( PUSB_FDT )POINT0 ) -> StartClus [ 1 ] = ( UINT8 )( Cluster >> 8 ) ;
}
else
{
( ( PUSB_FDT )POINT0 ) -> StartClus [ 0 ] = 0x00 ;
( ( PUSB_FDT )POINT0 ) -> StartClus [ 1 ] = 0x00 ;
}
( ( PUSB_FDT )POINT0 ) -> FileSize [ 0 ] = 0x00 ;
( ( PUSB_FDT )POINT0 ) -> FileSize [ 1 ] = 0x00 ;
( ( PUSB_FDT )POINT0 ) -> FileSize [ 2 ] = 0x00 ;
( ( PUSB_FDT )POINT0 ) -> FileSize [ 3 ] = 0x00 ;
//回写数据到目录内
s = mWriteSector( ProcessSector, TransNum, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Directory ) ;
return( DirectorySuccess ) ;
}
/*********************************************************************************************************
** 函数名称: x16RootDirectory
** 功能描述: FAT16根目录下新建目录/文件名
**
** 输 入: wr : 指向文件信息结构FILE的指针
** Attribute: 目录/文件操作模式
** A.模式ModeX1: 创建新文件
** B.模式ModeX2: 创建新目录
** 输 出: 根据模式选择完成相应的操作
** A.返回ERR_Directory 报告异常传输错误
** B.返回DirectorySuccess表示操作成功完成
** C.返回ERR_FullRoot报告根目录已写满,无法正常创建文件/目录
**
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, FAT.RootDirSectors, FAT.FirstRootSector,
** 调用模块: mReadSector, mWriteSector, xProcessDirectory
** 调试码: DEBUG_YCF
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 x16RootDirectory( FILE * wr, UINT8 Attribute )
{
UINT8 s ;
UINT8 *POINT1 ;
UINT8 FindFlag ;
UINT8 TransNum ;
UINT16 TransBytes ;
UINT16 TotalSectors ;
UINT32 ProcessSector ;
//初始化变量
FindFlag = 0 ;
TransNum = 0 ;
TotalSectors = FAT.RootDirSectors ;
ProcessSector = FAT.FirstRootSector ;
//在范围内( 1簇或根目录内 )查找文件
while ( TotalSectors )
{
//更新读取扇区参数
ProcessSector += TransNum ;
TransNum = TotalSectors >= DiskNums ? DiskNums : TotalSectors ;
//读取根目录N个扇区( N <= SecNum_of_BUF )到DISK_BUF中
s = mReadSector( ProcessSector ,TransNum ,DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Check ) ;
//在DISK_BUF中查找文件
TransBytes = TransNum << FAT.shift ;
for ( POINT1 = DISKBUF ; POINT1 < DISKBUF + TransBytes ; POINT1 += 32 )
{
if ( ! ( *POINT1 ) || ( *POINT1 == 0xE5 ) || ( *POINT1 == 0x05 ) ) //若是空文件项,则退出
{
FindFlag = 1 ;
wr -> find.TransNum = TransNum ;
wr -> find.Sector = ProcessSector ;
wr -> find.Offset = POINT1 ;
//调试语句
#ifdef DEBUG_YCF
printf( " 找到目录/文件 !\n " ) ;
printf( " 文件地址信息记录:\n " ) ;
printf( " 本次传输的扇区数:%d\n ", ( UINT16 )wr -> find.TransNum ) ;
printf( " 本次传输的起始扇区号:%ld\n ", wr -> find.Sector ) ;
printf( " 本次传输的扇区内偏移:%p \n ", wr -> find.Offset ) ;
#endif
break ;
}
}
if ( FindFlag )
break ;
TotalSectors -= TransNum ;
}
//判断查找结果
if ( ! FindFlag )
return( ERR_FullRoot ) ;
wr -> clus.fat16.LastClus = 0 ;
s = xProcessDirectory( wr, Attribute ) ;
return( s ) ;
}
/*********************************************************************************************************
** 函数名称: x16Creat
** 功能描述: FAT16目录下处理目录/文件名
**
** 输 入: wr : 指向文件信息结构FILE的指针
** Attribute: 目录/文件操作模式
** A.模式ModeX1: 创建新文件
** B.模式ModeX2: 创建新目录
** 输 出: 根据模式选择完成相应的操作
** A.返回ERR_Creat 报告异常传输错误
** B.返回Creat_Success表示操作成功完成
**
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector
** FAT.SecPerClus, FAT.FirstSectofClu, FAT.shift, DiskNums
** 调用模块: mReadSector, mWriteSector, x16List, x16CheckClus, xProcessDirectory
** 调试码: DEBUG_CREAT
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 x16Creat( FILE * wr, UINT8 Attribute )
{
UINT8 s ;
UINT8 FindFlag ;
UINT8 *POINT0 ;
UINT8 *POINT2 ;
UINT8 TransNum ;
UINT8 TotalSectors ;
UINT16 TransBytes ;
UINT16 Cluster ;
UINT16 NextCluster ;
UINT32 ProcessSector ;
#ifdef DEBUG_CREAT
printf( " 文件不存在,创建新文件 " ) ;
#endif
//读取目录信息
ProcessSector = wr -> find.Sector ;
POINT0 = wr -> find.Offset ;
TransNum = wr -> find.TransNum ;
s = mReadSector( ProcessSector, TransNum, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Read ) ;
Cluster = ( UINT16 )( *( POINT0 + 26 ) ) | ( UINT16 )( *( POINT0 + 27 ) ) << 8 ;
wr -> clus.fat16.LastClus = Cluster ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -