📄 flashdsk-080.cpp
字号:
/************************************************************************************/
/* */
/* 版权所有(C) 烟台东方电子集团中心研究所 */
/* */
/************************************************************************************/
/************************************************************************************/
/* */
/* 文件名称 版本号 */
/* */
/* flashdsk.cpp 1.0 */
/* */
/* 软件模块 */
/* */
/* 文件管理 */
/* */
/* 描述 */
/* */
/* 该文件定义了磁盘结构数据 */
/* */
/* 作者 */
/* */
/* 王传启 */
/* */
/*定义的数据结构 */
/* */
/* */
/* 函数 */
/* */
/* */
/* 头文件说明 */
/* */
/* df1710.h 基本数据类型定义 */
/* */
/* 修改历史 */
/* */
/* 修改人 修改日期 修改内容 */
/* */
/* 王传启 2000-4-26 初始创建,版本号1.0 */
/* 郭炜 2001-1-09 修改for AM29F040 */
/* InitFlashDisk, create_f, open_f, close_f */
/* remove_f */
/* */
/************************************************************************************/
#include "system.h"
#include "flashdsk.h"
#include "am29fxxx.h"
#include "system.h"
#if(__AM29F800_ENABLE__ == YES)
#include "am29f800.h"
#elif(__AM29F040_ENABLE__ == YES)
#include "am29f040.h"
#elif(__AM29F032_ENABLE__ == YES)
#include "am29f032.h"
#elif(__AM29F080_ENABLE__ == YES)
#include "am29f080.h"
#endif
#if(INSTALL_FLASHDISK == YES)
#if (__RAM_FILE == YES)
TFlashSectorDesp pFlashSec[]={
{0x1000 /*4k*/, PSM_SYSTEM /*系统文件区*/},
{0x1000 /*4K*/, PSM_SYSTEM /*系统文件区*/},
{0x1000 /*4k*/, PSM_FILE /*文件区*/},
{0x1000 /*4k*/, PSM_FILE /*文件区*/},
{0x1000 /*4k*/, PSM_FILE /*文件区*/},
{0x1000 /*4k*/, PSM_FILE /*文件区*/},
{0x1000 /*4k*/, PSM_FILE /*文件区*/},
{0x1000 /*4k*/, PSM_FILE /*文件区*/}
};
#endif
#if(__AM29F800_ENABLE__ == YES)
TFlashSectorDesp pFlashSec[SECTORNUM]={
{0x10000 /*64k*/, PSM_SYSTEM /*系统文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_RESERVED /*系统保留区*/}
};
#elif(__AM29F080_ENABLE__ == YES)
TFlashSectorDesp pFlashSec[]={
{0x10000 /*64k*/, PSM_SYSTEM /*系统文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_RESERVED /*系统保留区*/}
};
#elif(__AM29F032_ENABLE__ == YES)
TFlashSectorDesp pFlashSec[]={
{0x10000 /*64k*/, PSM_SYSTEM /*系统文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_FILE /*文件区*/},
{0x10000 /*64k*/, PSM_RESERVED /*系统保留区*/}
};
#endif
//磁盘描述表
TDiskDesp *pDiskDesp; /*磁盘描述表*/
TDiskDesp *pMapDesp; /*磁盘描述表在内存中的镜像*/
//文件分配表
WORD *pDiskFat; /*磁盘文件分配表*/
WORD *pMapFat; /*磁盘文件分配表在内存中的镜像*/
//磁盘目录区入口
TDirectory *pDiskDir; /*磁盘目录区入口*/
TDirectory *pMapDir ; /*磁盘目录区在内存中的镜像*/
STATIC DWORD DiskInit = FALSE;
//打开文件空数据结构链表
STATIC CLink FreeFilePool;
//已经打开的文件链表
STATIC CLink OpenFilePool;
//打开文件缓冲池
STATIC TOpenFile OpenFileBuf[MAX_OPEN_FILE] ;
//写CACHE链表
STATIC CLink WriteCachePool;
//写CACHE池
STATIC TWriteCache WriteCacheBuf[MAX_WRITE_CACHE];
//当前的文件目录
STATIC TDirectory *pCurrentDir;
STATIC BYTE *pDiskMap=NULL; /*磁盘主记录的磁盘镜像首指针*/
STATIC TMapPhSector* pMapSysSec; //描述文件系统头的物理扇区
//是否磁盘被格式化
STATIC DWORD _IsDiskFormat;
//文件系统的物理扇区个数
STATIC DWORD dwSysPhSecNum;
//#define ASSERT(f) ((void*)0)
//初始化FLASH磁盘
#if (__RAM_FILE == YES)
BYTE *pDiskBase=(BYTE*)0x108000;
#endif
unsigned char *WriteFileBuf = NULL;
//调试内存
//BYTE TTest[4000];
/****************************************************************************/
/* 初始化磁盘结构,将磁盘相应区域中的内容复制到磁盘镜像区 */
/* */
/* 磁盘镜像区结构 */
/* */
/* ----------------------------------------------------------------- */
/* | 系统物理扇区描述(只在内存中,用于描述磁盘系统区的物理扇区)| */
/* ----------------------------------------------------------------- */
/* | 磁盘描述区(磁盘描述区在内存中的镜像,pMapDesp) | */
/* ----------------------------------------------------------------- */
/* | 文件分配表(磁盘文件分配表在内存中的镜像,pMapFat) | */
/* ----------------------------------------------------------------- */
/* | 文件目录区(磁盘文件目录区在内存中的镜像,pMapDir) | */
/* ----------------------------------------------------------------- */
/* */
/****************************************************************************/
DWORD InitFlashDisk(DWORD mode)
{
int i;
int phs=0;
DWORD phsecnum=ArraySize(pFlashSec);
DWORD offset=0;
static DWORD sysSize=0;
static DWORD sysOffset=0;
/*
i=0;
printf("%d%d%d", i, ++i, i--);
*/
//初始化打开文件空闲结构链表, ??打开文件时从这里取空节点,链到OpenFilePool??
FreeFilePool.Init();
//初始化打开文件链表
OpenFilePool.Init();
//初始化写CACHE链表
WriteCachePool.Init();
//把打开文件缓冲池中的数据分块链接到打开文件的空表中
for(i=0;i<MAX_OPEN_FILE;i++)
FreeFilePool.AddTail(&OpenFileBuf[i].Node);
//写文件CACHE池中的数据分块链接到写CACHE链表中
for(i=0;i<MAX_WRITE_CACHE;i++)
WriteCachePool.AddTail(&WriteCacheBuf[i].Node);
//统计FLASH物理扇区定义中用于文件系统的物理扇区的个数
dwSysPhSecNum=0;
for(i=0;i<phsecnum;i++)
{
if(pFlashSec[i].dwMode == PSM_SYSTEM)
{
sysSize += pFlashSec[i].dwSize; //sysSize 是系统文件区的大小
dwSysPhSecNum++;
}
}
/*------------------------------------------------------------
将系统文件区的大小从一个物理扇区的Size改为固定16K
( 2001/03/16 , Guowei )
------------------------------------------------------------*/
//{{
sysSize=SYS_SECT_SIZE;
//}}
//分配磁盘镜像的内存块
if( pDiskMap!=NULL )
{
delete pDiskMap;
}
#if (__RAM_FILE == YES)
pDiskMap = new BYTE[dwSysPhSecNum*sizeof(TMapPhSector)];
#else
pDiskMap = new BYTE[sysSize+dwSysPhSecNum*sizeof(TMapPhSector)];
WriteFileBuf = (unsigned char *)malloc(0x10000);
if(WriteFileBuf == NULL)
LogError("init flash disk",FILE_LINE," error!");
#endif
//ASSERT(pDiskMap);
//初始化磁盘镜像的磁盘描述,磁盘目录入口,文件分配表的指针
pMapSysSec = (TMapPhSector*)pDiskMap; //系统物理扇区的描述表??
//磁盘描述表
#if (__RAM_FILE == YES)
pDiskDesp = (TDiskDesp *)(pDiskBase); //对RamDisk而言磁盘描述表没有镜像??
pMapDesp = (TDiskDesp*)(pDiskBase);
#else
pDiskDesp = (TDiskDesp *)FLASH_DISK_BASE; //磁盘描述表??
pMapDesp = (TDiskDesp*)(pMapSysSec + dwSysPhSecNum); //磁盘描述表在内存中的镜像??
#endif
//文件分配表
pMapFat = (WORD*)(pMapDesp +1);
pDiskFat = (WORD*)(pDiskDesp +1);
//计算磁盘参数区和文件分配表所占用的逻辑扇区个数
i=sizeof(TDiskDesp)+FAT_ENTRY_NUM*sizeof(WORD); //144+512*2=1168
i=(i+LOGIC_SECTOR_SIZE-1)/LOGIC_SECTOR_SIZE; //i=2
pMapDir = (TDirectory*)((BYTE*)pMapDesp + i*LOGIC_SECTOR_SIZE);
pDiskDir = (TDirectory*)((BYTE*)pDiskDesp + i*LOGIC_SECTOR_SIZE);
//初始化文件分配表
for(i=0;i<FAT_ENTRY_NUM;i++)
pMapFat[i] = FAT_FREE;
//把磁盘系统区拷贝内存镜像区
memcpy((BYTE*)pMapDesp,(BYTE*)pDiskDesp,sysSize);
/*磁盘未初始化*/
if( (pMapDesp->dwMediaType != FLASH_MEDIA_TYPE) || (mode == FD_FORMAT) )
{
//置磁盘格式化标志
_IsDiskFormat=1;
/*对整个芯片的进行擦除*/
Chip_Erase();
//初始化磁盘镜像区数据
memset((BYTE*)pMapDesp,0xFF,sysSize);
//设置磁盘标志
pMapDesp->dwMediaType = FLASH_MEDIA_TYPE;
//初始化磁盘物理扇区
pMapDesp->nPhSector = phsecnum;
sysOffset = dwSysPhSecNum*sizeof(TMapPhSector);
for(i=0;i<phsecnum;i++)
{
/*设置物理扇区的长度*/
pMapDesp->phSector[i].dwSize = pFlashSec[i].dwSize;
/*设置该物理扇区的起始位置*/
pMapDesp->phSector[i].dwOffset = offset ;//+(BYTE*)pDiskDesp;
/*设置该物理扇区的状态为空闲状态*/
pMapDesp->phSector[i].dwStatus = FAT_FREE;
//设置磁盘镜像区物理扇区控制信息
if(pFlashSec[i].dwMode == PSM_SYSTEM)
{
//该物理扇区在内存磁盘镜像中的偏移量
pMapSysSec[phs].pOffset = sysOffset+pDiskMap;
//该物理扇区的长度
pMapSysSec[phs].dwSize =SYS_SECT_SIZE;// 16*1024; //pFlashSec[i].dwSize;
//该系统文件区的物理扇区编号
pMapSysSec[phs].nSector = i;
//设置该扇区未改变标志
pMapSysSec[phs].wStatus = MS_CHANGE;
sysOffset += pFlashSec[i].dwSize;
phs++;
}
if(pFlashSec[i].dwMode == PSM_RESERVED)
{
pMapDesp->dwBackupSector = i;
pMapDesp->dwBackupSize = pFlashSec[i].dwSize;
}
//设置FAT表信息
SetFatInfo(offset,pFlashSec[i].dwSize,pFlashSec[i].dwMode);
offset += pFlashSec[i].dwSize;
}
//初始化所有目录区分配表为系统保留
for(i=0;i<DIR_FAT_NUM;i++)
pMapDesp->aDirFatTab[i] = FAT_RESERVED;
//计算系统目录区大小
sysSize -= sizeof(TDiskDesp)+sizeof(WORD)*FAT_ENTRY_NUM;
//把所有可分配目录区设置为扇区空闲
for(i=0;i<sysSize/LOGIC_SECTOR_SIZE;i++)
pMapDesp->aDirFatTab[i] = FAT_FREE;
//设置根目录区分配标志
pMapDesp->aDirFatTab[0] = FAT_FILEEND;
//设置逻辑扇区的大小
pMapDesp->nLogicSector = LOGIC_SECTOR_SIZE;
//创建系统缺省目录
DiskInit=TRUE;
pCurrentDir = pMapDir;
make_dir("dat",0);
make_dir("code",0);
make_dir("old",0);
make_dir("temp",0);
//make_dir("maint",0);
//从磁盘镜像区写到磁盘
Map2Disk();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -