⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flashdsk-080.cpp

📁 一个29f800的flash驱动代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/************************************************************************************/
/*                                                                                  */
/*        版权所有(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 + -