📄 flash_dev.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 + -