?? fatfunction.c
字號(hào):
Cluster = ( ( ProcessSector - FAT.RsvdSecCnt ) << ( FAT.shift - 1 ) ) + ( ( POINT0 - DISKBUF ) >> 1 ) ;
else
Cluster = 0x00 ;
return( Cluster ) ;
}
/*********************************************************************************************************
** 函數(shù)名稱: xProcessDirectory
** 功能描述: 處理目錄/文件名
**
** 輸 入: wr: 指向文件信息結(jié)構(gòu)FILE的指針
** Attribute: 目錄/文件操作模式
** A.模式ModeX1: 創(chuàng)建新文件
** B.模式ModeX2: 創(chuàng)建新目錄
** C.模式ModeX3: 對(duì)打開的文件截0
** D.模式ModeX4: 刪除文件/目錄
** 輸 出: 根據(jù)模式選擇完成相應(yīng)的操作
** A.返回ERR_Directory 報(bào)告異常傳輸錯(cuò)誤
** B.返回DirectorySuccess表示操作成功完成
**
** 全局變量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, FAT.FirstSectofClu
** 調(diào)用模塊: mReadSector, mWriteSector, x16CheckClus, x16List
** 調(diào)試碼: 無
**
**
** 作 者: 徐亦朱
** 日 期: 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 ;
//計(jì)算系統(tǒng)日期、時(shí)間
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 ; //計(jì)算該簇號(hào)對(duì)應(yīng)的起始扇區(qū)數(shù)
//為新目錄分配簇后,須將該簇初始化
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內(nèi)操作
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 ;
//回寫數(shù)據(jù)到目錄內(nèi)
s = mWriteSector( ProcessSector, TransNum, DISKBUF );
if ( s != USB_INT_SUCCESS )
return( ERR_Directory ) ;
return( DirectorySuccess ) ;
}
/*********************************************************************************************************
** 函數(shù)名稱: x16RootDirectory
** 功能描述: FAT16根目錄下新建目錄/文件名
**
** 輸 入: wr : 指向文件信息結(jié)構(gòu)FILE的指針
** Attribute: 目錄/文件操作模式
** A.模式ModeX1: 創(chuàng)建新文件
** B.模式ModeX2: 創(chuàng)建新目錄
** 輸 出: 根據(jù)模式選擇完成相應(yīng)的操作
** A.返回ERR_Directory 報(bào)告異常傳輸錯(cuò)誤
** B.返回DirectorySuccess表示操作成功完成
** C.返回ERR_FullRoot報(bào)告根目錄已寫滿,無法正常創(chuàng)建文件/目錄
**
** 全局變量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, FAT.RootDirSectors, FAT.FirstRootSector,
** 調(diào)用模塊: mReadSector, mWriteSector, xProcessDirectory
** 調(diào)試碼: 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 ;
//在范圍內(nèi)( 1簇或根目錄內(nèi) )查找文件
while ( TotalSectors )
{
//更新讀取扇區(qū)參數(shù)
ProcessSector += TransNum ;
TransNum = TotalSectors >= DiskNums ? DiskNums : TotalSectors ;
//讀取根目錄N個(gè)扇區(qū)( 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 ) ) //若是空文件項(xiàng),則退出
{
FindFlag = 1 ;
wr -> find.TransNum = TransNum ;
wr -> find.Sector = ProcessSector ;
wr -> find.Offset = POINT1 ;
//調(diào)試語句
#ifdef DEBUG_YCF
printf( " 找到目錄/文件 !\n " ) ;
printf( " 文件地址信息記錄:\n " ) ;
printf( " 本次傳輸?shù)纳葏^(qū)數(shù):%d\n ", ( UINT16 )wr -> find.TransNum ) ;
printf( " 本次傳輸?shù)钠鹗忌葏^(qū)號(hào):%ld\n ", wr -> find.Sector ) ;
printf( " 本次傳輸?shù)纳葏^(qū)內(nèi)偏移:%p \n ", wr -> find.Offset ) ;
#endif
break ;
}
}
if ( FindFlag )
break ;
TotalSectors -= TransNum ;
}
//判斷查找結(jié)果
if ( ! FindFlag )
return( ERR_FullRoot ) ;
wr -> clus.fat16.LastClus = 0 ;
s = xProcessDirectory( wr, Attribute ) ;
return( s ) ;
}
/*********************************************************************************************************
** 函數(shù)名稱: x16Creat
** 功能描述: FAT16目錄下處理目錄/文件名
**
** 輸 入: wr : 指向文件信息結(jié)構(gòu)FILE的指針
** Attribute: 目錄/文件操作模式
** A.模式ModeX1: 創(chuàng)建新文件
** B.模式ModeX2: 創(chuàng)建新目錄
** 輸 出: 根據(jù)模式選擇完成相應(yīng)的操作
** A.返回ERR_Creat 報(bào)告異常傳輸錯(cuò)誤
** B.返回Creat_Success表示操作成功完成
**
** 全局變量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector
** FAT.SecPerClus, FAT.FirstSectofClu, FAT.shift, DiskNums
** 調(diào)用模塊: mReadSector, mWriteSector, x16List, x16CheckClus, xProcessDirectory
** 調(diào)試碼: 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( " 文件不存在,創(chuàng)建新文件 " ) ;
#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 ;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -