第一层为NandFlash驱动层,第二层规定TAB文件表与文件内容页的关联关系,第三层提供机器操作文件的接口针对页读写,第四层提供标准的类似于window的文件管理接口
文件类型分为以下几种,创建的泛型文件容器可以用来存储文件夹、文件、链接等文件类型,并且长度可以为变长、固定长、
enum FileType{
FT_ReadyRoom=0xef,//未定义长度的泛型文件存储区
FT_File=0x1f,//文件类型的未定义长度存储区
FT_FileHead=0x1e,//文件首
FT_FileCoutext=0x1c,//文件中
FT_FileEnd=0x18,//文件尾部
FT_Folde=0x2f,//文件夹类型的未定义长度存储区
FT_FolderHead=0x2e,
FT_FolderCoutext=0x2c,
FT_FolderEnd=0x28,
FT_Link=0x3f,//链接类型的未定义长度存储区
FT_LinkHead=0x3e,
FT_LinkCoutext=0x3c,
FT_LinkEnd=0x38,
};
文件信息File_File存在于文件内容区的每个被使用的内容页的Spare区域的首部,用来描述该页的内容详细信息
typedef struct
{
uint8 Page_Status;//该区域为页最重要的位置
uint8 FileType;//该页内容类型
uint8 PS_ST;//页状态暂时未使用
uint8 FileName[14];//文件名长度为14个字节
uint8 FileFormat[6];//文件格式
uint8 FileVirtue;//文件属性
Date_Time CreateDate;//文件创建时间
Date_Time ReBuildDate;//文件修改时间
uint32 PreviousPageAddr;//上一页的相对地址
uint32 NextPageAddr;//下一页的相对地址
uint32 FileSize;//该文件总长度(变长文件该值为0xfffffff)
uint16 DataLegnth;//当前页内容长度 偏移地址为SpareLength+2字节长度
uint32 FileID;//文件ID等于文件头所在页的相对位置
uint16 SpareCrc;这是在整个页面被使用完后处理的 File_Infor除去校验码以外的crc数据校验值
uint16 PageCrc;这是在整个页面被使用完后处理的 文件内容页的数据校验值
}File_Infor;//文件头结构体//文件头页不存放任何文件内容,只存放文件信息
#include
#include
#include
TQFS_Open_File Open_File;
uint8 TQFS_FileDelete(uint8 *Path)
{
StringCoppy(Path,&Open_File.Path[0]);
return 0;
}
void TQFS_FileRoomInfor(File_Infor *FI,void *File,uint32 FileSize,uint8 FileVirtue)
{
uint8 Buf[14];
BufferFill(FI,0xff,sizeof(File_Infor));//配置不设置项为不修改状态
GetFileName(File,&Buf[0]);
StringCoppy(&Buf[0],&FI->FileName[0]);
GetFileFormat(File,&Buf[0]);
StringCoppy(&Buf[0],&FI->FileFormat[0]);
FI->FileType=FT_ReadyRoom;//待分配的文件类型
BufferCoppy(&NowTime,&FI->CreateDate,sizeof(Date_Time));
FI->Page_Status=PS_BeUse;//页即将被使用
if(FileSize)FI->FileSize=FileSize;
//FI->FileID=rand();//文件ID其实就是随机数,但必须保证同一个文件的ID号相同
FI->FileVirtue=FileVirtue;//可读可写隐藏等属性
}
uint32 TQFS_CreateFileRoom(uint32 Page,File_Infor *FI)
{
FI->FileID=Page;
DeBug("Create Object File In Page[%d]",Page,Infor_Infor);
Write_FileInfor(Page,FI);
TQFS_SetCursor(Page,0);
return 0;
}
void TQFS_SetCursor(uint32 Page,uint16 Offset)
{
Open_File.PageCursor=Page;
Open_File.OffsetCursor=Offset;
}
TQFS_Error TQFS_ReadPageContext(uint8 *rBuffer,uint16 Length)
{
File_Infor TempFile;
int OviLenth;
uint16 Offset=0;
OviLenth=(Open_File.OffsetCursor+Length);
OviLenth-=NAND_PAGE_SIZE;//写不下的长度
if(OviLenth>=0)//当前页不够
{
Nand_ReadPage(Nand_Infor.FileStartPage+Open_File.PageCursor,&rBuffer[Offset],Open_File.OffsetCursor+NAND_SPARE_SIZE,Length-OviLenth);
Offset=Length-OviLenth;
Open_File.OffsetCursor=0;
Read_FileInfor(Open_File.PageCursor,&TempFile);
if(TempFile.NextPageAddr==0xffffffff)return TE_NoNextPage;
else{
Open_File.PageCursor=TempFile.NextPageAddr;
Length=OviLenth;
}
}
Nand_ReadPage(Nand_Infor.FileStartPage+Open_File.PageCursor,&rBuffer[Offset],Open_File.OffsetCursor+NAND_SPARE_SIZE,Length);
Open_File.OffsetCursor+=Length;
if(OviLenth>=0)return TE_NewPage;
else return TE_CurrentPage;
}
TQFS_Error TQFS_WritePageContext(uint8 *Buffer,uint16 Length)
{
File_Infor TempFile;
int OviLenth;
uint16 Offset=0;
OviLenth=(Open_File.OffsetCursor+Length);
OviLenth-=NAND_PAGE_SIZE;//写不下的长度
if(OviLenth>=0)//当前页不够
{
Nand_WritePage(Nand_Infor.FileStartPage+Open_File.PageCursor,&Buffer[Offset],Open_File.OffsetCursor+NAND_SPARE_SIZE,Length-OviLenth);
Offset=Length-OviLenth;
Open_File.OffsetCursor=0;
Read_FileInfor(Open_File.PageCursor,&TempFile);
TempFile.NextPageAddr=TQFS_FindFirstUsingPage(0);//页不够时寻找下一个空页
TempFile.Page_Status=PS_UsedFully;//标记页被使用完
Write_FileInfor(Open_File.PageCursor,&TempFile);//在当前页写入下页地址
Open_File.PageCursor=TempFile.NextPageAddr;
TempFile.Page_Status=PS_NotFully;
TempFile.PreviousPageAddr=Open_File.PageCursor;
TempFile.NextPageAddr=0xffffffff;
Write_FileInfor(Open_File.PageCursor,&TempFile);//在当前页写入下页地址
Open_File.PageCursor=TempFile.NextPageAddr;
Length=OviLenth;
}
Nand_WritePage(Nand_Infor.FileStartPage+Open_File.PageCursor,&Buffer[Offset],Open_File.OffsetCursor+NAND_SPARE_SIZE,Length);
Open_File.OffsetCursor+=Length;
if(OviLenth>=0)return TE_NewPage;
else return TE_CurrentPage;
}
uint8 TQFS_FileCreate(uint8 *Path,uint8 State)
{
return 0;
}