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

📄 flash_dev.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/*
$Log: flash_dev.c,v $
Revision 1.3  2008/06/21 09:33:12  HSL
增加文件系统PC仿真支持.

Revision 1.2  2008/06/19 04:43:25  Administrator
代码整理!

Revision 1.1.1.1  2008/05/07 04:15:08  Administrator
no message

Revision 1.10  2007/12/24 07:56:10  Lingzhaojun
同步蓝魔版本基本模块

Revision 1.2  2007/12/19 11:46:45  Fangzhenfu
文件系统更新!
修改 FS_GetDiskSizeKB() 返回不对!
FS_fread() 函数文件结束时返回 512 倍数!
FS_fseek() 函数当 seek 超出文件大小时,返回出错!
在 fs_api.c 中对外的 API 函数加入,转入文件句柄的判断!
FS LBL 层 CACHE 的管理!避免非法掉电时,FAT 写入错序!

Revision 1.1.1.1  2007/12/19 09:39:46  Lingzhaojun
no message

Revision 1.9  2007/12/12 02:39:04  Fangzhenfu
文件系统更新! FLASH 底层更新!

Revision 1.8  2007/11/14 08:38:27  Fangzhenfu
文件格式化 BUG 修正!

Revision 1.7  2007/11/07 07:25:50  Fangzhenfu
USB 提速(小文件提速,目前速度写 3M 左右,读 6.5M左右, 4K PAGE FLASH 可到 5M,8M),
文件系统修改!
加入 FLASH 访问时序 API ! 见 flash_dev.h 中
FlashTimingCfg(uint32 Freq) Freq 为总线频率---打包
第一次调用 FlashTimingCfg()时请在 FS_Init() 之后调用,其它在总线频率变化时调用!

Revision 1.6  2007/11/02 02:40:56  Fangzhenfu
文件系统更新!fs_comm.h (V15000)!
文件句柄采用 MALLOC !

Revision 1.5  2007/10/25 11:13:31  Huangshilin
修改 支持 TOUCH_MOVE 消息以及GUI BUG.

Revision 1.4  2007/10/25 08:33:05  Fangzhenfu
上一次提交 USB 模块没有加入编译!
现修改USB相关部分!

Revision 1.3  2007/10/08 02:58:35  Lingzhaojun
添加版本自动注释脚本

*/
#include "../inc/fs_comm.h"

#if defined(BOARD)

#define _IN_FS_FLASH_DEV_
#include "flash_dev.h"

#define FLASH_SYSTEM_FAT_CACHE_COUNT    32
#define FLASH_SYSTEM_FDT_CACHE_COUNT    8
#define FLASH_SYSTEM_DATA_CACHE_COUNT   4

#define FLASH_USER_FAT_CACHE_COUNT    32
#define FLASH_USER_FDT_CACHE_COUNT    8
#define FLASH_USER_DATA_CACHE_COUNT   4

uint8 FlashFatCacheBuf[FLASH_SYSTEM_FAT_CACHE_COUNT][512];
uint8 FlashFdtCacheBuf[FLASH_SYSTEM_FDT_CACHE_COUNT][512];
uint8 FlashDataCacheBuf[FLASH_SYSTEM_DATA_CACHE_COUNT][512];

FS_CACHE_DATA FLASH_FatCacheData[FLASH_SYSTEM_FAT_CACHE_COUNT];
FS_CACHE_DATA FLASH_FdtCacheData[FLASH_SYSTEM_FDT_CACHE_COUNT];
FS_CACHE_DATA FLASH_DataCacheData[FLASH_SYSTEM_DATA_CACHE_COUNT];

FS_CACHE    FlashFatCache = {FLASH_FatCacheData, 0, FLASH_SYSTEM_FAT_CACHE_COUNT};
FS_CACHE    FlashFdtCache = {FLASH_FdtCacheData, 0, FLASH_SYSTEM_FDT_CACHE_COUNT};
FS_CACHE    FlashDataCache = {FLASH_DataCacheData, 0, FLASH_SYSTEM_DATA_CACHE_COUNT};

uint8 FlashUFatCacheBuf[FLASH_USER_FAT_CACHE_COUNT][512];
uint8 FlashUFdtCacheBuf[FLASH_USER_FDT_CACHE_COUNT][512];
uint8 FlashUDataCacheBuf[FLASH_USER_DATA_CACHE_COUNT][512];

FS_CACHE_DATA FLASH_UFatCacheData[FLASH_USER_FAT_CACHE_COUNT];
FS_CACHE_DATA FLASH_UFdtCacheData[FLASH_USER_FDT_CACHE_COUNT];
FS_CACHE_DATA FLASH_UDataCacheData[FLASH_USER_DATA_CACHE_COUNT];

FS_CACHE    FlashUFatCache = {FLASH_UFatCacheData, 0, FLASH_USER_FAT_CACHE_COUNT};
FS_CACHE    FlashUFdtCache = {FLASH_UFdtCacheData, 0, FLASH_USER_FDT_CACHE_COUNT};
FS_CACHE    FlashUDataCache = {FLASH_UDataCacheData, 0, FLASH_USER_DATA_CACHE_COUNT};

#ifdef SETUP
// 080324,huangsl,FOR SETUP工程,标记是否需要低格 FLASH.0:不需要低格,1:需要低格.
uint16      FtlLowFormat;
#endif

int FS_FlashGetStatus(void);
int FS_FlashSysReadSec(uint32 LBA, uint32 SecCount, void *buf);
int FS_FlashSysWriteSec(uint32 LBA, uint32 SecCount, void *buf);
int FS_FlashUserReadSec(uint32 LBA, uint32 SecCount, void *buf);
int FS_FlashUserWriteSec(uint32 LBA, uint32 SecCount, void *buf);
int FS_FlashSysIoCtl(uint32 cmd, uint32 arg, void *buf);
int FS_FlashUserIoCtl(uint32 cmd, uint32 arg, void *buf);
int FS_FlashSysMediumInit(void);
int FS_FlashUserMediumInit(void);
void FlashSysCacheInit(void);
void FlashUserCacheInit(void);

const FS_DEVICE_TYPE FS_FlashSysDevice =
{
    "C:\\",
    "SysDisk",
    FS_FlashGetStatus,
    FS_FlashSysReadSec,
    FS_FlashSysWriteSec,
    FS_FlashSysIoCtl,
    FS_FlashSysMediumInit,
    &FlashFatCache,
    &FlashFdtCache,
    &FlashDataCache
};

const FS_DEVICE_TYPE FS_FlashUserDevice =
{
    "D:\\",
    "Flash",
    FS_FlashGetStatus,
    FS_FlashUserReadSec,
    FS_FlashUserWriteSec,
    FS_FlashUserIoCtl,
    FS_FlashUserMediumInit,
    &FlashUFatCache,
    &FlashUFdtCache,
    &FlashUDataCache
};

int FS_FlashGetStatus(void)
{
    return(0);
}

int FS_FlashSysReadSec(uint32 LBA, uint32 SecCount, void *buf)
{
    return(FlashReadSecs(0, LBA, buf, SecCount));
}

int FS_FlashUserReadSec(uint32 LBA, uint32 SecCount, void *buf)
{
    return(FlashReadSecs(1, LBA, buf, SecCount));
}

int FS_FlashSysWriteSec(uint32 LBA, uint32 SecCount, void *buf)
{
    return(FlashWriteSecs(0, LBA, buf, SecCount));
}

int FS_FlashUserWriteSec(uint32 LBA, uint32 SecCount, void *buf)
{
    return(FlashWriteSecs(1, LBA, buf, SecCount));
}

int FS_FlashSysIoCtl(uint32 cmd, uint32 arg, void *buf)
{
    uint32 *rbuf;
    rbuf = (uint32 *)buf;
    switch (cmd)
    {
        case IO_CTL_GET_CAPACITY:
            *rbuf = GetCapacity(DISK_SYS);
            break;
        case IO_CTL_GET_MEDIUM_START_SEC:
            *rbuf = 0;
            break;
        case IO_CTL_CACHE_WRITE_BACK:
            FlashCacheCloseAll();
            break;
        case IO_CTL_FLUSH_CACHE:
            FlashSysCacheInit();
            break;
        default:
            break;
    }
    return(0);
}

int FS_FlashUserIoCtl(uint32 cmd, uint32 arg, void *buf)
{
    uint32 *rbuf;
    rbuf = (uint32 *)buf;
    switch (cmd)
    {
        case IO_CTL_GET_CAPACITY:
            *rbuf = GetCapacity(DISK_FLASH);
            break;
        case IO_CTL_GET_MEDIUM_START_SEC:
            *rbuf = 0;  /* 用户盘的开始为SYSTEM盘的大小 */
            break;
        case IO_CTL_CACHE_WRITE_BACK:
            FlashCacheCloseAll();
            break;
        case IO_CTL_FLUSH_CACHE:
            FlashUserCacheInit();
            break;
        default:
            break;
    }
    return(0);
}

void FlashSysCacheInit(void)
{
    uint32 i;
    FS_CACHE_DATA *pCache;

    pCache = FlashFatCache.pCacheData;

    for (i = 0; i < FLASH_SYSTEM_FAT_CACHE_COUNT; i++)
    {
        pCache->flag     = 0;
        pCache->pBuffer  = &FlashFatCacheBuf[i][0];
        pCache->SectorNo = 0xFFFFFFFF;
        pCache++;
    }

    pCache = FlashFdtCache.pCacheData;

    for (i = 0; i < FLASH_SYSTEM_FDT_CACHE_COUNT; i++)
    {
        pCache->flag     = 0;
        pCache->pBuffer  = &FlashFdtCacheBuf[i][0];
        pCache->SectorNo = 0xFFFFFFFF;
        pCache++;
    }

    pCache = FlashDataCache.pCacheData;

    for (i = 0; i < FLASH_SYSTEM_DATA_CACHE_COUNT; i++)
    {
        pCache->flag     = 0;
        pCache->pBuffer  = &FlashDataCacheBuf[i][0];
        pCache->SectorNo = 0xFFFFFFFF;
        pCache++;
    }
}
int FS_FlashSysMediumInit(void)
{
    int err = 0;
    FlashSysCacheInit();
    if (ERROR == FlashInit())
    {
        err = ERROR;
    }
    else
    {
#ifdef SETUP
        FtlLowFormat = 0;
#endif
        if (GetRemapTbl() != OK)
        {

#ifdef SETUP
            //080324,huangsl,考虑升级情况,此时 二级LOADER里面的 FTL版本好 与 FTL_VERSION 不匹配.
            //如果此时返回 ERROR,直接低格,则系统重启之后,LOADER 会再次把 FLASH低格回以前的版本
            //因此必须首先升级完 二级LOADER 之后才能低格 FLASH.这样 LOADER的版本和FLASH的版本才一致.
            //return (ERROR);
            FtlLowFormat = 1;
#else
            LowFormat(1);
#endif

        }
        err = OK;
    }
    return(err);
}

void FlashUserCacheInit(void)
{
    uint32 i;
    FS_CACHE_DATA *pCache;

    pCache = FlashUFatCache.pCacheData;

    for (i = 0; i < FLASH_USER_FAT_CACHE_COUNT; i++)
    {
        pCache->flag     = 0;
        pCache->pBuffer  = &FlashUFatCacheBuf[i][0];
        pCache->SectorNo = 0xFFFFFFFF;
        pCache++;
    }

    pCache = FlashUFdtCache.pCacheData;

    for (i = 0; i < FLASH_USER_FDT_CACHE_COUNT; i++)
    {
        pCache->flag     = 0;
        pCache->pBuffer  = &FlashUFdtCacheBuf[i][0];
        pCache->SectorNo = 0xFFFFFFFF;
        pCache++;
    }

    pCache = FlashUDataCache.pCacheData;

    for (i = 0; i < FLASH_USER_DATA_CACHE_COUNT; i++)
    {
        pCache->flag     = 0;
        pCache->pBuffer  = &FlashUDataCacheBuf[i][0];
        pCache->SectorNo = 0xFFFFFFFF;
        pCache++;
    }
}

int FS_FlashUserMediumInit(void)
{
    FlashUserCacheInit();
    return(0);
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -